Симпи - интеграл не оценивается - PullRequest
1 голос
/ 02 марта 2020

Я не могу решить этот неопределенный интеграл с Sympy. Я проверил с помощью Wolfram Alpha , и он явно сходится.

import sympy as sp
a, b, C = sp.symbols("a, b, C", real=True)
E = sp.symbols("E", real=True, positive=True)
chi = C * sp.exp(-a * E) * sp.sinh(sp.sqrt(b * E))
sp.integrate(chi, E)

Я попытался переписать выражение в терминах экспоненциальных функций, но безуспешно:

sp.integrate(chi.rewrite(sp.exp).expand().powsimp(), E)

Я также пытался указать разные алгоритмы, ie, meijerg = True, чем risch = True ... Не сработало.

Можно ли решить эту проблему с помощью Sympy? Что может быть причиной такого поведения?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Если integrate возвращает неоцененный интеграл, это означает, что ни один из алгоритмов не знает, как оценить интеграл. Установка различных параметров в значение True ничего не дает, так как все они в любом случае пробуются по умолчанию (они доступны только в том случае, если вы хотите попробовать конкретный c алгоритм).

Возможно, вы сможете получить что-то, что может SymPy интегрировать, если вы переписываете гиперболи c sin как экспоненты (rewrite(exp)), выполните подстановку sqrt(E) = x (SymPy может сделать это для вас с помощью Integral.transform(sqrt(E), x)), затем заполните квадрат в экспонентах.

0 голосов
/ 04 марта 2020

Спасибо @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(...). Время вычислений сократилось до нескольких секунд!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...