我研究如何使用odeint
求解Python中的微分方程并进行测试,我尝试解决以下常微分方程(以下示例来自 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")
为什么我只能计算一个区间t = np.linspace(0,20)
的y(t)
值,而不能计算这个区间内的数字的值?有某种方法可以解决这个问题吗? 谢谢。
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])