講義のページ/Pythonのお勉強/シミュレーション-2Leap Frog法と4次のRunge-Kutta法
をテンプレートにして作成
[
トップ
] [
新規
| |
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#topicpath
** 数値計算法 [#j01c23d1]
*** お題 [#ke057a34]
- シミューレートする方程式
$$ \begin{eqnarray} \frac{dx}{dt} & = & v \\ \frac{dv}{dt...
*** Euler 法 [#vf8465e4]
- 概要~
普通に差分化して計算する方法はオイラー法と呼ばれている。
#code(python){{
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]
}}
ところが、これを実行すると発散する。
#code(python){{
x0 = [2,3]
for i in range(10000):
x1 <- Euler(x0)
x0 <- x1
print x0
}}
- [[Google Colaboratory でのプログラムと実行結果>https://...
*** Leap Frog 法 [#d94c05bb]
- 概要~
$$ \begin{eqnarray} x_{n+1} &=& x_n + v_{n+1/2} \times {\...
となり、$ \Delta t^2 $の項が消える。これは、
$$ \begin{eqnarray} x_{n+1} &=& x_{n+1/2} + x'_{n+1/2} \f...
の2式の間で引き算することで得られる。より高次の項は、$ \D...
&ref(IMG_3128.jpg,,30%);
- コード~
この計算では発散しない。
#code(python){{
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 でのプログラムと実行結果>https://...
*** 4次の Runge-Kutta法 [#fd5f0bac]
- 参考URL~
-- [[倭算数理研究所>https://wasan.hatenablog.com/entry/20...
- 概要~
$$ \begin{eqnarray} \frac{dx}{dt} &=& f(x) \\ x_{n+1} & =...
- コード~
#code(Python){{
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 でのプログラムと実行結果>https://...
終了行:
#topicpath
** 数値計算法 [#j01c23d1]
*** お題 [#ke057a34]
- シミューレートする方程式
$$ \begin{eqnarray} \frac{dx}{dt} & = & v \\ \frac{dv}{dt...
*** Euler 法 [#vf8465e4]
- 概要~
普通に差分化して計算する方法はオイラー法と呼ばれている。
#code(python){{
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]
}}
ところが、これを実行すると発散する。
#code(python){{
x0 = [2,3]
for i in range(10000):
x1 <- Euler(x0)
x0 <- x1
print x0
}}
- [[Google Colaboratory でのプログラムと実行結果>https://...
*** Leap Frog 法 [#d94c05bb]
- 概要~
$$ \begin{eqnarray} x_{n+1} &=& x_n + v_{n+1/2} \times {\...
となり、$ \Delta t^2 $の項が消える。これは、
$$ \begin{eqnarray} x_{n+1} &=& x_{n+1/2} + x'_{n+1/2} \f...
の2式の間で引き算することで得られる。より高次の項は、$ \D...
&ref(IMG_3128.jpg,,30%);
- コード~
この計算では発散しない。
#code(python){{
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 でのプログラムと実行結果>https://...
*** 4次の Runge-Kutta法 [#fd5f0bac]
- 参考URL~
-- [[倭算数理研究所>https://wasan.hatenablog.com/entry/20...
- 概要~
$$ \begin{eqnarray} \frac{dx}{dt} &=& f(x) \\ x_{n+1} & =...
- コード~
#code(Python){{
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 でのプログラムと実行結果>https://...
ページ名: