Почему sympy integrate вводит мнимые константы при интегрировании вещественного логарифмического выражения? - PullRequest
1 голос
/ 03 февраля 2020

Я нашел решение, когда проводил исследование вопроса, но все же оставляю вопрос / ответ здесь. Я не смог найти другие ресурсы при поиске в Интернете, поэтому я надеюсь, что этот пост может кому-то помочь в будущем.

Здравствуйте, я использую sympy для вычисления интеграла кусочно определенной функции , Однако интеграция вводит мнимые константы.

Минимальный пример

from sympy import *
f = interpolating_spline(1, Symbol('p'), [0,0.1,1], [0,10,1000])
r = (ln(20000-f)).simplify()
s = integrate(r)
print('r='+latex(r))
print('s='+latex(s)) 

Что дает

r=\log{\left(\begin{cases} 20000 - 100.0 p & \text{for}: p \geq 0 \wedge p \leq 0.1 \20100.0 - 1100.0 p & \text{for}: p \geq 0.1 \wedge p \leq 1 \end{cases} \right)} s=\begin{cases} \text{NaN} & \text{for}: p < 0 \1.0 p \log{\left(20000 - 100.0 p \right)} - 1.0 p - 200.0 \log{\left(100.0 p - 20000.0 \right)} + 1980.69751050723 + 200.0 i \pi & \text{for}: p \leq 0.1 \1.0 p \log{\left(20100.0 - 1100.0 p \right)} - 1.0 p - 18.2727272727273 \log{\left(1100.0 p - 20100.0 \right)} + 181.054613456189 + 18.2727272727273 i \pi & \text{for}: p \leq 1 \\text{NaN} & \text{otherwise} \end{cases}

Почему в интеграле есть мнимые постоянные? Я смутно помню кое-что о сокращениях ветвей из комплексного анализа, так что это может быть связано с этим?

Источником формулировки проблемы является критерий Келли , адаптированный к кривым превышения потерь.

Ожидаемый результат

Если я интегрирую только первое выражение, я получу вещественный интеграл без констант:

In [71]: integrate(ln(20000-100*p))
Out[71]: p*log(20000 - 100*p) - p - 200*log(p - 200)

Но этот результат также странный, так как результат не будет определен для p=0.1, так как p-200 будет отрицательным. Очень странно.

1 Ответ

1 голос
/ 03 февраля 2020

Изменение стратегии интеграции на manual

Константы исчезают при использовании стратегии интеграции manual=True.

In [84]: print('r='+latex(integrate(r,manual=True)))

r=\begin{cases} \text{NaN} & \text{for}: p < 0 \- 1.0 p - 0.01 \left(20000 - 100.0 p\right) \log{\left(20000 - 100.0 p \right)} + 200.0 \log{\left(20000 \right)} & \text{for}: p \leq 0.1 \- 1.0 p - 0.000909090909090909 \left(20100.0 - 1100.0 p\right) \log{\left(20100.0 - 1100.0 p \right)} - 1799.64289705104 + 200.0 \log{\left(20000 \right)} & \text{for}: p \leq 1 \\text{NaN} & \text{otherwise} \end{cases}

Я нашел эту опцию в документации по адресу https://docs.sympy.org/latest/modules/integrals/integrals.html#sympy .integrals.integrals.integrate

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