在Python中使用Lambert函数时的NaN值
我试图用Python中的Lambert函数来解决一个问题;然而,当使用天篷时,我得到了一个NaN响应。我的方程式如下:在Python中使用Lambert函数时的NaN值,python,python-2.7,scipy,enthought,scientific-computing,Python,Python 2.7,Scipy,Enthought,Scientific Computing,我试图用Python中的Lambert函数来解决一个问题;然而,当使用天篷时,我得到了一个NaN响应。我的方程式如下: from scipy.special import lambertw y=8.21016005323e+158 gama = -339.375260893 x = lambertw(y) + gama print x 当我在Matlab中执行相同的代码时,我得到了x=20.6524的值,这就是我要寻找的结果 我不确定NaN值是由什么引起的,但我怀疑这可能与我对y的巨大
from scipy.special import lambertw
y=8.21016005323e+158
gama = -339.375260893
x = lambertw(y) + gama
print x
当我在Matlab中执行相同的代码时,我得到了x=20.6524的值,这就是我要寻找的结果
我不确定NaN值是由什么引起的,但我怀疑这可能与我对y的巨大价值有关。有没有办法让Python来处理这个问题并给出正确的结果
谢谢
scipy.show_config()
umfpack_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['mkl_lapack95_lp64', 'mkl_core_dll', 'mkl_intel_lp64_dll', 'mkl_intel_thread_dll']
library_dirs = ['C:\\Users\\vagrant\\src\\master-env\\libs']
define_macros = [('SCIPY_MKL_H', None)]
include_dirs = ['C:\\Users\\vagrant\\src\\master-env\\include']
blas_opt_info:
libraries = ['mkl_core_dll', 'mkl_intel_lp64_dll', 'mkl_intel_thread_dll']
library_dirs = ['C:\\Users\\vagrant\\src\\master-env\\libs']
define_macros = [('SCIPY_MKL_H', None)]
include_dirs = ['C:\\Users\\vagrant\\src\\master-env\\include']
openblas_info:
NOT AVAILABLE
lapack_mkl_info:
libraries = ['mkl_lapack95_lp64', 'mkl_core_dll', 'mkl_intel_lp64_dll', 'mkl_intel_thread_dll']
library_dirs = ['C:\\Users\\vagrant\\src\\master-env\\libs']
define_macros = [('SCIPY_MKL_H', None)]
include_dirs = ['C:\\Users\\vagrant\\src\\master-env\\include']
blas_mkl_info:
libraries = ['mkl_core_dll', 'mkl_intel_lp64_dll', 'mkl_intel_thread_dll']
library_dirs = ['C:\\Users\\vagrant\\src\\master-env\\libs']
define_macros = [('SCIPY_MKL_H', None)]
include_dirs = ['C:\\Users\\vagrant\\src\\master-env\\include']
mkl_info:
libraries = ['mkl_core_dll', 'mkl_intel_lp64_dll', 'mkl_intel_thread_dll']
library_dirs = ['C:\\Users\\vagrant\\src\\master-env\\libs']
define_macros = [('SCIPY_MKL_H', None)]
include_dirs = ['C:\\Users\\vagrant\\src\\master-env\\include']
使用scipy版本0.14.0:
In [130]: import scipy
In [131]: scipy.__version__
Out[132]: '0.14.0.dev-371b4ff'
In [146]: scipy.show_config()
umfpack_info:
NOT AVAILABLE
atlas_threads_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib/atlas-base/atlas', '/usr/lib/atlas-base']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = f77
include_dirs = ['/usr/include/atlas']
blas_opt_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib/atlas-base']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = c
include_dirs = ['/usr/include/atlas']
atlas_blas_threads_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib/atlas-base']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = c
include_dirs = ['/usr/include/atlas']
openblas_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib/atlas-base/atlas', '/usr/lib/atlas-base']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = f77
include_dirs = ['/usr/include/atlas']
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
在
lambertw
代码中有一个迭代。显然,当给出一个大的论据时,它不会收敛。(正如@unutbu的回答所示,它是否收敛似乎取决于您的配置。)
下面是一个适用于最大浮点值的(标量)正实数参数的替代方法:
import numpy as np
from scipy.optimize import fsolve
def lw(x):
"""Lambert W function, for real x >= 0."""
def func(w, x):
return np.log(x) - np.log(w) - w
if x == 0:
return 0
if x > 2.5:
lnx = np.log(x)
w0 = lnx - np.log(lnx)
elif x > 0.25:
w0 = 0.8 * np.log(x + 1)
else:
w0 = x * (1.0 - x)
return fsolve(func, w0, args=(x,))[0]
例如:
In [79]: lw(8.21016005323e+158)
Out[79]: 360.02763631519991
In [80]: np.finfo(1.0).max
Out[80]: 1.7976931348623157e+308
In [81]: lw(np.finfo(1.0).max)
Out[81]: 703.22703310477016
以下是我的配置:
In [87]: scipy.show_config()
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
define_macros = [('NO_ATLAS_INFO', 3)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3']
define_macros = [('NO_ATLAS_INFO', 3)]
atlas_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
谢谢你的回答。我试过你的建议,但还是失败了。我正在使用Python和Enthow Corporation环境。当我检查scipy版本时,它返回0.13.3,这是预先包装好的Canopy(昨天安装的)。你认为树冠可能是导致这种情况的原因吗?我从scipy'0.15.0.dev-7ce6faf'中得到了
(nan+0j)
对于lambertw(8.21016005323e+158)
。lambertw代码中有一个迭代,显然没有收敛。调用scipy.special.errprint(True)
查看相关警告之前,请先调用scipy.special.errprint(True)
。我刚刚尝试在单独的机器上与scipy 0.9.0一起使用,它可以正常工作fine@WarrenWeckesser我按照你的建议做了,我有三个错误;收敛太慢(未能收敛)、溢出(浮点溢出)和域错误(浮点无效值)。你知道这些是什么意思吗?@allankey:如果你和@WarrenWeckesser postscipy.show_config()
,那可能会很有趣。你可能想发布一篇文章。@unutbu谢谢你的帮助。我刚发帖。
In [87]: scipy.show_config()
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
define_macros = [('NO_ATLAS_INFO', 3)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3']
define_macros = [('NO_ATLAS_INFO', 3)]
atlas_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE