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

使用Scipy solve_ivp时如何避免在return中逐个输入变量?

解决方案

方法1:参数解包(最小改动现有代码)

直接利用Python的*运算符解包数组,彻底摆脱手动逐个变量赋值的麻烦,代码修改如下:

def dSdt(t, S):
    """ Creating ordinary differential equations """
    # 删掉手动解包T1-T20的代码
    Equation_f = sym.lambdify(T, T_Final)
    # 用*S把数组拆分成多个位置参数,匹配lambdify生成函数的参数要求
    return Equation_f(*S) + Q_C(t)

不管Excel生成多少个变量,这个写法都能自动适配,完全不用修改return语句里的参数列表。

方法2:让lambda函数直接支持数组输入(更优雅的动态适配)

从符号定义阶段就适配数组逻辑,后续代码更简洁:

符号变量定义阶段修改

假设你之前是逐个创建T1-Tn,改成动态生成SymPy矩阵:

# n从Excel读取实际变量数量
n = 20  
# 动态生成符号变量矩阵
T = sym.Matrix([sym.symbols(f"T{i+1}") for i in range(n)])
# 生成T_Final时用矩阵元素索引(比如T[0]对应原T1,T[2]对应原T3)
T_Final = sym.Matrix([
    -0.002086*T[0] + 0.002086*T[2],
    0.0,
    1e-22*T[0] - 1e-22*T[2],
    # ... 其他方程
])

微分方程函数修改

def dSdt(t, S):
    """ Creating ordinary differential equations """
    # 指定modules='numpy',让lambda函数支持数组输入
    Equation_f = sym.lambdify(T, T_Final, modules='numpy')
    # 直接传入数组S即可
    return Equation_f(S) + Q_C(t)

SymPy矩阵和NumPy数组完全兼容,这个写法从符号定义到数值计算全流程支持动态变量数量,彻底实现你根据Excel输入自动适配的需求。

之前尝试失败的原因

你写return Equation_f(T) + Q_C(t)时,把符号变量列表T传给了需要数值数组S的lambda函数,混淆了符号定义和数值计算的对象,自然无法运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:12:36