Упростите термины в выражении

Sympy может упростить это:

In [26]: (asinh(sinh(x))).simplify()
Out[26]: x

но это не упрощает:

In [28]: (asinh(sinh(x))+1).simplify()
Out[28]: asinh(sinh(x)) + 1

Как я могу попросить упростить части выражения? Если возможно, я бы хотел избежать упрощения уравнения в масштабе, например что общий знаменатель найден и разложен на множители для всех терминов.


person Joce    schedule 12.02.2018    source источник


Ответы (1)


Возможно, такого упрощения вообще не должно происходить, потому что это не всегда верно: например, asinh(sinh(2*I)) не 2*I. Текущая реализация simplify имеет пункт для «отмены» функции и ее обратного, который применяется только в том случае, если все выражение является этой функцией, и не обращает внимания на такие вещи, как asin(sin(pi)), являющийся 0, а не pi. Инверсии - дело хитрое.

Но следующий подход, основанный на replace, заменит все известные пары "функция-обратная":

expr = sqrt(asinh(sinh(x))) + sin(asin(exp(2*x+1)))
expr = expr.replace(lambda f: isinstance(f, Function) and isinstance(f.args[0], f.inverse(argindex=1)), lambda f: f.args[0].args[0])
# expr is now sqrt(x) + exp(2*x + 1)

Первый аргумент replace - это функция фильтра,

lambda f: isinstance(f, Function) and isinstance(f.args[0], f.inverse(argindex=1))

который утверждает, что f - функция, первый аргумент которой является обратным.

Второй аргумент replace - это действие, которое должно быть выполнено при сопоставлении подвыражения,

lambda f: f.args[0].args[0]

означает: заменить аргументом аргумента, т. е. asinh(sinh(x)) -> x.

Как отмечалось выше, не гарантируется, что результат такого «упрощения» математически эквивалентен исходному выражению.

person Community    schedule 12.02.2018