SymPy Lambdify报错及微分方程求解问题求助
SymPy求解微分方程系列问题解决指南
已解决的初始问题:NameError: name 'u' is not defined
(经Davide_sd协助解决,补充常见诱因:lamdify时未将自定义函数u纳入命名空间,或u未被定义为SymPy的Function实例)
新问题1:输入初始条件ics时触发TypeError: 'u' object is not callable
诱因
u被错误赋值为数值/表达式,覆盖了原本的SymPy函数定义- 初始条件格式错误,比如未用
u(0)作为键,而是直接用u
解决步骤
- 确认
u的定义:必须是SymPy函数实例,代码开头要写u = Function('u') - 检查初始条件写法:正确格式为
ics={u(0): C0},注意是调用u(0)而非u本身 - 排查代码中是否有其他地方给
u重新赋值(比如u = dsolve(...)),这类操作会把u从函数变成表达式,导致无法调用
新问题2:注释ics后出现RuntimeWarning: invalid value encountered in sqrt,输出全NaN数组
诱因
完全符合你的推测:参数T、K、M、C0的取值导致解的表达式中根号内部分为负数,实数范围内无意义,因此返回NaN。
解决方法
- 定位根号内表达式:从SymPy求解得到的解析解中提取根号里的式子,比如假设解是
sqrt(K*T - M*C0),先单独计算这个式子的数值 - 验证参数合法性:代入你的参数值,确认根号内结果非负。示例代码:
from sympy import symbols T, K, M, C0 = symbols('T K M C0') # 替换成你解中的根号内表达式 sqrt_expr = K*T - M*C0 # 代入你的实际参数 params = {T: 15, K: 8, M: 3, C0: 40} print(sqrt_expr.subs(params)) # 若结果<0,就说明参数不合法 - 调整参数:根据根号内表达式的非负要求修改参数值,具体范围见下文。
参数合法取值范围
假设根号内表达式为K*T - M*C0(需替换为你实际解中的式子),且所有参数均为正数,则参数需满足:C0 ≤ (K*T)/M
如果需要通用的范围推导,可以用SymPy求解不等式:
from sympy import solve, symbols T, K, M, C0 = symbols('T K M C0', positive=True) sqrt_expr = K*T - M*C0 # 求解根号内非负的条件 valid_range = solve(sqrt_expr >= 0, C0) print(valid_range) # 输出[C0 ≤ K*T/M]
内容的提问来源于stack exchange,提问作者Nicolas Eveno EnfantNicolas
相关产品推荐
相关产品推荐

