Sympy求解ODE报错TypeError:'<'不支持ComplexElement与int比较
错误原因
抛出TypeError: '<' not supported between instances of 'ComplexElement' and 'int'的核心问题是sp.dsolve接口参数使用错误:
x0=0是scipy等库提供的数值ODE求解器的参数,Sympy的符号求解函数dsolve不识别这个参数,传入后会打乱内部求解逻辑,生成复数类型的中间结果,后续逻辑做数值比较时就会触发类型不匹配错误。- 代码中导入的
numpy、sympy.integrate没有实际作用,属于冗余导入,不会触发错误但可以删除。
修复方案
根据你需要通解还是特解,对应修改即可:
求方程通解
直接删掉dsolve调用里的x0=0参数即可正常运行:
import sympy as sp s = 1*10**-4 E0 = 8.8541878128*(10**-12) d1 = 500*(10**-6) E1 = 2 d0 = d1/E1 v = 0.2 e = 2.7*10**-5 R = 1 t = sp.Symbol('t') Q = sp.Function('Q')(t) diff_eq = sp.Eq(Q.diff(t), ((e*v*t/E0)-((Q*(d0+v*t))/(s*E0)))) sol1 = sp.dsolve(diff_eq, Q) print(sol1)
运行后会返回带积分常数C1的通解表达式。
求固定初始条件的特解
dsolve要求通过ics参数传入完整初始条件(必须同时指定自变量点和对应的函数值),比如要取t=0时Q=0(可根据实际物理场景替换初值),修改代码如下:
import sympy as sp # 常量如果转成Sympy有理数类型,可以避免浮点数精度问题,得到更规整的符号解,也可以保留原浮点数写法 s = sp.Rational(1, 10**4) E0 = sp.Rational(88541878128, 10**23) d1 = sp.Rational(500, 10**6) E1 = 2 d0 = d1/E1 v = sp.Rational(1, 5) e = sp.Rational(27, 10**6) R = 1 t = sp.Symbol('t') Q = sp.Function('Q')(t) diff_eq = sp.Eq(Q.diff(t), ((e*v*t/E0)-((Q*(d0+v*t))/(s*E0)))) # 传入初始条件 t=0 时 Q=0 sol1 = sp.dsolve(diff_eq, Q, ics={Q.subs(t, 0): 0}) print(sol1)
就算保留原浮点数常量,只要正确传入
ics参数,也不会再触发该类型错误。
内容的提问来源于stack exchange,提问作者Sahand Fardadi
相关产品推荐
相关产品推荐

