Python使用odeint传入随时间变化参数时返回数组与y0长度不匹配如何解决
报错根因
scipy.integrate.odeint调用自定义微分函数时,每次传入的t是单个时间点,而非完整的时间序列。你现有代码中直接使用了全长为54的Pr序列参与计算,标量y会和序列做广播运算,最终返回长度为54的数组,和长度为1的初始值y0维度不匹配,因此触发报错。
解决方法
你需要在微分函数中,根据当前传入的时间点t取对应的Pr值,保证每次返回的结果是和y维度一致的标量。如果odeint内部计算时会用到你给定年份之外的中间时间点,建议用插值方式取值,示例代码如下:
- 先提取
Pr对应的数值和年份序列
import numpy as np from scipy.integrate import odeint # 你的原有输入参数 t = list(range(1961, 2015)) # 1961到2014的年份列表 y0 = 120000 k1 = 0.2 k2 = -.4 # 提取Pr的数值数组和对应的年份 pr_years = t pr_values = Pr.values
- 修改微分函数,实现自动取对应时间点的Pr值
def f(y, t, k1, k2, pr_years, pr_values): # 插值获取当前时间t对应的Pr值,避免中间时间点找不到匹配值报错 current_pr = np.interp(t, pr_years, pr_values) return k1 * (current_pr - k2) * y
- 调整
odeint调用参数
y = odeint(f, y0, t, args = (k1, k2, pr_years, pr_values))
如果你的Pr已经是按年份做索引的pandas Series,且确定odeint只会用到你给定的整数年份点,也可以直接用索引取值,微分函数可以简化为:
def f(y, t, k1, k2, Pr): current_pr = Pr.loc[int(t)] return k1 * (current_pr - k2) * y
内容的提问来源于stack exchange,提问作者lsr729
相关产品推荐
相关产品推荐

