Как передать (пользовательские) функции аргументу «locals» в simpify?

#python #sympy

#python #симпатичный

Вопрос:

У меня есть две функции, sqrt(x) и pow(x, y) , которые я хочу передать «локальному» аргументу sympify после получения «sqrt(pow(x,2))» в виде строки. После этого цель состоит в том, чтобы упростить выражение от «sqrt(pow(x,2))» до «x», используя simplify .

Приведенный ниже код выводит ‘sqrt(x ** 2)’, давая мне подсказку, что pow(x, y) функция подобрана, но не упрощена по неизвестной причине.

 import sympy as sp

# Function Definitions
def pow(x, y):
   return x ** y

def sqrt(x):
   return sp.sqrt(x)

sp.symbols('x', positive=True, real=True)
input_exp = 'sqrt(pow(x, 2))'

eqn = sp.sympify(input_exp, locals={'sqrt': sqrt, 'pow': pow})
print("Simplification: ", sp.simplify(eqn))
  

Приведенный ниже код корректно выводит ‘x’, но имеет выражение sympy в качестве входных данных. Для моего варианта использования это должна быть строка. Замена этого выражения sympy вызовом на sp.sympify(input_exp, locals={'sqrt': sqrt, 'pow': pow}) также не работает.

 import sympy as sp
from sympy import Function

# Function definitions
class pow(Function):
   @classmethod
   def eval(cls, x, y):
      return x ** y


class sqrt(Function):
   @classmethod
   def eval(cls, x):
      return sp.sqrt(x)


# Simplify the expression.
x = sp.symbols('x', positive=True, real=True)
print("Simplification: ", sp.simplify(sqrt(pow(x, 2))))
  

Любые предложения или решения более чем приветствуются.
Спасибо!

Ответ №1:

Вам нужно передать ‘x’, а также локальную ссылку. Вот код :

 import sympy as sp

# Function Definitions
def pow(x, y):
   return x ** y

def sqrt(x):
   return sp.sqrt(x)

x = sp.symbols('x', positive=True, real=True)
input_exp = 'sqrt(pow(x, 2))'


eqn = sp.sympify(input_exp, locals={'sqrt': sqrt, 'pow': pow, 'x':x})
print("Simplification: ", sp.simplify(eqn))
  

и

 import sympy as sp
from sympy import Function

# Function definitions
class pow(Function):
   @classmethod
   def eval(cls, x, y):
      return x ** y


class sqrt(Function):
   @classmethod
   def eval(cls, x):
      return sp.sqrt(x)


# Simplify the expression.
x = sp.symbols('x', positive=True, real=True)
input_exp = 'sqrt(pow(x, 2))'
eqn = sp.sympify(input_exp, locals={'sqrt': sqrt, 'pow': pow, 'x':x})
print("Simplification: ", sp.simplify(eqn))
  

Комментарии:

1. Спасибо вам за ваш ответ! Проблема с этой реализацией заключается в том, что она требует, чтобы все символы в выражении были идентифицированы как символ вручную, в то время как simpify делает это автоматически за вас. Если я получил входную строку, которая не соответствует этому шаблону, это не должно вызывать ошибку из-за неопознанного символа. Извините, что не могу прояснить это. Я обновлю свой ответ!

2. @QuintenRosseel Спасибо за обратный вызов, я это исправил, если вы считаете, что это работает, пожалуйста, не забудьте проголосовать за ответ 🙂

3. Это работает, спасибо! У меня еще недостаточно репутации, чтобы поддержать ответ.