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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:52:38