def test_lag1st_to_trig(self): # scalar case dest_weight = core.change_projection_base(self.src_weights, self.src_test_funcs, self.trig_test_funcs[0]) dest_approx_handle_s = core.back_project_from_base(dest_weight, self.trig_test_funcs[0]) # standard case dest_weights = core.change_projection_base(self.src_weights, self.src_test_funcs, self.trig_test_funcs) dest_approx_handle = core.back_project_from_base(dest_weights, self.trig_test_funcs) error = np.sum(np.power( np.subtract(self.real_func_handle(self.z_values), dest_approx_handle(self.z_values)), 2)) if show_plots: pw = pg.plot(title="change projection base") i1 = pw.plot(x=self.z_values, y=self.real_func_handle(self.z_values), pen="r") i2 = pw.plot(x=self.z_values, y=self.src_approx_handle(self.z_values), pen=pg.mkPen("g", style=pg.QtCore.Qt.DashLine)) i3 = pw.plot(x=self.z_values, y=dest_approx_handle_s(self.z_values), pen="b") i4 = pw.plot(x=self.z_values, y=dest_approx_handle(self.z_values), pen="c") legend = pw.addLegend() legend.addItem(i1, "f(x) = x") legend.addItem(i2, "2x Lagrange1st") legend.addItem(i3, "sin(x)") legend.addItem(i4, "sin(wx) with w in [1, {0}]".format(dest_weights.shape[0])) app.exec_() # should fit pretty nice self.assertLess(error, 1e-2)
def test_back_projection_from_lagrange_1st(self): vec_real_func = np.vectorize(self.funcs[1]) real_weights = vec_real_func(self.nodes) approx_func = core.back_project_from_base(real_weights, self.initial_functions) approx_func_dz = core.back_project_from_base(real_weights, get_base("ini_funcs", 1)) self.assertTrue(np.allclose(approx_func(self.z_values), vec_real_func(self.z_values))) if show_plots: # lines should match exactly pw = pg.plot(title="back projected linear function") pw.plot(x=self.z_values, y=vec_real_func(self.z_values), pen="r") pw.plot(x=self.z_values, y=approx_func(self.z_values), pen="g") pw.plot(x=self.z_values, y=approx_func_dz(self.z_values), pen="b") app.exec_()
def setUp(self): # real function self.z_values = np.linspace(0, 1, 1000) self.real_func = core.Function(lambda x: x) self.real_func_handle = np.vectorize(self.real_func) # approximation by lag1st self.nodes, self.src_test_funcs = shapefunctions.cure_interval(shapefunctions.LagrangeFirstOrder, (0, 1), node_count=2) register_base("test_funcs", self.src_test_funcs, overwrite=True) self.src_weights = core.project_on_base(self.real_func, self.src_test_funcs) self.assertTrue(np.allclose(self.src_weights, [0, 1])) # just to be sure self.src_approx_handle = core.back_project_from_base(self.src_weights, self.src_test_funcs) # approximation by sin(w*x) def trig_factory(freq): def func(x): return np.sin(freq*x) return func self.trig_test_funcs = np.array([core.Function(trig_factory(w), domain=(0, 1)) for w in range(1, 3)])