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/e
,k = -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)