為什麼自然對數表要以神奇的自然常數e為底?

萊昂哈德·歐拉 小智雅匯 2019-06-30

1 對數與對數表

先看下面兩個等式:

(10^2)*(10^3)=10^(2+3)

(10^2)^3=10^(2*3)

似乎用某一種巧妙的方式可以將冪運算轉換為乘運算,乘運算可以轉換為加運算。

這種巧妙的運算就是對數表,對數是指數運算的逆運算,如a^x=N,x就是以a為底,真數N的對數。通過表格的形式建立真數與對數的對應關係,就是對數表。

常用對數是指以10為底的對數。

10的正整數冪的常用對數,等於真數裡0的個數,如lg1000=3;

正數的常用對數的首數,是真數的整數部分的位數減去1的一個整數。如lg97254的首數必然是4;

上述性質也是常用對數稱為常用的原因(後面會敘述自然對數自然的原因)。

對數的運算法則:

log(a) (M·N)=log(a) M+log(a) N

log(a) (M÷N)=log(a) M-log(a) N

log(a) M^n=nlog(a) M

log(a)b*log(b)a=1

log(a) b=log (c) b÷log (c) a

利用常用對數表對乘、冪的化簡運算:

真數表由首列、首行組成,其它是對應的對數。

為什麼自然對數表要以神奇的自然常數e為底?

2 歷史上尋找對數的底的過程

以前人們做乘法就用乘法,很麻煩,發明了對數這個工具後,乘法可以化成加法,即:log(ab) = loga + logb。

但是能夠這麼做的前提是,我要有一張對數表,能夠知道loga和logb是多少,然後求和,能夠知道log多少等於這個和。雖然編對數表很麻煩,但是編好了就是一勞永逸的事情,因此有個大數學家開始編對數表。但他遇到了一個麻煩,就是這個對數表取多少作為底數最合適?10嗎?或是2?為了決定這個底數,他做了如下考慮:

2.1 真數的考量:所有乘數/被乘數都可以化到0-1之內的數乘以一個10的幾次方(科學記數法)。

2.2 底的考量:那麼只考慮做一個0-1之間的數的對數表了,那麼我們自然用一個0-1之間的數做底數(如果用大於1的數做底數,那麼真數(取值0-1之間)取完對數就是負數,不夠直觀)。

2.3 這個0-1間的底數不能太小,比如0.1就太小了,這會導致很多數的對數都是零點幾;而且“相差很大的兩個數的對數值卻相差很小”,比如0.1做底數時,兩個數相差10倍時,對數值才相差1。換句話說,像0.5和0.55這種相差不大的數,如果用0.1做底數,那麼必須把對數表做到精確到小數點以後很多位才能看出他們對數的差別。

2.4 為了避免這種缺點,底數儘量要接近於1,比如0.99就很好,0.9999就更好了。總的來說就是1 - 1/X ,X越大越好。在選了一個足夠大的X(X越大,對數表越精確,但是算出這個對數表就越複雜)後,你就可以算:

(1-1/X)^1 = P1 ,

(1-1/X)^2 = P2 ,

……

那麼對數表上就可以寫上P1的對數值是1,P2的對數值是2……(以1-1/X作為底數)。而且如果X很大,那麼P1、P2、P3、……之間都靠得很緊,基本可以滿足均勻地覆蓋了0.1-1之間的區間。

2.5 最後數學家納皮爾用(1- 1/X)^X作為底,這樣P1的對數值就是1/X,P2的對數值就是2/ X,……PX的對數值就是1,這樣不至於讓一些對數值變得太大,這樣調整之後,各個數的對數值基本在0-1之間。兩個值之間最小的差為1/X。

2.6 讓對數表更精確,那麼X就要更大,數學家算了很多次,1000,1萬,十萬,最後發現,X變大時,這個底數(1 - 1/X)^X趨近於一個值。這個值就是1/e,自然對數底的倒數(雖然那個時候還沒有給它取名字)。其實如果我們第一步不是把所有值放縮到0.1-1之間,而是放縮到1-10之間,那麼同樣的討論,最後的出來的結果就是e了--- 這個大數學家就是著名的歐拉(Euler),自然對數的名字e也就來源於歐拉的姓名。

3 試編碼一個以1.0001為底的對數表

使用C++代碼枚舉:

#include <iostream>
#include <cmath>
using namespace std;
double di = 1.0001;
void main()
{
int n;
for(n=1;n<10;++n)
cout<<di<<"^"<<n<<"\t:"<<pow(di,n)<<endl;
for(n=9990;n<10010;++n)
cout<<di<<"^"<<n<<"\t:"<<pow(di,n)<<endl;
for(n=23020;n<23028;++n)
cout<<di<<"^"<<n<<"\t:"<<pow(di,n)<<endl;
system("pause");
}

運行後結果:

1.0001^1 :1.0001
1.0001^2 :1.0002
1.0001^3 :1.0003
1.0001^4 :1.0004
1.0001^5 :1.0005
1.0001^6 :1.0006
1.0001^7 :1.0007
1.0001^8 :1.0008
1.0001^9 :1.0009
1.0001^9990 :2.71543
1.0001^9991 :2.7157
1.0001^9992 :2.71597
1.0001^9993 :2.71624
1.0001^9994 :2.71652
1.0001^9995 :2.71679
1.0001^9996 :2.71706
1.0001^9997 :2.71733
1.0001^9998 :2.7176
1.0001^9999 :2.71787
1.0001^10000 :2.71815
1.0001^10001 :2.71842
1.0001^10002 :2.71869
1.0001^10003 :2.71896
1.0001^10004 :2.71923
1.0001^10005 :2.71951
1.0001^10006 :2.71978
1.0001^10007 :2.72005
1.0001^10008 :2.72032
1.0001^10009 :2.72059
1.0001^23020 :9.993
1.0001^23021 :9.994
1.0001^23022 :9.995
1.0001^23023 :9.996
1.0001^23024 :9.997
1.0001^23025 :9.998
1.0001^23026 :9.999
1.0001^23027 :10

其中的一個值是:

1.0001^10000 :2.71815

其實就是lim(1+1/n)^n(n→∞)的雛形。

如果以此值為對數的底來編制一張對數表會怎樣?

4 一個最大值問題

假設a*b=N

當a取什麼值時,a^b的值最大?(a,b可以是小數)。

用一個C++程序來枚舉一下:

#include <iostream>
#include <cmath>
using namespace std;
void main()
{
int n=10;
float i=0.1;
for(int k=1;i*k<=n;++k,i*k)
{
cout<<i*k<<"\t ^ "<<n/(i*k)<<"\t="<<pow(i*k,n/(i*k))<<endl;
}
system("pause");
}

輸出:

2 ^ 5 =32
2.1 ^ 4.7619 =34.2277
2.2 ^ 4.54545 =36.0136
2.3 ^ 4.34783 =37.3878
2.4 ^ 4.16667 =38.3896
2.5 ^ 4 =39.0625
2.6 ^ 3.84615 =39.4504
2.7 ^ 3.7037 =39.5953 //最大值位置
2.8 ^ 3.57143 =39.536
2.9 ^ 3.44828 =39.3075
3 ^ 3.33333 =38.9407

當n取不同值時,滿足a*b=n,a在2.7附近時,a^b的值最大。

n、i取任意值,如n=5,i=0.01時,也可以看到這種規律。

設f(x)=x^(K/x),x>0,K是大於0的常數。對f求導,即可得x=e時f取極大值,也是最大值。

二進制存儲的計算機,一個32位的的機器使用了32個1和0,也就是64個元素,可以表達2^32=4.29*10^9個精度的數字。同樣是64個元素,假設表達成3^21.3=1.45*10^10,即使是3^21也有1.05*10^10個精度,也就是說,如果用三進制,可以有更多的組合,而四進制呢?組合數又變小了(其實e進制有最多的組合數)。

5 自然常數e

為什麼自然對數表要以神奇的自然常數e為底?

e^x的泰勒展開式,當x=1時,e=1+1/1!+1/2!+1/3!+1/4!+...+1/n!。

自然常數e又叫銀行家常數。是指當連續複利(計息分期無限擴大,且利滾利)時,本息和不會無限擴大,而是會趨於一個定值,這個定期就與e有關。

為什麼自然對數表要以神奇的自然常數e為底?

連續複利表達式:本金*(1+r/n)^(n*t)=本金*e^(r*t)。其中r是利率,t是期數。

假設本金是1000,年利率是36%,期限是1年。可算得利息和是1360。

如果按月算複利,其本息和是1000*(1+0.36/12)^(12*1)=1425.76。

如果按天算複利,其本息和是1000*(1+0.36/365)^(365*1)=433.08。

如果是連續複利,其本息和是1000*e^0.36=1433.33。

也就是,不管你怎樣對1年進行細分,進行復滾利,其本息和並不會無限擴大,本金是1000,年利率是36%時,其本息和不會超過1433.33。

如果一群單細胞生物每24小時全部分裂一次,單位時間內,持續的指數增長所能達到的極限值就是e,這個值是自然增長的極限。

因為e=2.7182818284... ,極為接近循環小數2.71828(1828循環),那就把循環小數化為分數271801/99990,所以可以用271801/99990表示為e最接近的有理數約率,精確度高達99.9999999(7個9)% 。

6 自然常數e的收斂性

為什麼自然對數表要以神奇的自然常數e為底?

為什麼自然對數表要以神奇的自然常數e為底?

7 比較e^π 與π^e的大小

(e=2.71828……,π=3,14159……)

從上面的最值可以簡單判斷,e*π一定時,當底數接近2.7時,e^π有較大值。

也可從以下思路推理:

為什麼自然對數表要以神奇的自然常數e為底?

為什麼自然對數表要以神奇的自然常數e為底?

可以用計算器計算出相關值:

為什麼自然對數表要以神奇的自然常數e為底?

8 自然常數相關表達式與導數

(x^n)'=nx^(n-1)。

(a^x)'=a^xlnx。

(e^x)' = e^x,其導數(變化率竟然是自身)。

為什麼自然對數表要以神奇的自然常數e為底?

我們一般用指數增長來表示很快的一個增長速度,而指數增長中,其中底數是e的指數增長,是最快速的指數增長。

(logax)'=1/(xlna)。

(lnx)' = 1/x。

為什麼自然對數表要以神奇的自然常數e為底?

自然對數的變化率(導數)是最簡潔的。

9 自然對數表與為什麼用自然常數做為底

先看一下使用自然對數表的一個實例:

為什麼自然對數表要以神奇的自然常數e為底?

試想要編制一張對數表,如果知道了對數函數的變化率(導數),根據相鄰很小間隔(如0.01)的真數就可以求出相鄰的對數值,而自然對數函數的導數是所有對數函數中最簡潔的:

為什麼自然對數表要以神奇的自然常數e為底?

最簡潔的表達式:(lnx)'=1/x,大道至簡,大道自然。

10 用c代碼近似計算e值

10.1 用級數1+1/1!+1/2!+1/3!+1/4!+1/5!+1/6!+...+1/n!+...近似e值

#include "stdafx.h"

#include <math.h>

int factorial(int j)

{

int sum;

if(j == 0)

sum = 1;

if(j == 0)

sum = 1;

else

sum = j * factorial(j-1);

return sum;

}

void main()

{

int i;

double sum1 = 0.0;

for(i=0;i<=12;i++){

sum1 = sum1 + (1.0/factorial(i));

}

printf("0: %d %d %f ",i,factorial(i),sum1);

}

//運行結果:0: 13 1932053504 2.718282

10.2 用公式lim(1+1/n)^n(n→∞)近似e值

#include "stdafx.h"

#include <math.h>

void main()

{

int i;

double sum1,sum2;

for(i=1;i<=10;i++){

sum1 = (1.0+(1.0/i));

sum2 = pow(sum1,i);

printf("%d %f ",i,sum2);

}

printf(" ");

for(i=90;i<=100;i++){

sum1 = (1.0+(1.0/i));

sum2 = pow(sum1,i);

printf("%d %f ",i,sum2);

}

printf(" ");

for(i=99990;i<=100000;i++){

sum1 = (1.0+(1.0/i));

sum2 = pow(sum1,i);

printf("%d %f ",i,sum2);

}

printf(" ");

}

1 2.000000

2 2.250000

3 2.370370

4 2.441406

5 2.488320

6 2.521626

7 2.546500

8 2.565785

9 2.581175

10 2.593742

90 2.703332

91 2.703495

92 2.703654

93 2.703810

94 2.703962

95 2.704112

96 2.704258

97 2.704401

98 2.704542

99 2.704679

100 2.704814

99990 2.718268

99991 2.718268

99992 2.718268

99993 2.718268

99994 2.718268

99995 2.718268

99996 2.718268

99997 2.718268

99998 2.718268

99999 2.718268

100000 2.718268

-End-

相關推薦

推薦中...