我研究了如何使用odeint
在Python中求解微分方程,并且为了进行测试,我尝试求解以下ODE(以下示例来自https://apmonitor.com/pdc/index.php/Main/SolveDifferentialEquations):
# first import the necessary libraries
import numpy as np
from scipy.integrate import odeint
# function that returns dy/dt
def model(y,t):
k = 0.3
dydt = -k*y
return dydt
#Initial condition
y0 = 5.0
# Time points
t = np.linspace(0,20)
# Solve ODE
def y(t):
return odeint(model,y0,t)
因此,如果我使用matplotlib或更简单地绘制结果,请给出命令print(y(t))
,那么这将完美地工作!但是,如果我尝试在固定的时间值内计算函数的值,例如t1 = t[2]
(= 0.8163),则会收到错误消息
t1 = t[2]
print(y(t1))
ValueError("diff requires input that is at least one dimensional")
为什么我只能在间隔y(t)
内计算t = np.linspace(0,20)
的值,而不能在此间隔内计算数字?有某种方法可以解决此问题?
非常感谢。
答案 0 :(得分:0)
odeint
函数以数值方式求解微分方程。为此,您需要指定要评估解决方案的点。这些点也会影响解决方案的准确性。通常,给odeint
的点越多,结果越好(在求解相同时间间隔时)。
这意味着odeint
无法只知道一次评估函数就知道自己想要的精度。相反,您总是需要提供一定的时间范围(就像您对np.linspace
所做的那样)。 odeint
然后在所有这些时间返回解决方案的值。
y(t)
是您的解决方案的值的数组,该数组中的第三个值对应于t
中第三次的解决方案:
在t[0]
处评估的解决方案是y(t)[0] = y0
在t[1]
处评估的解决方案是y(t)[1]
在t[2]
处评估的解决方案是y(t)[2]
...
所以不是
print(y(t[2]))
您需要使用
print(y(t)[2])