评估收敛一个发散项的产品

Posted

技术标签:

【中文标题】评估收敛一个发散项的产品【英文标题】:Evaluating product of converging a diverging term 【发布时间】:2021-09-24 13:58:48 【问题描述】:

我想在 Python 中对以下表达式进行数值计算

exp((x^2))*Erfc(x).

其中 Erfc 表示互补误差函数 (https://en.wikipedia.org/wiki/Error_function#Complementary_error_function)。 Erfc(x) 可从 Scipy Special 获得。即使对于较大的 x,$exp(x^2)$ 发散,该乘积也具有有限值。准确的说

Lim x->\infinity exp((x^2))*Erfc(x) = 1/(sqrt(Pi) * x)。

不幸的是,Python 不计算这个表达式,并且对于较大的 x 值返回 NaN。有没有办法实现这个函数,使得对于大 x,Python 仍然产生正确的答案? (我的代码和输出如下。)

import numpy as np
import scipy 
from scipy import special as spl

def my_fun(x):

    return np.exp(x**2)*spl.erfc(x);


print (my_fun(10))

print (my_fun(50))

print (my_fun(100))

0.05614099274382259

    Warning (from warnings module):
      File "/Users/spjoy/Working/Projects/Wigner Crystal/Python/num_eval.py", line 7
        return np.exp(x**2)*spl.erfc(x);
    RuntimeWarning: overflow encountered in exp
    
    Warning (from warnings module):
      File "/Users/spjoy/Working/Projects/Wigner Crystal/Python/num_eval.py", line 7
        return np.exp(x**2)*spl.erfc(x);
    RuntimeWarning: invalid value encountered in double_scalars
    nan
    nan

【问题讨论】:

你能告诉我们你的 Python 代码和你所做的测试吗? 我已经在我更新的问题中添加了代码和输出,谢谢! 【参考方案1】:

SciPy 有该函数的实现:scipy.special.erfcx

例如

In [8]: import numpy as np

In [9]: from scipy.special import erfcx, erfc

一个适中的值,其中exp(x**2)*erfc(x) 不会出现上溢和下溢,以验证我们是否得到与erfcx(x) 相同的结果:

In [10]: x = 2.5

In [11]: np.exp(x**2) * erfc(x)
Out[11]: 0.21080636406114353

In [12]: erfcx(x)
Out[12]: 0.2108063640611436

x 的值很大,其中exp(x**2) 溢出,但erfcx(x) 给出结果:

In [13]: x = 50.0

In [14]: np.exp(x**2) * erfc(x)
<ipython-input-14-bb75732dec2d>:1: RuntimeWarning: overflow encountered in exp
  np.exp(x**2) * erfc(x)
<ipython-input-14-bb75732dec2d>:1: RuntimeWarning: invalid value encountered in double_scalars
  np.exp(x**2) * erfc(x)
Out[14]: nan

In [15]: erfcx(x)
Out[15]: 0.011281536265323772

In [16]: 1/(np.sqrt(np.pi)*x)  # Verify the asymptotic approximation.
Out[16]: 0.011283791670955126

【讨论】:

非常感谢,这太棒了。我其实很好奇 Scipy 是如何实现函数“erfcx”的。 SciPy 函数是 Faddeeva.cc 中 C++ 实现的包装器。

以上是关于评估收敛一个发散项的产品的主要内容,如果未能解决你的问题,请参考以下文章

有界的发散数列,一定会存在两个极限值不同的收敛子列,该怎么证明。

中台之中台的设计

数学小课堂:几何数列的求和(几何级数的发散性和收敛性)

测试点先发散后收敛思考

数字信号处理基本序列 ( 实指数序列 | 收敛序列 | 发散序列 )

反常积分判敛问题