Python中odeint报错:func返回数组尺寸与y0不匹配求助
解决scipy.odeint返回值与y0尺寸不匹配的问题
嘿,我来帮你搞定这个odeint的报错问题!你遇到的The size of the array returned by func (1) does not match the size of y0 (2)错误,核心原因其实很直白——你的微分方程函数返回的是单个数值,但初始条件y0是包含2个元素的列表,odeint要求函数必须返回和y0长度一致的数组。
问题出在哪?
你传入的y0 = [1, 0.5],意味着你要解的是一个二元微分方程组:每个元素对应一个状态变量,odeint需要你给出每个状态变量的导数。但你的GenModel函数不管走哪个分支,返回的都是单个值(比如Y[0]+Y[1]是一个数,0也是一个数),这就导致尺寸完全不匹配了。
举个例子,假设你想对Y[0]和Y[1]分别定义导数:
- 比如modelID=1时,
dY0/dt = Y[0] + Y[1],那你还得明确dY1/dt是什么,然后把这两个导数打包成列表返回,而不是只返回Y[0]+Y[1]。
怎么修正?
核心就是让GenModel返回和y0长度一致的列表(也就是2个元素),对应两个状态变量的导数。这里给你改个示例框架:
def GenModel(Y,modelID,t1,t2): # 先初始化两个状态变量的导数 dY0_dt = 0.0 dY1_dt = 0.0 # 根据不同modelID定义每个状态变量的导数 if modelID == 1: dY0_dt = Y[0] + Y[1] dY1_dt = 0.0 # 这里替换成Y[1]对应的微分方程逻辑 elif modelID == 2: dY0_dt = t1*Y[0] + Y[1] dY1_dt = ... # 补充Y[1]的导数规则 elif modelID == 3: dY0_dt = Y[0] dY1_dt = t1*Y[1] # 按需调整 # 处理特殊情况的分支 if Y[0] == 0 or Y[1] == 0: if modelID == 27: dY0_dt = 0.0 dY1_dt = 0.0 # 对应你的模型逻辑修改 elif modelID == 28: dY0_dt = 0.0 dY1_dt = 0.0 if Y[0] != 0 and Y[1] != 0: if modelID == 27: dY0_dt = Y[0]*Y[1] dY1_dt = ... # 补充Y[1]的导数 elif modelID ==28: dY0_dt = t1*Y[0]*Y[1] dY1_dt = ... elif modelID == 29: dY0_dt = t2*Y[0]*Y[1] dY1_dt = ... # 最后返回两个导数组成的列表,长度和y0一致 return [dY0_dt, dY1_dt]
额外说明
你参考的Stack Overflow案例大概率是求解单个微分方程的场景(也就是y0是单个数值),所以返回单个值没问题,但你的场景是二元方程组,必须严格匹配尺寸。另外,你的args参数传递是正确的,不用调整这部分。
内容的提问来源于stack exchange,提问作者Usman YousafZai
相关产品推荐
相关产品推荐

