eを計算する方法はたくさんある。ここでは二つの方法を書いておく。
1. 級数
exの x=1 におけるテイラー展開を求めてやると、次のような級数表現が得られる。
この級数表現をプログラムにすると、次のようになる。
(defun e (n) "級数表現にもとづいてeを計算" (if (< n 0) 0.0 (+ (/ 1.0 (fact n)) (e (- n 1))))) => e (defun fact (n) "階乗を計算" (if (<= n 0) 1 (* n (fact (- n 1))))) => fact (e 5) => 2.7166666666666663
n=1 から n=20 までの実行結果。
(2.0 2.5 2.6666666666666665 2.708333333333333 2.7166666666666663 2.7180555555555554 2.7182539682539684 2.71827876984127 2.7182815255731922 2.7182818011463845 2.718281826198493 2.718281808918177 2.7182818042763013 2.7182818091495133 2.718281802164987 2.7182817951863503 2.718281799212947 2.7182818049171673 2.7182818140377822 2.7182818360880554)
プロットしてみた。
2. 一般連分数
具体的な式は、「ネイピア数の表現 - Wikipedia」の「II. 一般連分数による表現」に書いてある。これを漸化式の形で書くと、
1, 2, ... と増えていく部分を i で表すと、
さらに、 j = n - i つまり i = n - j と変換すると、
これをプログラムで表現すると、
(defun e (n) "一般連分数による表現にもとづいてeを計算" (labels ((f (j) (cond ((= n j) (+ 2 (/ 1.0 (f (1- j))))) ((zerop j) n) (t (+ (- n j) (/ (float (- n j)) (f (1- j)))))))) (f n))) => e (e 5) => 2.7184466019417477
※浮動小数点数で計算するために、一箇所だけfloat
関数を使っている。
n=1 から n=20 までの実行結果。
(3.0 2.6666666666666665 2.7272727272727275 2.7169811320754715 2.7184466019417477 2.718263331760264 2.71828369389345 2.7182816576664037 2.7182818427778273 2.7182818273518743 2.718281828538486 2.718281828453728 2.7182818284593786 2.7182818284590256 2.7182818284590464 2.718281828459045 2.7182818284590455 2.7182818284590455 2.7182818284590455 2.7182818284590455)
1の方法で求めた図に重ねてプロットしてみた(赤い点)。
0 件のコメント:
コメントを投稿