1

我想使用 Sympy 的多项式,但我也想使用更高精度的系数。

Just Doing It 似乎给了我带有sympy.core.numbers.float系数的多项式。

import sympy
from sympy import Poly
from sympy.abc import x
from gmpy2 import mpfr, get_context

get_context().precision = 150

#float64 can't tell this from 1.0
one_and_change = mpfr('1.0000000000000000000000000000000000001')
#mpfr('1.0000000000000000000000000000000000001000000005',150)

p = [one_and_change]
px = Poly(p, x)

print(px)
# Poly(1.0, x, domain='RR')
print(px.is_one)
# True
print(type(px.all_coeffs()[0]))
# <class 'sympy.core.numbers.Float'>

我也试过sympy.mpmath.mpf了,结果一样。

这也不起作用:[ 1 ]

domain = sympy.polys.domains.realfield.RealField(150)
px = Poly(p, x, domain=domain)
print(type(px.all_coeffs()[0]))
# <class 'sympy.core.numbers.Float'>
4

1 回答 1

0

有几个障碍:

  • gmpy.mpfr没有._sympy_方法,所以它会在中间步骤中转换为浮点数。
  • sympy.Poly,默认情况下,sympy.polys.domain.RR用于浮点系数,并将使用它进行转换。
  • RR, 加载时,使用 53 作为其精度,并忽略mpmath.mp.precision.
  • 转换时,RR使用RR.precision并忽略参数的精度。

解决方案:

  1. 系数必须是 Sympy 类型(例如sympy.Float,具有扩展精度)。
  2. 对于域,以下之一:
    • 设置sympy.polys.domain.RR._context.prec = my_precision
    • Pass domain='EX',它不进行转换。
    • 传入自定义域(例如sympy.polys.domains.realfield.RealField(150))。
于 2015-02-27T22:48:31.617 回答