如何让Sympy solve()返回复有理数而非浮点数结果?
问题:SymPy求解复数方程组时,如何返回有理数形式的结果而非浮点数
现有代码:
from sympy import * a, b = symbols("a b") eqs = [ a + b - 3j, a - b - 2 ] print(solve(eqs, [a, b]))
运行输出:
{a: 1.0 + 1.5*I, b: -1.0 + 1.5*I}
期望得到有理数形式的结果:
{a: 1 + 3/2*I, b: -1 + 3/2*I }
解决方案
核心问题在于你使用了Python原生的浮点数虚数3j,这会让SymPy默认采用浮点数类型计算。要得到精确的有理数形式,需改用SymPy提供的虚数单位I和精确有理数定义方程:
修改后的代码:
from sympy import * a, b = symbols("a b") # 用SymPy的I代替3j,保持常数的精确符号类型 eqs = [a + b - 3*I, a - b - 2] print(solve(eqs, [a, b]))
运行输出:
{a: 1 + 3*I/2, b: -1 + 3*I/2}
如果需要严格匹配3/2*I的写法,可显式用有理数构造:
from sympy import * a, b = symbols("a b") eqs = [a + b - Rational(3,2)*I*2, a - b - 2] print(solve(eqs, [a, b]))
本质是让方程中的所有常数都保持SymPy的精确符号类型,避免引入Python原生浮点数,求解器就会输出精确的有理数形式结果。
内容的提问来源于stack exchange,提问作者ErikR
相关产品推荐
相关产品推荐

