scipy.special.

lambertw#

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

Lambert W 函數。

Lambert W 函數 W(z) 定義為 w * exp(w) 的反函數。換句話說,W(z) 的值滿足 z = W(z) * exp(W(z)),對於任何複數 z

Lambert W 函數是一個多值函數,具有無限多個分支。每個分支都給出方程式 z = w exp(w) 的一個獨立解。在此,分支以整數 k 索引。

參數:
zarray_like

輸入參數。

kint, optional

分支索引。

tolfloat, optional

評估容忍度。

返回:
warray

w 的形狀將與 z 相同。

參見

wrightomega

Wright Omega 函數

註釋

所有分支都受 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 目前可能無法收斂,或者可能最終落在錯誤的分支上。

演算法

使用哈雷迭代法來反轉 w * exp(w),使用一階漸近近似 (O(log(w)) 或 O(w)) 作為初始估計。

定義、實作和分支的選擇基於 [2]

參考文獻

[2]

Corless et al, “On the Lambert W function”, 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)