# 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()
示例#2
0
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):
示例#3
0
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
示例#4
0
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))