TransWikia.com

Numerical solution of the advection equation with Crank–Nicolson finite difference method

Computational Science Asked by Winabryr on February 14, 2021

I need to implement a numerical scheme for the solution of the one-dimensional advection equation
$$\frac{partial u}{partial t} + C(x, t) frac{partial u}{partial x} = 0 \\$$
$$ \ C(x,t) = frac{picos(2 pi t) + 3.5}{2pi – pisin(pi x)} \\$$
$$\ 0 leq x leq 1, quad 0 leq t leq 1\\$$

with Crank–Nicolson finite difference method
$$\ frac{u^{j + 1}_{k} – u^{j}_{k}}{tau} + frac{C}{4h}(u^{j + 1}_{k + 1} – u^{j + 1}_{k – 1} + u^{j}_{k + 1} – u^{j}_{k – 1}) = 0\\$$
and boundary conditions
$$\ phi(x) = u(x,0), quad psi_{0}(t) = u(0,t), quad psi_{1}(t) = u(1, t) \\$$

it’s known that the exact solution has the following form
$$\ U(x,t) = cos(pi x) – frac{1}{2}sin(2 pi t) + 2pi x – 3.5t\\$$

The numerical solution on each layer in time is found as the solution of a system of linear equations with a tridiagonal matrix
$$\ Au = b \\$$
$$\ A =
begin{pmatrix}
1 & frac{Ctau}{4h} & 0 & …\
-frac{Ctau}{4h} & 1 & frac{Ctau}{4h} & … \
0 & -frac{Ctau}{4h} & 1 & … \
… & … & … & …
end{pmatrix}\\$$

I’ve write a simple python script, but the result doesn’t match the theory:

I’m sure I’m wrong somewhere, but I don’t see where.
Thanks!

One Answer

Some remarks about the code, perhaps cleaning these up already solves the question, especially the initialization error:

Floating point errors are a thing, so if you want to get the expected results, give some wiggle room (0.01 is arbitrary, I would not expect defects above 1e-12 in this place)

  N = int((x1 - x0) / h + 0.01)
  M = int((t1 - t0) / tau + 0.01)

There is no guarantee that $N·h=x_1-x_0$ etc., so force this grid condition

h = (x1 - x0) / N
tau = (t1 - t0) / M

There is a honest error in the side boundary initialization, the space component is always first

    u[0, i] = psi_0(i * tau)
    u[N, i] = psi_1(i * tau)

The implicit trapezoidal method that is the method in time direction of C-N reads as $$ frac{y^{j+1}-y^j}{tau}=frac{F(t^j,y^j)+F(t^{j+1},y^{j+1})}2. $$ Accordingly, the coefficients a_h for the banded matrix should be computed at time (j+1)*tau to get the correct order $O(tau^2+h^2)$ of the method.

Answered by Lutz Lehmann on February 14, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP