基于while循环的Runge-Kutta算法

2024-10-17 10:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使龙格库塔4集成工作,但它输出以下内容:

Runge Kutta value: inf

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

^{pr2}$

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

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))

有人知道我在哪里犯的错误吗


Tags: 代码returnvaluedefk2k1infprint
1条回答
网友
1楼 · 发布于 2024-10-17 10:28:24

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

enter image description here

以及系数:

enter image description here

(来源: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循环。在

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

^{pr2}$

相关问题 更多 >