「ランベルトのW関数」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Alembert (会話 | 投稿記録)
translate from en. 一部、対応する日本語が不明な単語があります。
 
Alembert (会話 | 投稿記録)
m 時間遅れ微分方程式 -> 遅延微分方程式
10行目: 10行目:
関数 <math>f</math> は <math>(-\infin, 0)</math> において[[単射]]ではないため、関数 <math>W</math> は <math>[-1/e, 0)</math> で[[多価関数|多価]]となる。もし、[[定義域]]を[[実数]] <math>x \ge -1/e</math>、[[値域]]を <math>w \ge -1</math> に制限するとすれば、グラフで示した[[一価関数]] <math>W_0(x)</math> が定義される。特に、<math>W_0(0)=0</math>, <math>W_0(-1/e)=-1</math> である。
関数 <math>f</math> は <math>(-\infin, 0)</math> において[[単射]]ではないため、関数 <math>W</math> は <math>[-1/e, 0)</math> で[[多価関数|多価]]となる。もし、[[定義域]]を[[実数]] <math>x \ge -1/e</math>、[[値域]]を <math>w \ge -1</math> に制限するとすれば、グラフで示した[[一価関数]] <math>W_0(x)</math> が定義される。特に、<math>W_0(0)=0</math>, <math>W_0(-1/e)=-1</math> である。


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


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

2006年3月22日 (水) 12:54時点における版

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

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

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

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

関数 において単射ではないため、関数 多価となる。もし、定義域実数 値域 に制限するとすれば、グラフで示した一価関数 が定義される。特に、, である。

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

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

の 0 近傍におけるテイラー級数は、Lagrange inversion theorem を用いると求めることができ、次式で与えられる。

ダランベールの収束判定法によると、収束半径 である。この級数によって定義された関数は、定義域が複素数全体で、ブランチカット(branch cut) を区間 に持つ正則関数に拡張することができる。この関数は、ランベルトのW関数の主値として定義される。

方程式の求解への応用

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

同様の方法で、

の解は、

あるいは

となる。

複素数の無限回の累乗

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

ただし、複素対数関数の主値とする。

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

特殊値

オメガ定数

数値計算

W関数は、漸化式

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

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 %f"%x
	return w

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

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

 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/ より)

参考文献・外部リンク