使用 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
我目前正在尝试让 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