Python (SymPy, SciPy), создать лямбда-символ из строки

Я изо всех сил пытался взять текстовые входы уравнения и оценить его как определенный интеграл. Мне нужна вызываемая функция для перехода к scipy.integrate.

eq = "x**2"
func = lambda x: eq
func(2)

# outputs:
# x**2


# but if I:

func = lambda x: x**2
func(2)

# outputs:
# 4

person Nona Urbiz    schedule 03.05.2011    source источник
comment
Во втором фрагменте кода sympy вообще не используется. Строки from sympy import Symbol; x = Symbol('x') не действуют.   -  person Sven Marnach    schedule 03.05.2011
comment
хаха. вау, хороший улов, я бы никогда не понял. Я чувствую себя глупо. Спасибо! Тем не менее, моя проблема остается.   -  person Nona Urbiz    schedule 03.05.2011
comment
Для справки: хотя это не то, что вы хотите передать в scipy.integrate, вы можете получить выражение sympy из строки, используя sympify: stackoverflow.com/questions/1010583/   -  person Paul    schedule 04.05.2011


Ответы (5)


Не уверен, но, возможно, вы ищете

eq = "x**2"
func = eval("lambda x: " + eq)

Обратите внимание, что использование eval() опасно, если eq получено из ненадежного источника (например, пользовательского ввода).

person Sven Marnach    schedule 03.05.2011
comment
В этом посте объясняется, как безопасно обрабатывать пользовательский ввод с помощью eval: lybniz2.sourceforge.net/safeeval.html - person pberkes; 03.05.2011

Вам нужно использовать eval для запуска eq как кода, а не для обработки его как строки.

eq = "x**2"
func = lambda x: eval(eq)
func(2)

# outputs:
# 4
person rzetterberg    schedule 03.05.2011

sympify может быть тем, что вы ищут. Он преобразует строковое выражение в объект sympy.

Например:

import sympy as sp
f=sp.sympify('x**2+sin(y)')

И вы можете использовать autowrap для преобразования объекта sympy в вызываемую функцию.

person yangle    schedule 12.08.2011
comment
Вместо автоматического переноса вы можете объявить x и y как символы, например x, y = sympy.symbols('x y'), затем вызвать evalf с subs и передать аргументы, EG f.evalf(subs={x:1.23, y:4.56}) вернет 0,524488748060870. - person Mark Mikofski; 07.08.2013

Попробуйте asteval или numexpr для более безопасных альтернатив eval() и Sympy.sympify().evalf().

person Mark Mikofski    schedule 07.08.2013

Я постоянно получал синтаксическую ошибку для следующего и неустанно пытался выяснить, почему:

E="2x+1"
F=lambda x: (x, eval(E)) # to get an xy coordinate 

Но проблема сработала, как и ожидалось, когда я изменил E на:

E="2*x+1"

Ошибка новичка. :)

person bmc    schedule 16.07.2017