【发布时间】:2023-02-18 01:28:07
【问题描述】:
我正在尝试使用 Runge Kutta 四阶来求解这个方程:
在我的程序中应用 d2Q/dt2=F(y,x,v) 和 dQ/dt=u Q=y。
我尝试运行代码,但出现此错误:
Traceback (most recent call last):
File "C:\Users\Egw\Desktop\Analysh\Askhsh1\asdasda.py", line 28, in <module>
k1 = F(y, u, x) #(x, v, t)
File "C:\Users\Egw\Desktop\Analysh\Askhsh1\asdasda.py", line 13, in F
return ((Vo/L -(R0/L)*u -(R1/L)*u**3 - y*(1/L*C)))
OverflowError: (34, 'Result too large')
我尝试使用 decimal 库,但我仍然无法使其正常工作。我可能没有正确使用它。
我的代码是这样的:
import numpy as np
from math import pi
from numpy import arange
from matplotlib.pyplot import plot, show
#parameters
R0 = 200
R1 = 250
L = 15
h = 0.002
Vo=1000
C=4.2*10**(-6)
t=0.93
def F(y, u, x):
return ((Vo/L -(R0/L)*u -(R1/L)*u**3 - y*(1/L*C)))
xpoints = arange(0,t,h)
ypoints = []
upoints = []
y = 0.0
u = Vo/L
for x in xpoints:
ypoints.append(y)
upoints.append(u)
m1 = u
k1 = 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, upoints)
show()
plot(xpoints, ypoints)
show()
我希望得到 u 和 y 对 t 的图。
【问题讨论】:
-
如果您正在使用 NumPy 和朋友,我会说您也可以使用 SciPy 的 Runge-Kutta 实现。
-
发生错误时变量的值是多少?您可以使用调试器来查找,或将调用包装在
try..except中并打印except块中的值。另外 -1/L*C中的C应该在分母中吗?如果是这样,则您缺少括号。如果不是,可以简化为C/L。 -
使用 try.except 我得到的 k1 值打印为 -4939093.827160495 。 C 也为 1/L*C
-
如果
1/L*C是正确的,那么为什么要这样写而不是代数等价的C/L?这将使它看起来更类似于表达式中的其他/L。 -
根据上面的公式,
(1/L*C)是错误的,应该是1/(L*C)。
标签: python ode runge-kutta