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)