как позволить sympy.sympify использовать предопределенные символы? - PullRequest
0 голосов
/ 17 октября 2018

Легко понять, что

from sympy import *

x = symbols('x', real=True)

y = sin(x)
dy = y.diff(x)
ddy = y.diff(x, 2)

print(y.subs(x, pi/2), dy.subs(x, pi/2), ddy.subs(x, pi/2), )

будет выводить 1 0 -1

сейчас, если выражение y не предопределено, но требуется для ввода пользователем, например

y = input('please input expression about x: ')
y = sympify(y)
dy = y.diff(x)
ddy = y.diff(x, 2)

но если пользователь снова введет sin(x),

print(y.subs(x, pi/2), dy.subs(x, pi/2), ddy.subs(x, pi/2), )

скажет

sin(x) 0 0

и

print(y.subs('x', pi/2), dy.subs('x', pi/2), ddy.subs('x', pi/2), )

говорит

1 0 0

поэтому sympify не знает x как символ, подобный тому, что делает sympy.sin(x).Так как мы можем это исправить?спасибо

1 Ответ

0 голосов
/ 17 октября 2018

Вот почему есть параметр locals в sympify:

y = sympify(y, locals={'x': x})

Это не было бы необходимо, если бы у вашего x не было предположения real=True.Символы считаются одинаковыми, если они имеют одинаковые атрибуты: имя и предположения.Символ, полученный из строки sin(x), не имеет никаких предположений, таких как действительность.Так что имя соответствует вашему x, а предположения - нет.

Другой подход заключается в том, чтобы не ограничивать пользователя именем переменной x;просто используйте любой символ, который они использовали.

y = sympify(y)
x = next(iter(y.free_symbols))  # get the first (and hopefully only) symbol in the formula
dy = y.diff(x)
# and so on 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...