python - 在 Python 中使用兰伯特函数时的 NaN 值 - 在 Enthought Canopy 中

标签 python python-2.7 scipy enthought scientific-computing

我正在尝试使用Python中的兰伯特函数来解决问题;但是,在使用 Canopy 时,我收到 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 的巨大值有关。有什么方法可以让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']

最佳答案

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 - 在 Python 中使用兰伯特函数时的 NaN 值 - 在 Enthought Canopy 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23593267/

相关文章:

python - 如何查看设备文件挂载到哪里?

python - 欠定系统的非负最小二乘法

python - 无需重新从python中的字符串中提取数字

python - 这个 for 循环是如何工作的?

python - Centos 6 : scrapy commend not found(installed successfully)

python-2.7 - 如何使用xlwings在Excel中获取公式结果

python - Django:按计算字段过滤

Python - 结合正则表达式模式

python - 如何使用 Scipy 绘制真实曲线

python - tensorflow 中的欧氏距离变换