Как передать (пользовательские) функции аргументу "localals" в simpify? - PullRequest
1 голос
/ 06 апреля 2019

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

Приведенный ниже код выводит 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', но имеет в качестве входного значения симпатичное выражение.Для моего варианта использования это должна быть строка.Замена этого выражения с помощью вызова 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 Ответ

0 голосов
/ 06 апреля 2019

Вы должны передать '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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...