Вы не можете получить значение, используя evalf
и неполный словарь переменных.Как упоминалось в комментариях @ForceBru, вы можете использовать функцию подстановки subs()
.
Есть источники, когда можно исследовать evalf
: github или sympy.core.evalf .
Как можно видеть (когда опция verbose
равна True
) evalf
выполняет вычисления как последовательность «атомарных операций»:
q.evalf(subs={x:3}, verbose=True)
### input x
### output 3.0
### raw ((0, 3, 0, 2), None, 74, None)
### input x**4
### output 81.0
### raw ((0, 81, 0, 7), None, 67, None)
Когда evalf
приближается к a
в последний раз (пытается два раза), KeyError
повышается, и выражение вычисляется с использованием следующих строк :
if 'subs' in options:
x = x.subs(evalf_subs(prec, options['subs']))
xe = x._eval_evalf(prec)
re, im = xe.as_real_imag()
x
заканчивается как a
, но результат оценки x._eval_evalf(prec)
равен None
.Поскольку xe
равно None
, последняя упомянутая строка поднимает NotImplementedError
.
Это исключение обрабатывается в class EvalfMixin
в следующих строках , гдеввод возвращается:
except NotImplementedError:
# Probably contains symbols or unknown functions
return v
PS.Я заметил, что слишком поздно ответил на комментарий @ForceBru, строго говоря.Пусть останется как есть.