また、代数方程式は添字を用いて以下のように記述することが多い。以降は以下の表記を使用する。
放射性物質の原子核数の時間変化
以下の常微分方程式で表すことができる。
差分法を用いると以下のとおりとなる。
この式より
前出の常微分方程式は厳密解(数値計算を用いずに解析的に得られる解。解析解とも呼ばれる)を求めることができる。
導入過程は省略するとが、変数分離を用いて式変形することにより下式が得られる。
本式による計算結果と数値計算の結果を比較することにより計算の妥当性を評価することができる。
導出した代数方程式を用いて数値解析を実施する。
計算条件は、
import numpy as np
import matplotlib.pyplot as plt
N0 = 100
k = 1.0
exact = lambda T: N0 * np.exp(-k*T)
def simulation(T):
N = np.zeros_like(T)
N[0] = N0
for i in range(1, len(N)):
N[i] = N[i-1] - dt*k*N[i-1]
return N
def mkfig(ax, T):
ax.plot(T, exact(T),label='exact')
ax.plot(T, simulation(T),label='simulation')
ax.set_xlabel('T')
ax.set_ylabel('N')
ax.legend(loc = 'upper right')
dt = 0.1
T = np.arange(0, 20, dt)
fig, ax = plt.subplots()
mkfig(ax, T)
dt = 0.5
T = np.arange(0, 20, dt)
fig, ax = plt.subplots()
mkfig(ax, T)
dt = 1.0
T = np.arange(0, 20, dt)
fig, ax = plt.subplots()
mkfig(ax, T)
dt = 1.5
T = np.arange(0, 20, dt)
fig, ax = plt.subplots()
mkfig(ax, T)
import numpy as np
import matplotlib.pyplot as plt
N0 = 100
k = 1.0
exact = lambda T: N0 * np.exp(-k*T)
def simulation2(T):
N = np.zeros_like(T)
N[0] = N0
for i in range(1, len(N)):
N[i] = N[i-1]/(1+dt*k)
return N
def mkfig2(ax, T):
ax.plot(T, exact(T),label='exact')
ax.plot(T, simulation2(T),label='simulation')
ax.set_xlabel('T')
ax.set_ylabel('N')
ax.legend(loc = 'upper right')
dt = 1.5
T = np.arange(0, 20, dt)
fig, ax = plt.subplots()
mkfig2(ax, T)
移流とは下図のようにある物理量が流れによって運ばれる現象を示す。この現象を計算対象とする。
以下の偏微分方程式で表すことができる。
今回は3つの差分スキームを使用する。
この式より
なお、境界条件も必要であるが今回は境界付近を計算しないため0とする。
一次元の移流方程式は条件によって厳密解を得ることができる。
導出した代数方程式を用いて数値解析を実施する。
計算条件は、
import numpy as np
import matplotlib.pyplot as plt
c = 1.0
X = np.linspace(-5,5,101)
dx = 0.1
exact = lambda t: np.exp(-(X-c*t)**2)
def s01(dt): #前進差分
unew = exact(0)
for _ in range(int(2/dt)):
u = unew.copy()
for i in range(1,len(u)-1):
unew[i] = u[i] - c * dt/dx * (u[i+1]-u[i])
return unew
def s02(dt): #後退差分
unew = exact(0)
for _ in range(int(2/dt)):
u = unew.copy()
for i in range(1,len(u)-1):
unew[i] = u[i] - c * dt/dx * (u[i]-u[i-1])
return unew
def s03(dt): #中心差分
unew = exact(0)
for _ in range(int(2/dt)):
u = unew.copy()
for i in range(1,len(u)-1):
unew[i] = u[i] - c * dt/dx * (u[i+1]-u[i-1])/2
return unew
適切な解を得ることができない。
波形が拡散してピークが減衰する。
若干の差異はあるが他の差分スキームと比較すると厳密解に近い結果になっている。
一次元移流方程式の陰解法は前出の常微分方程式と比べてかなり複雑な式形となる。
例として陰解法で中心差分の代数方程式を導出すると次式となる。
上式のみでは、
左辺の対角行列の逆行列を計算することにより、
ここでは計算は省力するが、陰解法は陽解法と比べて煩雑な計算が必要となることが理解できる。
補足として、上式の左辺の1つ目の行列は三重対角行列となっており、TDMA法を用いて少ない計算ステップ数で逆行列を求めることができる。この方法は不等流計算の平均流速公式レベル3の解法でも使用する。
一般的に精度と安定性は両立しない。目的に応じて差分スキームを選択する必要がある。
⇒ 今回の勉強で実施する不等流計算、貯留関数法では、差分スキームはそれほど重要ではないが
⇒ 不定流計算などを実施する場合は、差分スキームが重要
<img src="https://raw.githubusercontent.com/computational-sediment-hyd/NonUniformFlowModelUsingPython/main/00_orientation/ref/p001.svg" alt="fig" title="fig" width="400">
<img src="https://i0.wp.com/studyphys.com/wp-content/uploads/2018/12/tiny_half-life_v1.png?resize=1024%2C842&ssl=1" alt="fig" title="fig" width="500">