我目前正在从MATLAB切换到Python进行涉及求解微分方程的项目。
在MATLAB中,如果传递的t数组只包含两个元素,则求解器会输出模拟的所有中间步骤。然而,在Python中,你只会得到起点和终点。要获取中间的时间点,你必须明确地指定所需的时间点。
from scipy import integrate as sp_int
import numpy as np
def odeFun(t,y):
k = np.ones((2))
dy_dt = np.zeros(y.shape)
dy_dt[0]= k[1]*y[1]-k[0]*y[0]
dy_dt[1]=-dy_dt[0]
return(dy_dt)
t = np.linspace(0,10,1000)
yOut = sp_int.odeint(odeFun,[1,0],t)
我也研究了以下方法:
solver = sp_int.ode(odefun).set_integrator('vode', method='bdf')
solver.set_initial_value([1,0],0)
dt = 0.01
solver.integrate(solver.t+dt)
然而,它仍然需要一个显式的
dt
。从阅读周围的内容中,我了解到Python的求解器(例如'vode'
)计算所请求的dt
的中间步骤,然后插值该时间点并输出它。不过,我想直接获得所有这些中间步骤,而不需要插值。这是因为它们代表了在积分容限内完全描述时间序列所需的最小点数。是否有可用的选项来实现这一点?
我正在使用Python 3。
scipy.integrate.odeint
进行插值,可以从tcur
数据(请参见我的答案)以及您建议的日志记录中看到 - 两者都不包含初始时间步长。 - WrzlprmftodeFun
),例如,显式中点法就是一个简单的例子。 - Wrzlprmft