涉及正常变量

时间:2018-04-02 07:58:29

标签: python sympy calculus

我正在进行一些关于不正确积分的练习,我偶然发现了一个我无法解决的问题。我正在尝试对以下问题使用limit()函数:

Question

这里N(x)是标准正态变量的累积分布函数。

Cumulative distribution function

到目前为止,limit()函数没有引起任何问题,包括需要应用L'Hôpital规则的问题。但是,我正在努力为这个特定问题获得计算正确的答案,并且无法解决原因。以下代码产生错误答案

Incorrect solution

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的规则,我会得到正确的

Correct solution

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()函数解决此问题而不应用此规则吗?

1 个答案:

答案 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中设计和解释。