#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. Это работает, спасибо! У меня еще недостаточно репутации, чтобы поддержать ответ.