奇异的积分输出

问题描述 投票:1回答:1

我想用sympy解一个积分。但它给我一个错误的解决方案。为什么会这样?

import sympy
from sympy import Integral, exp, oo

x, y = sympy.symbols("x y", real=True)
b, u, l, t = sympy.symbols("b u l t ", real=True, positive=True)
Fortet = Integral(exp(-l * t) * (sympy.sqrt(2 * sympy.pi * t)) ** (-1) * exp(-((b - u * t - y) ** 2) / (2 * t)),
                  (t, 0, oo))
Fortet.doit()

结果(错误)。

Piecewise((-(-b/2 + y)*sqrt(2*l +
u**2)*(-sqrt(pi)*sinh(sqrt(2)*sqrt(b)*sqrt(l +
u**2/2)*sqrt(polar_lift(1 + y**2/(b*polar_lift(b -
2*y))))*sqrt(polar_lift(b - 2*y))) +
sqrt(pi)*cosh(sqrt(2)*sqrt(b)*sqrt(l + u**2/2)*sqrt(polar_lift(1 +
y**2/(b*polar_lift(b - 2*y))))*sqrt(polar_lift(b - 2*y))))*exp(b*u -
u*y)/(sqrt(pi)*(b - 2*y)*(l + u**2/2)), Abs(arg(1 +
y**2/(b*polar_lift(b - 2*y))) + arg(b - 2*y)) <= pi/2),
(Integral(sqrt(2)*exp(-l*t)*exp(-(b - t*u -
y)**2/(2*t))/(2*sqrt(pi)*sqrt(t)), (t, 0, oo)), True))

预期(正确)解。

Solution = (exp((-u)*(b - y)) * exp(sympy.sqrt(u**2 + 2*l)*(b-y)))/(sympy.sqrt(2*l + u**2)) #RIGHT solution
python sympy integral numerical-integration
1个回答
0
投票

两种结果其实是一样的。第一个可能稍微正确一些。你往往会看到这些 polar_lift 函数,当SymPy试图做一些像平方根一样的事情时,当它不知道里面的东西的符号时(积分后)

A polar_lift 下面没有出现,但这个基本的高斯例子表明SymPy试图尽可能的通用。

from sympy import *
x = Symbol("x", real=True)
y = Symbol("y", real=True)
s = Symbol("s", real=True)  # , positive=True

gaussian = exp(-((x-y)**2)/(2*(s**2)))
nfactor = simplify(integrate(gaussian, (x,-oo,oo)))
print(nfactor)

你需要 s 拟宣布为正数。s = Symbol("s", real=True, positive=True). 类似的事情也发生在这些类型的 polar_lift(b - 2*y) 在你的例子中的函数。这种情况也发生在 问题 我在下面参考。

我不知道为什么,但 N(polar_lift(x)) 对于任何 floatint x 给予 x 再次;然而,SymPy并没有很好地简化符号化的 x. 事实证明,如果你不断简化,你会得到越来越好看的答案。我找不到任何关于polar_lift与纯数学相关的东西,所以我不知道它到底有什么作用。

还记得上面那个简单的例子,它是如何给出一个片面的?这里也一样。所以我们只需要取第一个片断,因为第二个片断是一个未评估的积分。

在下面的代码中,我使用了 这个问题 来删除片断函数,然后我简化了两次。最后,我手动删除了 polar_lift.

import sympy as sp

x, y = sp.symbols("x y", real=True)
b, u, l, t = sp.symbols("b u l t ", real=True, positive=True)

Fortet = sp.integrate(sp.exp(-l * t) * (sp.sqrt(2 * sp.pi * t)) ** (-1) *
                      sp.exp(-((b - u * t - y) ** 2) / (2 * t)),
                      (t, 0, sp.oo), conds='none')
incorrect = Fortet.simplify().simplify()

correct = eval(str(incorrect).replace("polar_lift", ""))
correct = correct.factor()
print(correct)

结果是。

exp(b*u)*exp(-u*y)*exp(-sqrt(2*l + u**2)*sqrt(b**2 - 2*b*y + y**2))/sqrt(2*l + u**2)

这和你的表达方式很接近 我无法让SymPy简化你所说的 sqrt(b**2 - 2*b*y + y**2)Abs(b-y) 无论我怎么努力,都是如此。

注意,不是SymPy还是错了,就是你错了,因为分子中的幂是相反的。所以我在Desmos上查了一下数字答案(上面的是你的)。Desmos comparison

© www.soinside.com 2019 - 2024. All rights reserved.