数値計算法 †
お題 †
Euler 法 †
- 概要
普通に差分化して計算する方法はオイラー法と呼ばれている。
1
2
3
4
5
6
7
8
9
10
|
| def Euler(x) :
xn = x[0]
vn = x[1]
dt = 0.01
k = 3
xnn = xn + vn * dt
vnn = vn - k * dt * xn
return [xnn, vnn]
|
ところが、これを実行すると発散する。
1
2
3
4
5
6
|
| x0 = [2,3]
for i in range(10000):
x1 <- Euler(x0)
x0 <- x1
print x0
|
- Google Colaboratory でのプログラムと実行結果
Leap Frog 法 †
- 概要
となり、の項が消える。これは、
の2式の間で引き算することで得られる。より高次の項は、 から始まる。
- コード
この計算では発散しない。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
| def LeapFrog(x) :
xn = x[0]
vn = x[1]
dt = 0.01
k = 3
xnn = xn + vn * dt
vnn = vn - k * dt * xnn
return [xnn, vnn]
x0 = [2,3]
for i in range(100000):
x1 = LeapFrog(x0)
x0 = x1
print(x0)
|
- Google Colaboratory でのプログラムと実行結果
4次の Runge-Kutta法 †
- 参考URL
- 概要
- コード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
| def RungeKutta(x):
xn = x[0]
vn = x[1]
dt = 0.01
k = 3
k1x = vn
k1v = -k * xn
k2x = vn + 0.5 * dt * k1v
k2v = -k * (xn + 0.5 * dt * k1x)
k3x = vn + 0.5 * dt * k2v
k3v = -k * (xn + 0.5 * dt * k2x)
k4x = vn + dt * k3v
k4v = -k * (xn + dt * k3x)
xnn = xn + (dt / 6.0) * (k1x + 2 * k2x + 2 * k3x + k4x)
vnn = vn + (dt / 6.0) * (k1v + 2 * k2v + 2 * k3v + k4v)
return [xnn, vnn]
x0 = [2, 3]
for i in range(10000):
x1 = RungeKutta(x0)
x0 = x1
print(x0)
|
- Google Colaboratory でのプログラムと実行結果