具有 `mpfr` 系数的 Sympy 多项式?
Sympy polynomials with `mpfr` coefficients?
我想用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'>
有几个障碍:
gmpy.mpfr
没有 ._sympy_
方法,因此会在中间步骤中将其转换为 float。
sympy.Poly
,默认使用sympy.polys.domain.RR
作为浮点系数,会用它来转换。
RR
,加载时使用53作为精度,忽略mpmath.mp.precision
.
- 转换时,
RR
使用 RR.precision
并忽略参数的精度。
解决方案:
- 系数必须是 Sympy 类型(例如
sympy.Float
,具有扩展精度)。
- 对于域,以下之一:
- 设置
sympy.polys.domain.RR._context.prec = my_precision
.
- 传递
domain='EX'
,不进行转换。
- 传入自定义域(例如
sympy.polys.domains.realfield.RealField(150)
)。
我想用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'>
有几个障碍:
gmpy.mpfr
没有._sympy_
方法,因此会在中间步骤中将其转换为 float。sympy.Poly
,默认使用sympy.polys.domain.RR
作为浮点系数,会用它来转换。RR
,加载时使用53作为精度,忽略mpmath.mp.precision
.- 转换时,
RR
使用RR.precision
并忽略参数的精度。
解决方案:
- 系数必须是 Sympy 类型(例如
sympy.Float
,具有扩展精度)。 - 对于域,以下之一:
- 设置
sympy.polys.domain.RR._context.prec = my_precision
. - 传递
domain='EX'
,不进行转换。 - 传入自定义域(例如
sympy.polys.domains.realfield.RealField(150)
)。
- 设置