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

使用sympy.solve求解方程组为何返回小数?如何获取分数解?

解决SymPy求解方程组返回小数而非分数的问题

嗨,我来帮你搞定这个问题~

你得到小数形式解的核心原因很简单:代码里用了Python原生的浮点数1/2,而非SymPy的精确分数类型。在Python中直接计算1/2会得到浮点数0.5,当SymPy处理包含浮点数的表达式时,会默认输出浮点数格式的结果,这就是为什么你看到的是0.0、0.500000000000000这类小数解。

解决方法

最根本的解决方式是在定义表达式时就使用SymPy提供的精确数值类型,具体有两种常用方式:

1. 替换浮点数为sm.Rational

把代码中的1/2替换成sm.Rational(1, 2),这会明确告诉SymPy这是一个精确的有理数:

import sympy as sm
x, y = sm.symbols('x, y', negative=False)
X = -x*(1-y)
# 用sm.Rational(1,2)替代1/2
Y = -y*(1-x)*(sm.Rational(1,2)-x)
XEqual = sm.Eq(X, 0)
YEqual = sm.Eq(Y, 0)
equilibria = sm.solve( (XEqual, YEqual), x, y)
print(equilibria)

2. 用sm.S()转换整数为SymPy类型

也可以通过sm.S(1)/2来生成精确分数,效果和sm.Rational一致:

Y = -y*(1-x)*(sm.S(1)/2 - x)

运行结果

修改后重新运行代码,你会得到完全精确的分数/整数解:

[(0, 0), (1/2, 1), (1, 1)]

额外小技巧

如果已经得到了小数形式的结果,也可以用sm.nsimplify()来批量转换为精确形式:

equilibria = [sm.nsimplify(sol) for sol in equilibria]

不过还是推荐从源头避免使用浮点数,这样能保证整个计算过程的精确性。

内容的提问来源于stack exchange,提问作者Ged

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:28:10