Возможно, такого упрощения вообще не должно происходить, потому что это не всегда верно: например, 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