使用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
相关产品推荐
相关产品推荐

