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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 03:24:09