我需要计算以下函数的积分,范围从-150
开始:
import numpy as np
from scipy.special import ndtr
def my_func(x):
return np.exp(x ** 2) * 2 * ndtr(x * np.sqrt(2))
问题在于这个函数的这一部分。
np.exp(x ** 2)
在 x
小于约等于 -26
的值时,趋近于无穷大,结果为 inf
。
而这个函数的另一部分:
2 * ndtr(x * np.sqrt(2))
这相当于
from scipy.special import erf
1 + erf(x)
趋于0。
所以,一个非常大的数字乘以一个非常小的数字应该给我一个相当大的数字——但是,python
给我的是nan
。
我应该怎么做来避免这个问题?
np.exp(x**2 + np.log(2) + np.log(ndtr(x*np.sqrt(2))))
- askewchanlog(ndtr(x))
是什么,并像exp
项一样进行拆分...您明白了。 - askewchanscipy.special.log_ndtr
来消除@askewchan解决方案中的log
调用。 - ali_m