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

Python求解微分方程时遇AttributeError: 'list'无'rhs'属性的解决方法

解决SymPy求解微分方程时的AttributeError问题

错误原因

dsolve在部分场景下会返回解的列表(比如存在多解或求解过程生成多个候选解),而你直接尝试访问列表的.rhs属性,自然触发'list' object has no attribute 'rhs'错误。

修复步骤

1. 处理解的类型

获取ysoln后先判断其类型,若为列表则提取有效解(带初始条件的场景通常只有一个有效解):

ysoln = dsolve(deq, y(x), hint='1st_exact', ics={y(1):1})
# 检查是否为列表,是则取第一个解
if isinstance(ysoln, list):
    ysoln = ysoln[0]

2. 修正绘图逻辑

原绘图语句不符合Matplotlib用法,需先生成数值点再代入计算:

# 生成x的数值范围(避开x=0,原方程含1/sqrt(x),x=0无定义)
x_vals = np.linspace(0.1, 2, 100)
# 将符号解转为可计算的数值函数
y_func = lambdify(x, ysoln.rhs, 'numpy')
# 计算对应y值
y_vals = y_func(x_vals)
# 绘图
plt.plot(x_vals, y_vals)
plt.xlabel('x')
plt.ylabel('y(x)')
plt.grid(True)
plt.show()

完整修复代码

from sympy import *
import matplotlib.pyplot as plt
import numpy as np

x,y=symbols('x y', real =True)
M=5*x*sqrt(x)+7*y**2/sqrt(x)
N=28*y*sqrt(x)

if diff(M,y) == diff(N,x):
    print("The equation is exact")
else:
    print("The equation is not Exact")

y=Function('y')
deq=(5*x*sqrt(x)+7*y(x)**2/sqrt(x))+(28*y(x)*sqrt(x))*diff(y(x),x)
ysoln=dsolve(deq,y(x),hint='1st_exact',ics={y(1):1})

# 处理解为列表的情况
if isinstance(ysoln, list):
    ysoln = ysoln[0]

print("The solution of the given differential equation is:")
pprint(ysoln)

# 修正后的绘图代码
x_vals = np.linspace(0.1, 2, 100)
y_func = lambdify(x, ysoln.rhs, 'numpy')
y_vals = y_func(x_vals)

plt.plot(x_vals, y_vals)
plt.xlabel('x')
plt.ylabel('y(x)')
plt.grid(True)
plt.show()

额外说明

  • 原方程包含1/sqrt(x),必须保证x>0,否则会出现计算错误,因此绘图时从0.1开始取值。
  • lambdify用于将SymPy符号表达式转换为NumPy可计算的函数,实现符号解到数值点的转换。

内容的提问来源于stack exchange,提问作者Vishnu G Prabhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:00:58