我正在进行一些关于不正确积分的练习,我偶然发现了一个我无法解决的问题。我正在尝试对以下问题使用limit()函数:
这里N(x)是标准正态变量的累积分布函数。
到目前为止,limit()函数没有引起任何问题,包括需要应用L'Hôpital规则的问题。但是,我正在努力为这个特定问题获得计算正确的答案,并且无法解决原因。以下代码产生错误答案
from sympy import *
x, y = symbols('x y')
init_printing(use_unicode=False) #Print the answers in unicode characters
cum_distribution = (1/sqrt(2*pi)*(integrate(exp(-y**2/2), (y, -oo, x))))
func = (cum_distribution -(1/2)-(x/sqrt(2*pi)))/(x**3)
limit(func, x, 0)
如果我申请L'Hôpital的规则,我会得到正确的
l_hopital = diff((cum_distribution -(1/2)-(x/sqrt(2*pi))), x)/diff(x**3, x)
limit(l_hopital, x, 0)
我查看了limit()函数源代码,我的理解是L'Hôpital的规则不适用?在这种情况下,可以使用limit()函数解决此问题而不应用此规则吗?
答案 0 :(得分:3)
目前,只有当erf
的参数趋于正无穷大时,才能评估涉及函数erf
(称为error function,与正常CDF相关)的限制。其他地方的限制要么没有评估,要么评估不正确。 (Related PR)。这包括限制
limit(-(sqrt(2)*x - sqrt(pi)*erf(sqrt(2)*x/2))/(2*sqrt(pi)*x**3), x, 0)
返回未评估(虽然我不会称此不正确)。作为一种解决方法,您可以使用一个项(常数项)计算此函数的泰勒级数,该项给出正确的限制值:
series(func, x, 0, 1).removeO()
返回-sqrt(2)/(12*sqrt(pi))
。
与微积分实践一样,在算法计算方面,L'Hopital的规则不如幂级数技术,SymPy主要依赖于后者。它使用的算法由Dominik Gruntz在On Computing Limits in a Symbolic Manipulation System中设计和解释。