我正在对不正确的积分进行一些练习,但偶然发现了一个我无法解决的问题.我正在尝试对以下问题使用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_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()函数解决此问题吗?
解决方法:
目前,只有当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中设计和解释的.