ValueError:diff需要至少一维的输入

时间:2019-09-22 16:48:01

标签: python diff valueerror odeint

我研究了如何使用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)的值,而不能在此间隔内计算数字?有某种方法可以解决此问题? 非常感谢。

1 个答案:

答案 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])