ランベルトのW関数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ランベルトのW関数(ランベルトのだぶりゅーかんすう、Lambert's W function) とは、次の関数逆関数である。

1ex ≤ 4 における W0(x) のグラフ。

f(w) = w e^w\,

ただし、ew指数関数w は任意の複素数である。

概要[編集]

「ランベルトのW関数」という名前は、ヨハン・ハインリッヒ・ランベルト にちなんで名づけられた。また、オメガ関数(―かんすう、Omega function)、対数積(たいすうせき、product log) という呼び名もある。

ランベルトのW関数は、通常 W(z) と表記される。ここで、任意の複素数 z に対して、次式が成立する。

z = W(z)e^{W(z)}\,

関数 f は (−∞, 0) において単射ではないため、関数 W は [-1e, 0) で多価となる。もし、定義域実数 x ≥ −1e値域w ≥ − 1 に制限するとすれば (これを分岐 (branch cut, en) と呼ぶ)、グラフで示した一価の関数 W0(x) が定義される。特に、W0(0)=0, W0(−1e)=−1 である。

ランベルトのW関数は、初等関数では表現できない。これは、の数え上げなどの、組合せ論の分野において有用である。また、これは、指数関数を含む様々な方程式を解くのに使われたり、y′(t) = ay(t−1) のような遅延微分方程式(time-delayed differential equations) の解に現れたりする。

陰関数微分公式によって、W を次のような微分方程式を満たすものとして表示できる。

z(1+W)\frac{dW}{dz}=W\quad\mathrm{for\ }z\neq -1/e

W0 の 0 近傍におけるテイラー級数は、ラグランジュの逆転の定理 (en) を用いると求めることができ、次式で与えられる。


W_0 (x) = \sum_{n=1}^\infty \frac{(-n)^{n-1}}{n!}\ x^n = x - x^2 + \frac{3}{2}x^3 - \frac{8}{3}x^4 + \frac{125}{24}x^5 - \cdots

ダランベールの収束判定法によると、収束半径1e である。この級数によって定義された関数は、定義域が複素数全体で、分岐区間 (−∞, 1e] に持つ正則関数に拡張することができる。この関数は、ランベルトのW関数の主値として定義される。

方程式の求解への応用[編集]

指数関数を含む方程式の多くは、W関数を用いることで解くことができる。主な方針は、未知数を含む項を方程式の左辺(あるいは右辺)に寄せ、W関数で解を表現できる x ex の形にすることである。例えば、方程式 2^t = 5t を解くには、両辺を 2t で割り、1=5 te(−ln(2) t) と変形する。そして両辺を 5 で割り、−ln(2) を掛ける。すると、−ln(2)5 = −ln(2) t e(−ln(2) t) となる。ここで、W関数を用いれば、−ln(2) t = W(−ln(2)5)、即ち t = −W(ln(2)5)/ln(2) となる。

同様の方法で、xx = z の解は、

x=\frac{\ln(z)}{W(\ln(z))}

あるいは

x=exp(W(ln(z)))

となる。

複素数の無限回の累乗

z^{z^{z^{\cdots}}} \!

が収束するとき、ランベルトのW関数を用いれば、その極限値を次のように表現できる。

c=\frac{W(-\log(z))}{-\log(z)}

ただし、log(z) は複素対数関数主値とする。

関数 W(x)、あるいは W(x) を使って表現される関数の積分は、多くの場合 w=W(x) (即ち、x=we^w) と置換することで解ける。


\int W(x)\, dx =
x \left( W(x) - 1 + \frac{1}{W(x)} \right) 
+ C.

特殊値[編集]

W\left(-\frac{\pi}{2}\right) = \frac{i\pi}{2}

W\left(-{1\over e}\right) = -1

W\left(-\frac{\ln 2}{2}\right)= -\ln 2

W(0) = 0\,

W(e) = 1\,

W(1) = \Omega\,オメガ定数

数値計算[編集]

W関数は、漸化式


w_{j+1}=w_j-\cfrac{w_j e^{w_j}-z}{e^{w_j}(w_j+1)-\cfrac{(w_j+2)(w_je^{w_j}-z)}
{2w_j+2}}

を用いることで数値計算することができる。この計算法は、コーレス(Corless) らによって与えられた。これを計算する Pythonコードを以下に示す。誤差の評価には、Chapeau-Belandeau と Monir によるものを用いている。

#!/usr/bin/env python2
import math
 
class Error(Exception):
    pass
 
def lambertW(x, prec=1e-12):
    w = 0
    for i in xrange(100):
        wTimesExpW = w * math.exp(w)
        wPlusOneTimesExpW = (w+1) * math.exp(w)
        if prec > abs((x-wTimesExpW) / wPlusOneTimesExpW):
            break
        w = w - (wTimesExpW-x)/(
            wPlusOneTimesExpW - (w+2)*(wTimesExpW-x)/(2*w+2))
    else:
        raise Error("W doesn't converge fast enough for {}".format(x))
    return w

これは、x>1/e における主値を計算するものである。初期値の選び方次第で、性能を上げることができる。

以下に示す閉じた形の近似は、さほど精度を要求ない場合や、上のコードに少ない反復回数で優れた初期値を与える際に用いる。

double
desy_lambert_W(double x) {
      double  lx1;
      if (x <= 500.0) {
              lx1 = log(x + 1.0);
              return 0.665 * (1 + 0.0195 * lx1) * lx1 + 0.04;
      }
      return log(x - 4.0) - (1.0 - 1.0/log(x)) * log(log(x));
}

http://www.desy.de/~t00fri/qcdins/texhtml/lambertw/ より)

Mathematica には ProductLog という名前で実装されており、値を対話的な操作で計算したり、解析的な演算 (不定積分、微分など) をしたり、プロットしたりできる[1]。またフリーC言語ライブラリである GNU Scientific Library では gsl_sf_lambert_W0 という名前などで実装されている[2]

関連項目[編集]

脚注[編集]

  1. ^ Wolfram research の解説ページ (英語)
  2. ^ GSL reference manual の Lambert W Functions の項 (英語)

参考文献・外部リンク[編集]