В SymPy, как я могу создать функцию, которая изменяет входное выражение?

#expression #sympy

Вопрос:

Я совершенно новичок в симпатии и системах компьютерной алгебры. Я хотел бы создать функцию, которая может принимать расширенное выражение и возвращать выражение, в котором полномочия заменяются на 1. Например, если функция имеет имя unpower :

 >>> unpower(x*y**3   x**2)
x*y   x
 

Возможно ли это сделать? Если да, то с чего я мог бы начать в документации, чтобы узнать, как это сделать? Советы/рекомендации приветствуются!

Ответ №1:

Это более продвинутое упражнение по замене, так как вы хотите сопоставить показатели любой мощности. Все объекты SymPy имеют свойства; самое основное свойство args -это то, которое сообщает вам, каковы аргументы объекта.

 >>> (x**y).args
(x, y)
 

Иногда разные аргументы имеют имена, такие как base и exp для аргументов Pow , и вы можете запросить объект, чтобы узнать, что это такое:

 >>> (x**y).exp
y
>>> (1/x).is_Pow
True
 

Этот replace метод-видите help(Basic.replace) ли-хорош для ваших нужд, потому что он может быть нацелен только на силы

 >>> (x*y**3   x**2).replace(lambda _: _.is_Pow, lambda _: _.base)
x*y   x
 

Но вы, возможно, захотите сохранить знак показателя, иначе

 >>> (x/y).replace(lambda _: _.is_Pow, lambda _: _.base)
x*y
 

Так что, может быть

 >>> from sympy import sign
>>> unpow = lambda e: e.replace(lambda _: _.is_Pow, lambda _: _.base**sign(_.exp))
>>> unpow(x**3/y**2)
x/y
 

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

1. Спасибо за этот ясный и поучительный ответ, @smichr!