#python #sympy #evalf
#python #сочувствие #evalf
Вопрос:
Я думаю, что я столкнулся с ошибкой evalf()
метода Sympy с переданными заменами.
Случайно я нашел выражение, которое принимает неверное значение, если я заменяю переменную x
целым числом, а не a Float
. Самое смешное, что это происходит только для некоторых значений точности.
Выражение выглядит несколько произвольно, но если я попытаюсь упростить его еще больше, ошибка исчезнет. Это минимальный рабочий пример
#!/usr/bin/env python
import sympy
from sympy.abc import x
# Some valid mathematical expression
expr = 1/((x - 9)*(x - 8)*(x - 7)*(x - 4)**2*(x - 3)**3*(x - 2))
def example(prec):
# This is the string 1.( prec-2 zeroes )1
almost1 = '1.' (prec-2)*'0' '1'
# We replace the integer 1
res1 = expr.evalf(prec, subs={x:1})
# We replace a Float veeery close to 1
res_almost1 = expr.evalf(prec, subs={x:sympy.Float(almost1,prec)})
return res1, res_almost1
Ожидаемый результат состоит в том, что возвращаемый кортеж должен содержать похожие числа, поскольку 1
и almost1
очень близки. Однако для некоторых значений prec
результат, полученный путем замены 1
expr
, равен нулю. (В то время как результат, полученный путем замены almost1
, близок к правильному.)
Вы можете спросить: «Каковы значения prec
, для которых выражение неверно?«. Выполнив код
wrong = [str(a) for a in range(10,1001) if example(a)[0] == 0]
print(','.join(wrong))
Я получаю этот, казалось бы, совершенно случайный список
11,20,22,29,31,38,40,49,58,67,76,78,85,87,94,96,105,114,123,132,134,141,143,150,152,159,161,170,179,188,190,197,199,206,208,215,217,226,235,244,253,255,262,264,271,273,282,291,300,309,311,318,320,327,329,338,347,356,365,367,374,376,383,385,392,394,403,412,421,423,430,432,439,441,448,450,459,468,477,486,488,495,497,504,506,515,524,533,542,544,551,553,560,562,571,580,589,598,600,607,609,616,618,625,627,636,645,654,663,665,672,674,681,683,692,701,710,719,721,728,730,737,739,748,757,766,775,777,784,786,793,795,802,804,813,822,831,833,840,842,849,851,858,860,869,878,887,896,898,905,907,914,916,925,934,943,952,954,961,963,970,972,981,990,999
Я разместил его здесь, чтобы посмотреть, допустил ли я какую-то ошибку в своем коде, в противном случае я планирую опубликовать ошибку на github Sympy.
Комментарии:
1. Как evaif является частью sympy?
2. @henos:
evalf
это метод, реализованный объектами SymPy.3. Но, похоже, это
expr.evalf
не такsympy.evalf
4. Кстати, раньше это было более сложное символьное выражение, включающее экспоненты и т.д., Но мне удалось превратить его в рациональную функцию с целью написания минимального рабочего примера.
5. По крайней мере, это ошибка
expr.evalf(20, subs={x:1}) == 0
. Я думаю, вам следует сообщить об этом на github: github.com/sympy/sympy/issues