Спасибо @asmeurer за предложение использовать метод transform()
. Я попытался отредактировать его ответ, чтобы включить код для решения, к сожалению, он был отклонен.
К коду:
# added positive=True, necessary to solve this integral
a = sp.symbols("a", real=True, positive=True)
b, C = sp.symbols("b, C", real=True)
E = sp.symbols("E", real=True, positive=True)
chi = C * sp.exp(-a * E) * sp.sinh(sp.sqrt(b * E))
f = chi.rewrite(sp.exp).expand().powsimp()
x = sp.symbols("x", real=True, positive=True)
r = f.func(*[sp.Integral(a, E).transform(sp.sqrt(E), x).doit() for a in f.args])
r = r.subs(x, sp.sqrt(E))
Обратите внимание, что я мог бы использовать sp.Integral(f, E).transform(sp.sqrt(E), x).doit()
, но для вычисления потребовалось бы как минимум несколько минут.
Используя свойство линейности интегралов, я применил интеграл к различным членам выражения с помощью команды r = f.func(...)
. Время вычислений сократилось до нескольких секунд!