Sympy中.expand()方法的精度控制问题及高精度展开问询
Sympy多项式高精度展开问题解决方法
核心问题说明
expand()是Sympy的符号展开操作,本身不负责数值精度控制——你遇到的精度问题,本质出在常数xt_b的初始化方式、以及数值化(evalf())的时机上,而非expand()本身的限制。
具体解决方案
1. 用精确有理数初始化常数,避免浮点数天生精度损失
直接用Python浮点数-0.121会因为二进制浮点数的特性产生精度损失(0.121无法被二进制浮点数精确表示),改用Sympy的Rational定义精确常数:
from sympy import Symbol, Rational, evalf Numerical_Precision = 200 xt = Symbol("xt", real=True) xt_b = Rational("-0.121") # 精确表示十进制数-0.121 test_exp = xt**2 + xt + 1
2. 采用「符号展开 → 高精度数值化」的可靠流程
符号展开是完全精确的,之后再用evalf()指定精度转换,能保证最终结果的高精度:
# 先精确符号展开,再高精度数值化 method_improved = test_exp.subs(xt, xt + xt_b).expand().evalf(Numerical_Precision)
这种方式比「先数值化再展开」更可控,因为符号展开阶段不会引入任何数值误差。
3. 控制高精度结果的显示精度
如果结果显示时精度不够,可设置Sympy的全局打印精度:
from sympy import init_printing init_printing(precision=Numerical_Precision)
对两种测试方法的补充解释
你观察到method_2精度更高,是因为method_1中用了普通浮点数xt_b,导致符号展开后的系数本身就带初始误差;而method_2先通过evalf(200)把xt_b转成了200位精度的浮点数,再展开时系数精度更高。但这种方式不如用Rational初始化后再符号展开的流程可靠。
内容的提问来源于stack exchange,提问作者ShoutOutAndCalculate
相关产品推荐
相关产品推荐

