def test_Biharmonic(quad): M = 128 SB = ShenBiharmonicBasis(M, quad=quad) x = Symbol("x") u = sin(6*pi*x)**2 a = 1.0 b = 1.0 f = -u.diff(x, 4) + a*u.diff(x, 2) + b*u ul = lambdify(x, u, 'numpy') fl = lambdify(x, f, 'numpy') points, _ = SB.points_and_weights(M) uj = ul(points) fj = fl(points) A = inner_product((SB, 0), (SB, 4)) B = inner_product((SB, 0), (SB, 0)) C = inner_product((SB, 0), (SB, 2)) AA = -A.diags() + C.diags() + B.diags() f_hat = np.zeros(M) f_hat = SB.scalar_product(fj, f_hat) u_hat = np.zeros(M) u_hat[:-4] = la.spsolve(AA, f_hat[:-4]) u1 = np.zeros(M) u1 = SB.backward(u_hat, u1) #from IPython import embed; embed() assert np.allclose(u1, uj)
def assemble(self): N = self.N SB = ShenBiharmonicBasis(N, quad=self.quad) SB.plan((N, N), 0, np.float, {}) x, w = self.x, self.w = SB.points_and_weights(N) V = SB.vandermonde(x) # Trial function P4 = SB.get_vandermonde_basis(V) # Second derivatives T2x = SB.get_vandermonde_basis_derivative(V, 2) # (u'', v) K = np.zeros((N, N)) K[:-4, :-4] = inner_product((SB, 0), (SB, 2)).diags().toarray() # ((1-x**2)u, v) xx = np.broadcast_to((1 - x**2)[:, np.newaxis], (N, N)) #K1 = np.dot(w*P4.T, xx*P4) # Alternative: K1 = np.dot(w*P4.T, ((1-x**2)*P4.T).T) K1 = np.zeros((N, N)) K1 = SB.scalar_product(xx * P4, K1) K1 = extract_diagonal_matrix( K1).diags().toarray() # For improved roundoff # ((1-x**2)u'', v) K2 = np.zeros((N, N)) K2 = SB.scalar_product(xx * T2x, K2) K2 = extract_diagonal_matrix( K2).diags().toarray() # For improved roundoff # (u'''', v) Q = np.zeros((self.N, self.N)) Q[:-4, :-4] = inner_product((SB, 0), (SB, 4)).diags().toarray() # (u, v) M = np.zeros((self.N, self.N)) M[:-4, :-4] = inner_product((SB, 0), (SB, 0)).diags().toarray() Re = self.Re a = self.alfa B = -Re * a * 1j * (K - a**2 * M) A = Q - 2 * a**2 * K + a**4 * M - 2 * a * Re * 1j * M - 1j * a * Re * ( K2 - a**2 * K1) return A, B