Python 基于while循环的Runge-Kutta算法

Python 基于while循环的Runge-Kutta算法,python,numerical-methods,runge-kutta,Python,Numerical Methods,Runge Kutta,我目前正在尝试让Runge Kutta 4集成工作,但它输出以下内容: 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)

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

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))
endtime=5
h=0.01
定义f(x,z):
返回x*x*z
t=0
y=1
当t

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

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

以及系数:

(来源:)

因此:

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

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


t=t+h
固定步长的浮点累加:不要这样做我如何解决这个问题?你认为这是问题所在吗?不是问题所在。这是问题之一。最明显的是,
(k1+2*k2+2*k3+k4)/6
应该是
h*(k1+2*k2+2*k3+k4)/6
。但它仍然会导致无穷大,然后还有其他错误,请检查我的答案。我现在看到了,我使用了维基百科公式并查看了h。非常感谢,如果可能的话,我们会将此设置为答案。这仍然会将值设置为
t=5.01
,太多了一步。正确结束时,值应为
1.24585816213e+18
,这与精确值
np.exp(5**3/3)=1.246249532958323e+18
@LutzL非常感谢。虽然带条件的循环容易发生一次性错误,但我知道。。。但不管怎样,我还是做到了。更改为循环的
。结果是正确的:)@IanRonk检查更新。有一个一次性错误,因此结果太高
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))
 Runge Kutta value: 1.245858162131811e+18