1

Sympy の多項式を使いたいのですが、より精度の高い係数も使いたいです。

Just Doing 係数付きの多項式が得られるようです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_ため、中間ステップで float に変換されます。
  • 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'変換を行わないPass 。
    • カスタム ドメイン ( などsympy.polys.domains.realfield.RealField(150)) を渡します。
于 2015-02-27T22:48:31.617 に答える