使用 while 循环的龙格库塔算法

Runge Kutta Algorithm using while loop

我目前正在尝试让 Runge Kutta 4 Integration 工作,但它输出以下内容:

Runge Kutta value: inf

虽然它应该给出一个范围内的值:

Runge Kutta value: 8.476271005220534e+16

我使用了以下代码,但似乎无法输出正确的近似值。

endtime = 5
h = 0.01

def f(x, z):
    return x*x*z


t = 0
y = 1

while t < endtime:
    k1 = f(t, y)
    k2 = f(t+(h/2), y+(k1/2))
    k3 = f(t+(h/2), y+(k2/2))
    k4 = f(t+h, y+k3)

    y = y + h*(k1 + 2*k2 + 2*k3 + k4)/6

    t = t + h

print("Runge Kutta value: " + str(y))

有谁知道我哪里出错了

你的公式是错误的,因为大多数时候你忘记乘以 h

还有系数:

(来源:Wikipedia

所以:

endtime = 5
h = 0.01

def f(x, z):
    return x*x*z

y = 1
count = 0
t = 0

for count in range(int(endtime/h)):
    t = h*count

    k1 = f(t, y)
    k2 = f(t+(h/2), y+h*(k1/2))
    k3 = f(t+(h/2), y+h*(k2/2))
    k4 = f(t+h, y+h*k3)

    y += h*(k1 + 2*k2 + 2*k3 + k4)/6

print("Runge Kutta value: " + str(y))

同样通过每次计算t的值来避免浮点累加,而不是添加固定步长,并将while循环换成for循环。

不确定它是否完美,但我现在得到一个有限的结果:)

 Runge Kutta value: 1.245858162131811e+18