【问题标题】:Runge-Kutta 4th order method to solve second-order ODES求解二阶 ODES 的龙格-库塔四阶方法
【发布时间】:2019-02-19 10:04:14
【问题描述】:

我正在尝试做一个简单的谐振子示例,它将通过 Runge-Kutta 4 阶方法解决。待求解的二阶常微分方程(ODE)及初始条件为:

y'' + y = 0

y(0) = 0 和 y'(0) = 1/pi

范围在 0 到 1 之间,有 100 步。我将我的二阶 ODE 分成两个一阶 ODE,使用 u 作为辅助变量:

y' = u

u' = -y

解析解是正弦y(x) = (1/pi)^2 sin(pi*x)。

我的 Python 代码如下:

from math import pi
from numpy import arange
from matplotlib.pyplot import plot, show

# y' = u
# u' = -y

def F(y, u, x):
    return -y

a = 0
b = 1.0
N =100
h = (b-a)/N

xpoints = arange(a,b,h)
ypoints = []
upoints = []

y = 0.0
u = 1./pi 

for x in xpoints:
    ypoints.append(y)
    upoints.append(u)

    m1 = h*u
    k1 = h*F(y, u, x)  #(x, v, t)

    m2 = h*(u + 0.5*k1)
    k2 = h*F(y+0.5*m1, u+0.5*k1, x+0.5*h)

    m3 = h*(u + 0.5*k2)
    k3 = h*F(y+0.5*m2, u+0.5*k2, x+0.5*h)

    m4 = h*(u + k3)
    k4 = h*F(y+m3, u+k3, x+h)

    y += (m1 + 2*m2 + 2*m3 + m4)/6
    u += (k1 + 2*k2 + 2*k3 + k4)/6

plot(xpoints, ypoints)
show()

已按照 LutzL 的建议更正了所有代码。请参阅下面的 cmets。

代码正在运行,但我的数值解与解析解不匹配。我制作了一个图表,显示了以下两种解决方案。我在互联网上将我的脚本与其他一些代码 (https://math.stackexchange.com/questions/721076/help-with-using-the-runge-kutta-4th-order-method-on-a-system-of-2-first-order-od) 进行了比较,但我看不到错误。在链接中,有两个代码,一个 Matlab 代码和一个 Fortran 代码。即使那样,我也找不到我的错误。谁能帮帮我?

【问题讨论】:

标签: python ode runge-kutta


【解决方案1】:

我的代码是正确的。解析解是错误的。正确的分析答案是

sin(x)/pi

正如 LutzL 指出的那样。下面,可以看到解析解和数值解。限制是从 a=0 到 b=6.5。

【讨论】:

  • 如果在计算 k4 和 m4 时去掉 k3 和 m3 前面的因子 h,你应该得到更接近的拟合。
  • 这是真的,卢茨L。我正确地重写了问题的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多