# Right-hand side: f = lambda x: 0 * x # Exact solution: z = 2 * np.exp(x**2 / 2) J1 = jv(1, z) Y1 = yv(1, z) C2 = (np.exp(-b**2 / 2) * d - np.exp(-a**2 / 2) * c * J1[-1] / J1[0]) C2 = C2 / (Y1[-1] - Y1[0] * J1[-1] / J1[0]) C1 = (np.exp(-a**2 / 2) * c - C2 * Y1[0]) / J1[0] uex = np.exp(x**2 / 2) * (C1 * J1 + C2 * Y1) # Assemble matrices: O(n^2) complexity because of feval. start = time.time() D1 = diffmat(n, 1, [a, b]) D2 = diffmat(n, 2, [a, b]) S0 = spconvert(n, 0) S1 = spconvert(n, 1) M0 = multmat(n, a0, [a, b], 0) M1 = multmat(n, a1, [a, b], 1) M2 = multmat(n, a2, [a, b], 2) L = M2 @ D2 + S1 @ M1 @ D1 + S1 @ S0 @ M0 L = lil_matrix(L) for k in range(n): T = np.zeros(n) T[k] = 1 L[-2, k] = feval(T, 2 / (b - a) * x0 - (a + b) / (b - a)) L[-1, k] = feval(T, 2 / (b - a) * x1 - (a + b) / (b - a)) L = csr_matrix(L) plt.figure()
g1 = lambda z: uex(r0, z) # u(r0, z) = g1(z) g2 = lambda z: uex(r1, z) # u(r1, z) = g2(z) h1 = lambda r: uex(r, z0) # u(r, z0) = h1(r) h2 = lambda r: uex(r, z1) # u(r, z1) = h2(r) # Grid points: n = 100 r = chebpts(n, [ra, rb]) z = chebpts(n, [za, zb]) R, Z = np.meshgrid(r, z) # Assemble differentiation matrices: start = time.time() S0 = spconvert(n, 0) S1 = spconvert(n, 1) D1r = diffmat(n, 1, [ra, rb]) D2r = diffmat(n, 2, [ra, rb]) D2z = diffmat(n, 2, [za, zb]) M0 = multmat(n, lambda r: r, [ra, rb], 0) M2 = multmat(n, lambda r: r, [ra, rb], 2) A1 = S1 @ S0 C1 = M2 @ D2r - S1 @ D1r A2 = D2z C2 = S1 @ S0 @ M0 # Assemble boundary conditions: Bx = np.zeros([2, n]) By = np.zeros([2, n]) G = np.zeros([2, n]) H = np.zeros([2, n]) for k in range(n):
eps = 1e-4 ai, aip, bi, bip = airy(eps**(-1 / 3) * x) # Boundary conditions: c = ai[0] d = ai[-1] # Right-hand side: f = lambda x: 0 * x # Exact solution: uex = ai # Assemble matrices: start = time.time() D2 = diffmat(n, 2) S0 = spconvert(n, 0) S1 = spconvert(n, 1) M = multmat(n, lambda x: -x) L = eps * D2 + S1 @ S0 @ M L = lil_matrix(L) L[-2, :] = (-1)**np.arange(0, n) L[-1, :] = np.ones(n) L = csr_matrix(L) plt.figure() plt.spy(L) # Assemble RHS: F = vals2coeffs(f(x)) F = S1 @ S0 @ F F[-2] = c
g2 = lambda y: uex(+1, y) # u(+1, y) = g2(y) h1 = lambda x: uex(x, -1) # u(x, -1) = h1(x) h2 = lambda x: uex(x, +1) # u(x, +1) = h2(x) # Grid points: n = 100 x = chebpts(n) y = chebpts(n) X, Y = np.meshgrid(x, y) # Assemble differentiation matrices: start = time.time() S0 = spconvert(n, 0) S1 = spconvert(n, 1) A1 = S1 @ S0 C1 = diffmat(n, 2) + K**2 * S1 @ S0 A2 = diffmat(n, 2) C2 = S1 @ S0 # Assemble boundary conditions: Bx = np.zeros([2, n]) By = np.zeros([2, n]) G = np.zeros([2, n]) H = np.zeros([2, n]) for k in range(n): T = np.zeros(n) T[k] = 1 Bx[0, k] = feval(T, -1) By[0, k] = feval(T, -1) Bx[1, k] = feval(T, 1) By[1, k] = feval(T, 1)
g2 = lambda y: uex(+1, y) # u(+1, y) = g2(y) h1 = lambda x: uex(x, -1) # u(x, -1) = h1(x) h2 = lambda x: uex(x, +1) # u(x, +1) = h2(x) # Grid points: n = 100 x = chebpts(n) y = chebpts(n) X, Y = np.meshgrid(x, y) # Assemble differentiation matrices: start = time.time() S0 = spconvert(n, 0) S1 = spconvert(n, 1) A1 = S1 @ S0 C1 = diffmat(n, 2) A2 = diffmat(n, 2) C2 = S1 @ S0 # Assemble boundary conditions: Bx = np.zeros([2, n]) By = np.zeros([2, n]) G = np.zeros([2, n]) H = np.zeros([2, n]) for k in range(n): T = np.zeros(n) T[k] = 1 Bx[0, k] = feval(T, -1) By[0, k] = feval(T, -1) Bx[1, k] = feval(T, 1) By[1, k] = feval(T, 1)
# Function: w = 100 f = lambda x: np.cos(w * x) dfex = lambda x: -w * np.sin(w * x) # Grid: n = 4 * w dom = [-1, 1] x = chebpts(n, dom) # Compute coeffs of f: F = vals2coeffs(f(x)) # Differentiation matrix in coefficient space: start = time.time() D = diffmat(n, 1, dom) end = time.time() print(f'Time (setup): {end-start:.5f}s') plt.figure() plt.spy(D) # Differentiate: start = time.time() DF = D @ F end = time.time() print(f'Time (product): {end-start:.5f}s') # Exact coefficients S0 = spconvert(n, 0) DFex = S0 @ vals2coeffs(dfex(x))