2015-02-20 7 views
1

Я хочу использовать полиномы Симпи, но я также хочу использовать коэффициенты более высокой точности.Многочлены Sympy с коэффициентами `mpfr`?

Просто делать Это, кажется, дает мне многочлены с коэффициентами 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'> 
+0

Возможно, вы используете 'domain = 'EX'' с' Float'. – asmeurer

+0

Я так не думаю. 'Float' - это плавающая точка IEEE с фиксированной шириной Python, не так ли? – leewz

+1

Нет, Float - это оболочка вокруг mpmath.mpf, которая является произвольной точностью. – asmeurer

ответ

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)).
+0

Рад, что вы это поняли. Большинство из них следует считать ошибками. – asmeurer

+0

Я считаю, что первая очевидная пропавшая функция. Второе прекрасно, за исключением того, что оно приводит к другим. Не уверен в третьем. Я думаю, что четвертый должен считаться ошибкой, но, возможно, есть причина для этого. – leewz