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

scipy.odeint求解时np.array无法与y值相乘报错是什么原因?

问题原因
  • 维度不匹配:scipy.integrate.odeint要求传入的初始状态y0为一维numpy数组,且微分方程函数返回的导数维度必须与y0完全一致。你代码中L、S1~S6都是长度为17的数组,计算得到的dhdt1、dhdt2也都是长度17的数组,二者组合后总维度为34,但你定义的y0为单值标量或单元素列表,维度完全不匹配,触发运算报错。
  • 状态格式不符合要求:odeint不支持二维状态输入,所有状态必须拼接为一维向量传入,计算导数后也需返回同样长度的一维向量,不能返回嵌套列表。
修复后代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

# 提前定义你的常量,此处为占位提示,请替换为实际数值
# Th231_LambdaAux = 长度为17的数组
# phi_1~phi_6为你的常量值
# Th231_S_1~Th231_S_6为长度为17的数组

def flux(y,t):
    # 将一维状态向量拆分为两个长度17的数组,对应两个状态量
    y1, y2 = y.reshape(2, 17)
    # 常量赋值
    L = Th231_LambdaAux
    k1 = phi_1
    k2 = phi_2
    k3 = phi_3
    k4 = phi_4
    k5 = phi_5
    k6 = phi_6
    S1 = Th231_S_1
    S2 = Th231_S_2
    S3 = Th231_S_3
    S4 = Th231_S_4
    S5 = Th231_S_5
    S6 = Th231_S_6 

    # 通量计算
    fout1 = (1-0.9998)*y1
    fout2 = 0.9998*y2

    # 公共系数项
    coef = L + k1*S1 + k2*S2 + k3*S3 + k4*S4 + k5*S5 + k6*S6
    dhdt1 = coef * fout1
    dhdt2 = coef * fout2
    # 合并为长度34的一维数组返回,和y0维度匹配
    return np.hstack([dhdt1, dhdt2])

# 时间序列
t = np.linspace(0,315360000) 

# 初始条件:17个点的y1初始值 + 17个点的y2初始值,拼接为长度34的一维数组
# 示例为所有点的y1、y2初始值都为1e22,可根据需求自行修改不同点的初始值
y0 = np.ones(2*17) * 1e22

# 积分求解
y = odeint(flux,y0,t)

# 绘图示例:此处以第0个网格点的y1、y2为例,可修改索引查看其他点的结果
plt.figure(1)
plt.loglog(t,y[:,0],'b-', label='y1')
plt.loglog(t,y[:,17],'r--', label='y2')
plt.xlabel('Time (s)')
plt.ylabel('N [nuclide/cm3]')
plt.legend()
plt.show()
注意事项

如果两个状态量的物理逻辑和示例拆分方式不同,可以自行调整reshape和拼接的规则,只要保证初始值维度和导数返回维度一致即可。

内容的提问来源于stack exchange,提问作者Gourav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:51:02