如何正确实施scipy.integrate.Radau?

时间:2020-03-31 14:45:17

标签: python scipy differential-equations

(我什至会珍惜一个示例的链接,到目前为止我还没有找到任何示例。)

我正在尝试使用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]中,等等。

我在做什么错?应该如何实施?

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-1y0(t)=0.5*C*t^2+B*t+A=t^2-t+1,集成正确地以eq.y = [91. 19.]结尾。