(我什至会珍惜一个示例的链接,到目前为止我还没有找到任何示例。)
我正在尝试使用scipy.integrate中的Radau来求解二阶微分方程。现在,我仅尝试一个简单的示例,以便我可以理解它的工作原理(到目前为止尚未成功)。
假设我有以下等式:
d ^ 2y / dt ^ 2 = C,
这意味着y =(C t ^ 2)/ 2 + B t。
例如,假设y(1)= 1且C =2。假设我想为t = 10查找y的值。
这是我的代码:
from scipy.integrate import Radau
import numpy as np
C = 2.0
y = np.zeros(2)
def fun(t, y):
#y[0] = C*t
y[1] = C
return y
t0 = 1.0
y0 = np.array([1., 1.])
t_bound = 10.0
eq = Radau(fun, t0, y0, t_bound)
print(eq.n)
while(True):
print(eq.t)
print(eq.y)
print(eq.status)
if eq.status == 'finished':
break
eq.step()
输出错误。 (如果我不评论fun
定义中的一条注释行,它也会给出错误的答案。但是我认为我什至不必告诉求解器,对吗?通常我不知道该值。)< / p>
我认为我最大的问题是我不确定如何将fun
传递给我。文档说它应该在系统的右侧,所以我认为一阶导数应该在y [0]中,二阶导数应该在y [1]中,等等。
我在做什么错?应该如何实施?
答案 0 :(得分:2)
您正在解决的自动取款机
y0' = y0, y0(1)=1
y1' = 2, y1(1)=1
具有解决方案y0(t)=exp(t-1)
和y1(t)=2*t-1
的解决方案当然不是您想要的。您想要一阶系统
y0' = y1
y1' = C
以便您需要
def fun(t,y): return [y[1], C]
然后解决方案是y1(t)=C*t+B=2*t-1
和y0(t)=0.5*C*t^2+B*t+A=t^2-t+1
,集成正确地以eq.y = [91. 19.]
结尾。