使用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
相关产品推荐
相关产品推荐

