使用Python中Lambert函数时的NaN值

2024-09-28 05:16:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python中的Lambert函数来解决问题;但是在使用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处理这个问题并给出正确的结果?在

谢谢

^{pr2}$

Tags: 函数代码fromimportscipynanspecial解决问题
2条回答

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]

例如:

^{pr2}$

以下是我的配置:

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
In [129]: import scipy.special as special    

In [133]: y = 8.21016005323e+158

In [134]: gama = -339.375260893

In [139]: special.errprint(True)
Out[139]: 0

In [140]: special.lambertw(y) + gama
Out[140]: (20.652375422199896+0j)

使用scipy版本0.14.0:

^{pr2}$

相关问题 更多 >

    热门问题