Example #1
0
    def c1_test(self, plot=True):
        """
        Plot the reconstructed Neumann data, as approximated by a Chebyshev
        expansion. If the Chebyshev expansion shows "spikes" near the
        interfaces of the segments, something is probably wrong.
        """
        sample = self.get_boundary_sample()

        do_exact = hasattr(self.problem, 'eval_d_u_outwards')

        s_data = np.zeros(len(sample))
        expansion_data = np.zeros(len(sample))

        if do_exact:
            exact_data = np.zeros(len(sample))

        for l in range(len(sample)):
            p = sample[l]
            s_data[l] = p['s']

            if do_exact:
                exact_data[l] = self.problem.eval_d_u_outwards(p['arg'], p['sid']).real

            r, th = domain_util.cart_to_polar(p['x'], p['y'])
            sid = domain_util.get_sid(self.a, th)

            if sid == 0:
                arg = th
            else:
                arg = r

            for JJ in range(len(self.B_desc)):
                expansion_data[l] +=\
                    (self.c1[JJ] *
                    self.eval_dn_B_arg(0, JJ, arg, sid)).real

        import matplotlib.pyplot as plt

        if do_exact:
            error = np.max(np.abs(exact_data - expansion_data))
            print('c1 error: {}'.format(error))

            plt.plot(s_data, exact_data, linewidth=5, color='#BBBBBB', label='Exact')

        if not plot:
            return

        plt.plot(s_data, expansion_data, label='Expansion')
        plt.legend(loc=2)
        #plt.ylim(-1.5, 1.5)
        plt.title('c1')
        plt.xlabel('Arclength s')
        plt.ylabel('Reconstructed Neumann data')
        plt.show()
Example #2
0
    def c0_test(self, plot=True):
        """
        Plot the Dirichlet data along with its Chebyshev expansion. If there
        is more than a minor difference between the two, something is wrong.
        """
        k = self.k
        a = self.a
        nu = self.nu

        sample = self.get_boundary_sample()

        s_data = np.zeros(len(sample))
        exact_data = np.zeros(len(sample))
        expansion_data = np.zeros(len(sample))

        exact_data_outer = []
        expansion_data_outer = []

        for l in range(len(sample)):
            p = sample[l]
            s_data[l] = p['s']

            r, th = domain_util.cart_to_polar(p['x'], p['y'])
            sid = domain_util.get_sid(self.a, th)

            exact_data[l] = self.problem.eval_bc(p['arg'], sid).real

            if sid == 0:
                arg = th
            else:
                arg = r

            for JJ in range(len(self.B_desc)):
                expansion_data[l] +=\
                    (self.c0[JJ] *
                    self.eval_dn_B_arg(0, JJ, arg, sid)).real

            if sid == 0:
                exact_data_outer.append(exact_data[l])
                expansion_data_outer.append(expansion_data[l])

        exact_data_outer = np.array(exact_data_outer)
        expansion_data_outer = np.array(expansion_data_outer)
        print('c0 error outer:', np.max(np.abs(exact_data_outer - expansion_data_outer)))

        print('c0 error:', np.max(np.abs(exact_data - expansion_data)))




        #for l in range(len(exact_data)):
        #    diff = abs(exact_data[l] - expansion_data[l])
        #    if diff > .06:
        #        print(sample[l], 'diff:', diff)

        if not plot:
            return

        import matplotlib.pyplot as plt

        plt.plot(s_data, exact_data, linewidth=5, color='#BBBBBB', label='Exact')
        plt.plot(s_data, expansion_data, label='Expansion')

        plt.legend(loc=0)
        plt.title('c0')
        plt.xlabel('Arclength s')
        plt.ylabel('Dirichlet data')
        plt.show()