1

我在对问题进行研究时找到了解决方案,但我仍然在这里发布问题/答案。我在网上搜索时找不到其他资源,所以我希望这篇文章将来可能对某人有所帮助。

您好,我正在使用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{否则} \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它将是负数。很奇怪。

4

1 回答 1

2

将集成策略更改为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的文档中找到了这个选项

于 2020-02-03T15:04:44.517 回答