scipy.special.

lambertw#

scipy.special.lambertw(z, k=0, tol=1e-8)[source]#

兰伯特函数 W。

兰伯特 W 函数 W(z) 定义为 w*exp(w) 的逆函数,换句话说,W(z) 的值为使得 z=W(z)*exp(W(z)) 对于任何复杂数字 z 成立。

兰伯特 W 函数是一个多值函数,具有无限多个分支,每个分支给出方程 z=wexp(w) 的一个单独解,其中分支由整数 k 索引。

参数 :
zarray_like

输入参数。

kint,可选

分支索引。

tolfloat,可选

评估容忍值。

返回 :
warray

w 的形状将与 z 相同。

另请参阅

wrightomega

赖特欧米茄函数

说明

所有分支均受 lambertw 支持

  • lambertw(z) 给出主解(分支 0)

  • lambertw(z, k) 给出分支上的解 k

Lambert W 函数有两个部分实数分支:主分支(k = 0)实数对于实数 z > -1/ek = -1 分支对于 -1/e < z < 0 为实数。除 k = 0 之外的所有分支在 z = 0 处具有对数奇点。

可能出现的问题

评估在 -1/e 时非常接近分支点,可能变得不准确。在某些特殊情况下,lambertw 当前可能无法收敛,或者可能最终出现在错误的分支上。

算法

Halley 迭代用于反转 w * exp(w),使用一阶渐近近似 (O(log(w)) 或 O(w)) 作为初始估计。

分支的定义、实现和选择基于 [2]

参考资料

[2]

Corless 等人,“关于 Lambert W 函数”,Adv. Comp. Math. 5 (1996) 329-359。 https://cs.uwaterloo.ca/research/tr/1993/03/W.pdf

示例

Lambert W 函数是 w exp(w) 的逆函数

>>> import numpy as np
>>> from scipy.special import lambertw
>>> w = lambertw(1)
>>> w
(0.56714329040978384+0j)
>>> w * np.exp(w)
(1.0+0j)

任何分支都给出一个有效的逆函数

>>> w = lambertw(1, k=3)
>>> w
(-2.8535817554090377+17.113535539412148j)
>>> w*np.exp(w)
(1.0000000000000002+1.609823385706477e-15j)

方程求解的应用程序

Lambert W 函数可用于求解各种类型的方程。我们在这里给出两个示例。

首先,该函数可用于求解形式为

\(x = a + b e^{c x}\)

关于 \(x\) 的隐式方程。我们假设 \(c\) 不为零。经过一些代数运算,可以将方程写为

\(z e^z = -b c e^{a c}\)

其中 \(z = c (a - x)\)。然后,\(z\) 可以使用 Lambert W 函数表示

\(z = W(-b c e^{a c})\)

给出

\(x = a - W(-b c e^{a c})/c\)

例如,

>>> a = 3
>>> b = 2
>>> c = -0.5

方程 \(x = a + b e^{c x}\) 的解为

>>> x = a - lambertw(-b*c*np.exp(a*c))/c
>>> x
(3.3707498368978794+0j)

验证它能解方程

>>> a + b*np.exp(c*x)
(3.37074983689788+0j)

Lambert W 函数还可以用来求无限幂塔 \(z^{z^{z^{\ldots}}}\) 的值

>>> def tower(z, n):
...     if n == 0:
...         return z
...     return z ** tower(z, n-1)
...
>>> tower(0.5, 100)
0.641185744504986
>>> -lambertw(-np.log(0.5)) / np.log(0.5)
(0.64118574450498589+0j)