自然対数とオイラー
1.オイラー以前の対数の存在
このワークシートはMath by Codeの一部です。
<対数の意義と法則>
底がaのとき、
指数関数y=axをpow(a,x)とかくと、
対数関数はx=pow-1(a,y)となり、pow-1をlogとかく。
指数xを対数、正の数yを真数という。
・指数関数:対数x→真数y(xは全実数、値域yは正数)
・対数関数:真数y→対数x(定義域yは正数、xは全実数)
a(底)をy(真数)という結果にするための指数x(対数)を取り出せる。
それが対数関数です。対数の法則は、指数法則の裏返し。
・対数の定義から、logaaN=Nはあきらか。1=logaa、0=loga1
・指数の積の法則から、logaMN=logaM+logaN(2数の積の対数は分解した対数の和)
・指数の積の法則から、logaM/N=logaM-logaN(2数の商の対数は分解した対数の差)
・積の対数が対数の和分解できたことを繰り返すと、logaMk=klogaM(k乗の対数は対数のk倍)
これから、 これを逆にたどって、
<常用対数表を作る苦労>
底が10の対数を常用対数といいます。計算の結果が表になっています。
(常用)対数表です。真数から対数がすぐに出せるのです。
昔は関数電卓とかプログラミング環境がなかったから、とても重宝されたでしょう。
対数という言葉は17世紀はじめにネイピアが使い、その後ブリッグズ、メルカトル、ニュートンらが平方根を大量に反復計算したり、無限級数(無限の数列和)などを使って平方根を計算したり、双曲線での積分を使うなどして、工夫し、苦労して計算されたものが対数表だ。
その後オイラーさんなどが級数展開という再表現をすることで飛躍的に簡単に計算できるようになった。
質問:12.3*45600*31400000/2.72=6474864705882.353を
常用対数表を使うとどんな工夫ができますか。
X=12.3×45600×31400000÷2.72
大きい数のかけ算をするときに対数表の数で10の指数におきかえてたし算する。
・1より大きい数Xは1以上10未満の3桁数Mを使って、浮動小数点表示X=M×10Nにおきかえる。
12.3=1.23×101
45600=4.56×104
31400000=3.14×107
2.72=2.72×100
・log10X=log10(M×10N)=log10M+log1010N=log10M + N
logA*B*C/D=logA+logB+logC-logD
Mは対数表にあるので、表をみてlog10Mは転記して、Nをたします。
log10(1.23×101)=0.0899+1,
log10(4.56×104)=0.6590+4,
log10(3.14×107)=0.4969+7,
log10(2.72×100)=0.4346+0
log10X=0.0899+1 +0.6590+4 +0.4969+7 - 0.4346
1.0899+4.659+7.4969 -0.4346=12.8112
0.8112を対数表から逆読みして、6.4の行の8と7の間、log106.475=0.8112。
12.8112=0.8112+12= log106.475+12=log106.475×1012
結局、1012.8112=6.475×1012
これで、10の12乗のオーダーで上3桁数が647であることがわかる。
2.自然対数
<底がeの自然対数>
オイラー数(ネイピア数)e=2.718281828459...を底にすると、
(ex)の微分=exのため、
微分積分などの数式計算が簡単になります。
そのため、常用対数は数値計算向きでしたが、自然対数は数式計算でよく使われます。
また、eiπ=-1のオイラー等式のように、eは関数や数をつなぐときに登場します。
<自然対数の底eの近似値>
f(x)=exとするとき、
f(x)のマクローリン級数を利用してeの近似値を求めてみよう。
f(k)(x)=exだから、f(k)(0)=1。x=1とおくと、
ex=1 +x +x2/2! +x3/3! +....... +xn/n!+.......
1
1/1=1
1/2!=1/2=0.5
1/3!=0.5/3=0.16666666666666666
1/4!=0.16666666666666666/4=0.04166666666666666
1/5!=0.04166666666666666/5=0.008333333333333331
1/6!=0.00833333333333333/6=0.001388888888888888
1/7!=0.001388888888888888/7=0.00019841269841269831/8!=0.0001984126984126983/8=0.0000248015873015872
から、
e=f(1)=1+1+1/2!+1/3!+1/4!+1/5!+1/6!+1/7!+1/8!
=1+1+0.5+0.16666666666666666+0.04166666666666666+0.008333333333333331
+0.001388888888888888+0.0001984126984126983+0.0000248015873015872
=2.71827876984127
オイラーはマクローリン展開を使わず、二項定理を使って級数展開することで、無限大・無限小の考え方を使って、同じex=1 +x +x2/2! +x3/3! +....... +xn/n!+.......に到達して、近似値を得ている。
さて、プログラミング言語などでは、
底がeの指数関数 y=exを y=EXP(x)とかくことが多い。
底がeの対数関数 y=logexを y=LN(x)=Log(x)とかくことが多く、自然対数。
質問:言語によって、log105、log25と、ln5の表記・記述がちがいます。どんな傾向がありますか。
Python, juliaでは自然対数がデフォルトですが、geogebraでは常用対数がデフォルトです。
教育用の言語なのか、開発用の言語なのかのちがいでしょう。
・juliaではbase=Bとすると、
対数関数は、log(B, x)と、logB(x)という2種類があります。
base=eのときは、指定なしでlog(x)とかきます。
面白いのは、logをexpにして、exp(B,x),expB(x)という指数関数があり、exp(x)はB=eのときです。
・pythonではimport mathか、from math import 関数名をしてから、使いましょう。
・geogebraでは常用対数がデフォルトのようでlog(5)と入力すると、log10(5)に変換されてしまいます。
ほかに、log2, log10のように、底の指定自体が名前になっている関数があるのは、他の言語と同様です。
自然対数lnを使いたければ、底がeの指数関数を使い、E=exp(1)として、E=e1=2.71828...を得て、
log(E,x)とすれば自然対数関数として使えますね。
いろんなlog
3.自然対数から常用対数を計算する
<無限大・無限小>
二項定理(1+x)n=ΣnCr xrのnを実数に拡張したn!により定義されたnCrの拡張版F(n,r)=n!/(n-r)!r!
によって、一般二項定理(1+x)n=ΣF(n,r) xr をニュートンらは使っていた。
オイラーは無限小・無限大という考えと一般2項展開を使って、
対数関数ln(x)を級数展開した。
ただし、ln(x)ではなくln(1+x)だったので注意しよう。
・「かなり小さいωでeω=1+ωとなるかどうか」を実験してみる。
ωという量でeω=1+ωとなるならば、(eωー1)/ω=1となるだろう。
質問:ωを小さくしてω=1+ωとなるかどうかをしらべるにはどうしたらよいでしょうか。
ω=1/10^k (k=5...14)のとき、
(e^ω-1)/ωを順に計算して=約1になるかを調べよう。
[IN]python
##################################################
from math import exp
e=exp(1)
omegas=[1/10**x for x in range(5,15)]
print(omegas)
for omega in omegas:
print((e**omega-1)/omega)
[OUT]
[1e-05, 1e-06, 1e-07, 1e-08, 1e-09, 1e-10, 1e-11, 1e-12, 1e-13, 1e-14]
1.000005000006965
1.0000004999621837
1.0000000494336803
0.999999993922529
1.000000082740371
1.000000082740371
1.000000082740371
1.000088900582341
0.9992007221626409
0.9992007221626409
ちょうど1にはならないが、なりそうそう。
無限小のωならなるかもしれないので、仮定してみよう。
無限小ωという量で指数表現でeω=1+ωとなるなら、対数表現で、ln(1+ω)=ωとなるね。
・十分大きいjに対してjω=jln(1+ω)=ln(1+ω)j>1となる。
どんなxでもx=(1+ω)j-1となるjがとれる。
質問:どんなxでもx=(1+ω)j-1となるjがとれそうな感じをつかむにはどうしますか。
小さめのωに対して、大きいjを動かして、x=(1+ω)j-1の値が連続的に変わりそうなことを確かめよう。
たとえば、
ω=0.001=1/10**2として、
js=[101,.....,999]とする。
jo = j*ω
lj = ln((1+ω)**j)
とすると、joとljはかなり近い。
x=(1+ω)**j-1は単調に増加してくれるならば、
逆にxを指定して、jを決めることができるという
感じがつかめでしょう。
[IN]Python
##################################################
from math import log as ln
ω=1/10**2
js=[x for x in range(10**2+1,10**3)]
for j in js:
jo=j*ω
lj=ln((1+ω)**j)
x=(1+ω)**j-1
print(jo,lj,x)
[OUT]
1.01 1.0049834161699773 1.7318619677157439
1.02 1.0149337470231454 1.7591805873929012
1.03 1.0248840778763135 1.7867723932668302
1.04 1.0348344087294816 1.8146401171994988
1.05 1.0447847395826495 1.8427865183714935
1.06 1.0547350704358178 1.8712143835552086
1.07 1.0646854012889857 1.8999265273907606
1.08 1.0746357321421538 1.9289257926646681
1.09 1.0845860629953221 1.9582150505913152
.........
.......
.........
.......
9.88 9.830926882930074 18599.186432989674
9.89 9.840877213783243 18785.188297319568
9.9 9.850827544636411 18973.050180292765
9.91 9.860777875489578 19162.790682095692
9.92 9.870728206342747 19354.42858891665
9.93 9.880678537195916 19547.982874805817
9.94 9.890628868049083 19743.472703553874
9.950000000000001 9.900579198902252 19940.917430589416
9.96 9.910529529755419 20140.33660489531
9.97 9.920479860608587 20341.74997094426
9.98 9.930430191461756 20545.177470653703
9.99 9.940380522314923 20750.639245360242
よさそうな結果だね。
・それでは、
どんなxでもx=(1+ω)j-1となるjがとれると仮定しよう。
こらから、1+x=(1+ω)j=(eω)j=ejω。ln(1+x)=jω。
また、逆算して、ω=(1+x)1/j-1となる。
そこで、一般二項定理を使うと、
ln(1+x)=jω=j((1+ω)1/j-1)
=j(1+(1/j)x+(1/j)(1/j-1)/2!x2+(1/j)(1/j-1)(1/j-2)/3!x3+.........) - j
=x - (j-1)/2jx2 + (j-1)(2j-1)/(2!j3j)x3- (j-1)(2j-1)(3j-1)/(2j3j4j)x4+.........) - j
jが無限大なら、(j-1)/2j=1/2,(2j-1)/3j=2/3,(3j-1)/4j=3/4,...となり、
jを使った係数はxの指数と同じ数以外が相殺されて消える。
だから、.
x=-xとおくと、.
これから、
これを公式として利用すると、
p(1/3)=ln(1+1/3)/(1-1/3)
=ln2=2(1/3+(1/3)3/3+(1/3)5/5+....)=0.69313...,
p(1/9)=ln(1+1/9)/(1-1/9)
=ln(5/4)=2(1/9+(1/9)3/3+(1/9)5/5+....)=0.22314...
ln5=ln(5/4×(2^2))=ln(5/4)+2ln2=0.22314+2(0.69313)=1.60941。
ln10=ln2+ln5=0.69313+1.60941=2.30254
log10(5)=ln5/ln10=1.60941/2.30254=0.69897。
このように自然対数を計算して、底の変換公式で常用対数を求めることができる。