【问题标题】:Sympy polynomials with `mpfr` coefficients?具有`mpfr`系数的Sympy多项式?
【发布时间】:2015-02-20 19:12:51
【问题描述】:

我想使用 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'>

【问题讨论】:

  • 您可以将domain='EX'Float 一起使用。
  • 我不这么认为。 Float 是 Python 大小的固定宽度 IEEE 浮点数,不是吗?
  • 不,Float 是 mpmath.mpf 的包装器,它是任意精度的。
  • 好的,感谢寻找设置精度的方法。

标签: python python-3.x sympy polynomial-math gmpy


【解决方案1】:

有一些障碍:

  • 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
    • 传递domain='EX',不进行转换。
    • 传入自定义域(例如sympy.polys.domains.realfield.RealField(150))。

【讨论】:

  • 很高兴你知道了。其中大部分应该被视为错误。
  • 我认为第一个明显缺失的功能。第二个很好,除了它会导致其他人。第三个不确定。我认为第四个应该被认为是一个错误,但也许是有原因的。
猜你喜欢
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多