оценка функции sympy с плавающей запятой произвольной точности

Например, учитывая символическую функцию sympy

x=symbols("x")
h=sin(x) 

когда кто-то звонит

h.subs(x, mpf('1.0000000000000000000000000000000000000000000001')) 

sympy возвращает число с плавающей запятой. Возвращаемое значение не является mpf.

Есть ли удобный способ заставить sympy оценивать символические стандартные функции (такие как экспоненциальные и триггерные функции) с произвольной точностью?


person Ryan Budney    schedule 08.01.2016    source источник


Ответы (1)


Чтобы вычислить выражение, используйте expr.evalf(), который принимает точность в качестве первого аргумента (по умолчанию 15). Вы можете заменить выражения, используя expr.evalf(prec, subs=subs_dict).

>>> sin(x).evalf(50, subs={x: Float('1.0')})
0.84147098480789650665250232163029899962256306079837
person asmeurer    schedule 11.01.2016
comment
Спасибо, с небольшой модификацией ваш ответ делает то, что я ищу. Мне нужно вообще изменить ваше создание Float('') на создание mpf(''), но оно также компилируется. - person Ryan Budney; 11.01.2016
comment
Второй комментарий: похоже, что sympy Float «по существу»? типа мпф. Так что мой первый комментарий был ни тут, ни там. - person Ryan Budney; 11.01.2016
comment
Да, Float — это обертка вокруг mpf, необходимая для корректной работы с функциями SymPy. Если вы хотите напрямую работать с функциями и типами mpmath, другой вариант — использовать lambdify(x, sin(x), "mpmath"), который преобразует выражение SymPy в функцию mpmath, которую затем можно вызвать с помощью mpf. - person asmeurer; 13.01.2016