Python使用SymPy解微分方程后乘数值报Equality与float运算不支持错误
问题描述
在Python中使用SymPy库求解微分方程得到x(t)、y(t)两个解后,将解与整数或浮点数相乘时触发报错:unsupported operand type(s) for *: 'Equality' and 'float',相关实现代码如下:
from sympy import symbols, Function, Eq, diff, dsolve, solve def model(): t = symbols('t') y, x = symbols("y x", cls=Function) eq = (Eq(diff(y(t), t), (2 * x(t))), Eq(diff(x(t), t), (2 * y(t)))) h = dsolve(eq) t0 = 0 x0 = 1 y0 = 1 init1 = h[0].rhs.subs(t, t0) - x0 init2 = h[1].rhs.subs(t, t0) - y0 S = solve((init1, init2)) h0 = [h[0].subs(S), h[1].subs(S)] for i in range(len(h0)): print(2 * h0[i]) model()
报错原因
dsolve返回的解、以及代入初始条件后的h0列表元素均为SymPy的Equality类型,本质是「函数名=表达式」的等式对象,并非可直接参与数值运算的表达式对象,直接与数字做乘法运算会触发类型不兼容错误。
修复方案
如果需要对解的表达式做运算,提取等式的.rhs属性(即等式右侧的实际表达式)参与运算即可,按使用场景分为两种实现方式:
- 仅需要计算后的表达式:直接提取
.rhs参与运算 - 需要保留「函数=计算后表达式」的等式结构:重新构造
Eq对象
完整可运行代码
from sympy import symbols, Function, Eq, diff, dsolve, solve def model(): t = symbols('t') y, x = symbols("y x", cls=Function) eq = (Eq(diff(y(t), t), (2 * x(t))), Eq(diff(x(t), t), (2 * y(t)))) h = dsolve(eq) t0 = 0 x0 = 1 y0 = 1 init1 = h[0].rhs.subs(t, t0) - x0 init2 = h[1].rhs.subs(t, t0) - y0 S = solve((init1, init2)) h0 = [h[0].subs(S), h[1].subs(S)] for i in range(len(h0)): # 方式1:仅输出计算后的表达式 # print(2 * h0[i].rhs) # 方式2:输出保留等式结构的结果 print(Eq(h0[i].lhs, 2 * h0[i].rhs)) model()
运行输出示例
Eq(x(t), 2*exp(2*t)) Eq(y(t), 2*exp(2*t))
内容的提问来源于stack exchange,提问作者Ayoub Errami
相关产品推荐
相关产品推荐

