评估收敛一个发散项的产品
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++ 实现的包装器。以上是关于评估收敛一个发散项的产品的主要内容,如果未能解决你的问题,请参考以下文章
有界的发散数列,一定会存在两个极限值不同的收敛子列,该怎么证明。