You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用odeint传入随时间变化参数时返回数组与y0长度不匹配如何解决

报错根因

scipy.integrate.odeint调用自定义微分函数时,每次传入的t是单个时间点,而非完整的时间序列。你现有代码中直接使用了全长为54的Pr序列参与计算,标量y会和序列做广播运算,最终返回长度为54的数组,和长度为1的初始值y0维度不匹配,因此触发报错。

解决方法

你需要在微分函数中,根据当前传入的时间点t取对应的Pr值,保证每次返回的结果是和y维度一致的标量。如果odeint内部计算时会用到你给定年份之外的中间时间点,建议用插值方式取值,示例代码如下:

  1. 先提取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
  1. 修改微分函数,实现自动取对应时间点的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
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:39:01