2017年11月8日水曜日

C# 数学17 「常用対数、ネイピア数e-基本1、自然対数-基本1」e log ln exp

C# 統計・微分積分・線形代数への道
目次→http://1studying.blogspot.jp/2017/08/senkei-index.html#kuw17

「微分積分」の前知識として、
「常用対数と自然対数、exp、log、ln」について説明、メモ。


ここでは、
「×」を「*」
「÷」や「分数」を「/」
で表現します。



底、真数、指数、対数


真数と対数とは
「真数」と「対数」を求めるには以下のように計算を行います。
  
それぞれの「答え」は、
  「真数を求める = 8」(2の3乗は?、?の答えは8)
  「対数を求める = 3」(2の?乗は8、?の答えは3)
となります。

「底、真数、指数、対数」はそれぞれ以下の部分を指す名称です。
  
「指数」と「対数」は同じ意味を指す言葉ですが、
言い回しによって使い分けます。
  2の3乗の「指数」は3です。(「真数」は8です。)
  2を「底(てい)」とする(「真数」)8の「対数」は3です。
のように使い分けます。


「対数log」、常用対数について


関数電卓で「対数log」を計算
「log」は「対数」が知りたい時に使います。
  「log底真数は対数乗」(底の対数乗が真数)
と覚えます。
(「底(てい)」が何乗されて「真数」になるか=「対数」)
「関数電卓」で「対数」を求める際は、
「log」の「底(てい)」を入力しないで計算を行う事に注意して下さい。
  下図のように「logba = log(a)/log(b) = 対数」として計算します。
  
「log28」を「関数電卓」で計算する場合、
  「log(8) / log(2) = 3」
と計算します。
結果、対数が「3」となり、
  「2を3乗すると8になる」
事が求まりました。

「log」の具体的な計算例は後述『「底の計算公式」計算例』でやるとして、
まずは、
  「関数電卓」で使われる「log()」は「常用対数log10」の省略系である
という事を説明していきます。


「常用対数」について…(log10
「常用対数log10」とは「10を底(てい)とする対数」の事です。
「関数電卓」で使用される「log」は、
「底(てい)」を指定しないと「常用対数log10」として扱います。。
つまり、
  「関数電卓」で、
  「log(1000)」と入力した場合「log101000」と同じ意味。
となります。
  ↓「log101000」のイメージ
  

「関数電卓」によっては、
「log(10,1000)」など「底(てい)」を明示入力出来る機種もありますが、
通常は「log(1000)」のように入力します。
(「常用対数log10」の他に、
「自然対数log」という「ネイピア数eを底(てい)とする対数」も存在します)

注意!
C#のプログラムでは
  「Math.Log10(8)」とすると「常用対数log108」となり、
  「Math.Log(8)」とした場合「自然対数log8」として解釈されます。
  つまり、
  「関数電卓」では「底(てい)」を省略時「常用対数log10」として扱いますが、
  「プログラム」では「底(てい)」を省略時「自然対数log」として扱います。
  「関数電卓」と「プログラム」で省略時の解釈が逆になるので注意が必要です。
後述する
  「C#で常用対数(log10)や自然対数(logeやln)を扱う」
の項でC#での記述例を記載します。


関数電卓の記述で統一
今後学ぶ「微分」などの「ネイピア数e」を頻繁に使う式では、
「自然対数log1000」の式の方を「log1000」と省略する事もあります。
この場合も「関数電卓」とは違う解釈となる為注意が必要です。
  「関数電卓」では
  「log1000」とした場合「常用対数log101000」を指す。
と、厳格に定められています。
このブログでは混乱しないように、
厳格に定められた「関数電卓」の記述方式に統一して説明を行います。



「対数log」の公式


「対数log」の公式4パターン
・定義
  「0 < a」(「a」は「底(てい)」)
  「1 ≠ a」(「a」は「底(てい)」)
  「0 < M」「0 < N」(「MやN」は「真数」)
この「定義」を前提に
「対数log」の公式を4パターン紹介します。

「logの性質」となる公式
  「loga1 = 0」
    「loga1 = log(0)/log(a) = 0/log(a) = 0」
    (答えが対数0なので、
     試しに指数0で計算してみると「a0 = 1」と逆算できます)
  「logaa = 1」
    「logaa = log(a)/log(a) = 1」

「log真数の積」から「対数logの和」への公式
  「logaMN = logaM + logaN = 対数」
  例:「log2(2*4) = log22 + log24 = 1 + 2 = 3」

「log真数の商」から「対数logの差」への公式
  「loga(M/N) = logaM − loga= 対数」
  例:「log2(16/2) = log216 − log22 = 4 − 1 = 3」

「log真数の累乗」から「実数と対数logの積」への公式
  「logaMr = r * loga= 対数」(rは実数)
  例:「log242 = 2 * log24 = 2 * 2 = 4」
    (試しに指数4でを逆算してみると、
     「真数」は「24 = 16 = 42」となります。)
  例:「log39 = log332 = 2 * log33 = 2 * 1 = 2」


「底の変換公式」
この公式は「log」を理解する上で一番重要な公式となりますので、
他の公式とは別に説明します。
定義
  「a b c」は「+の整数」
  「a ≠ 1」「c ≠ 1」(「aとc」には「底(てい)」となる数字が入る)
を前提とした時、
「対数log」から「対数logの商」への「底の変換公式」
  「logab = (logcb) / (logca) = 対数」
  例:「log28 = log48 / log42 = 1.5 / 0.5 = 3」
が成り立ちます。
理解する為にも以下の計算例を確認して下さい。


「底の変換公式」計算例
ここでは「底の変換公式」を使い「対数」を求める際、
「関数電卓」や「筆算」などを使い、具体的な計算を行う例を示します。

・計算例1
  ・「底の変換公式」
  「logab = (logcb) / (logca) = 対数」
での
  分数内の「cの底(てい)」は
  分母と分子で同じ数字で揃えれば幾つであってもかまいません。
「関数電卓」で計算してみます。
  
これと同じ式を
  「cの底(てい)」の数字を変えて計算しても同じ答えとなります
「筆算」で以下のように計算する事が可能です。
  
結果「cの底(てい)」を幾つにしようが答えは同じ、
  「log28」の対数は「3」
となる事が分かります。

・計算例2
「底(てい)」が違う「log」同士の積(掛け算)は、
以下のように「底(てい)」を揃えて分数化して計算を行います。
  
結果、
  「log63・log336」の対数は「2」
となります。
このような「底(てい)」が違う「log」同士の積(掛け算)の場合は、
「底(てい)」が明示入力できる「関数電卓」があると、
計算がとても楽ですね。


常用対数表と自然体数表
「筆算」でlogの計算を求めるのに、
「常用対数表」や「自然体数表」という表を使って調べる方法もあります。
例えば「常用対数表」で「5.02」という数値を調べれば、
「約0.701」とう答えを知る事が出来、
  「log105.02 ≒ 0.701」
と分かります。
ただ、
「関数電卓」で計算すればもっと簡単に正確な答えが出せる為、
「常用対数表」や「自然体数表」の読み方はここでは説明しません。
興味があれば下のリンク先を調べてみて下さい。
→常用対数表の使い方
https://www.khk.or.jp/activities/regalexamination_course/dl/taisuuhyou.pdf
→【対数】「対数表」の見方
http://oto-suu.seesaa.net/article/174112556.html



「ネイピア数e(exp)」、自然対数について


「ネイピア数e(exp)」
「ネイピア数e」は「自然対数e」や「自然対数の底」とも言われる
「定数」(決められた数字)です。
  ・定数「ネイピア数e」
  「e = 2.718281828…」
「ネイピア数e」は小数点がランダムで終わりが無い為「無理数」とも言います。
小数点以下の少数が書き切れないπなどと同じ扱いで、
「e」の数式記号で表記される今後結構重要となる「定数」です。
(微分積分でとても良く使われます)
「e(exp)」の由来は「exponential(指数の)」という意味から来ているそうです。


「ネイピア数e」の別の記述方法
  「e」の「x乗(指数)」を表す時、
    「e
  と記述しますが、
    「exp{ x }」
  のように記述する事も出来、
    
  のように扱います。
また、
  「eを底(てい)とする対数」の事を「自然対数」と言います。
  「自然対数」は
    「log」や「ln」
  のように記述出来ます。
    「log1.648721271 ≒ 0.5」又は「ln 1.648721271 ≒ 0.5」


「自然対数」について…(log又はlnログナチュラル)
「自然対数」とは「ネイピア数eを底(てい)とする対数」の事です。
これは「log」の事を指すのですが、
「関数電卓」では省略して「ln」(ログナチュラル)を使用します。
つまり、
  「関数電卓」で、
  「ln(1)」と入力した場合「log1」と同じ意味。
となります。
  

「関数電卓」によっては、
「log(e,1)」など「底(てい)」を明示入力出来る機種もありますが通常「ln」を使います。
(「自然対数log」の他に、
「常用対数log10」という「10を底(てい)とする対数」も存在します)

注意!
C#のプログラムでは
  「Math.Log10(8)」とすると「常用対数log108」となり、
  「Math.Log(8)」とした場合「自然対数log8」として解釈されます。
  つまり、
  「関数電卓」では「底(てい)」を省略時「常用対数log10」として扱いますが、
  「プログラム」では「底(てい)」を省略時「自然対数log」として扱います。
  「関数電卓」と「プログラム」で省略時の解釈が逆になるので注意が必要です。
後述する
  「C#で常用対数(log10)や自然対数(logeやln)を扱う」
の項でC#記述例を記載します。



常用対数と自然対数の定義


「常用対数(log10)」と「自然対数(logやln)」を使用する時に
理解しておきたい定義を改めてまとめておきます。


常用対数の定義
「常用対数(log10)」の定義
  「底(てい)を10」「真数をx」「指数対数をy」とした時、
  「10y = x」
  「log(x) = log10(x) = ln(x) / ln(10) = log(x) / log(10) = y」
となります。
  


自然対数の定義
「自然対数(logやln)」の定義
  「底(てい)をネイピア数e」「真数をx」「指数対数をy」とした時、
  「ey = x」
  「ln(x) = loge(x) = log(x) / log(e) = y」
となります。
  


対数関数
自然対数 ln(x)、常用対数 log(x)、aを底とする対数 log_a(x)の対数関数を計算
参考→http://keisan.casio.jp/exec/system/1260332465



C#で常用対数(log10)や自然対数(logeやln)を扱う


C#での対数使用例
C#では
「常用対数(log10)」を使用する場合は、
  「Math.Log10(8)」や「1.0/Math.Log(10,8)」
  (「関数電卓」では「log(8)」や「log(10,8)」)
などと記述します。
「自然対数(log又はlnログナチュラル)」を使用する場合は、
  「Math.Log(8)」や「1.0/Math.Log(Math.E,8)」
  (「関数電卓」では「log(e,8)」や「ln(8)」)
などと記述します。
                //常用対数(log10)
                //Log10はそのまま使うと「常用対数」となる
                double log_10a = System.Math.Log10(8);
                //底(てい)を10と明示する(底を明示する場合必ず1.0から割り逆数にする事!)
                double log_10b = 1.0 / System.Math.Log(10, 8); // 1.0から割り逆数にする
                MessageBox.Show(log_10a.ToString()); // →「0.903089986991944」
                MessageBox.Show(log_10b.ToString()); // →「0.903089986991944」

                //自然対数(log eやln)
                //Logはそのまま使うと「自然対数」となる
                double log_e1 = System.Math.Log(8);
                //底(てい)をeと明示する(底を明示する場合必ず1.0から割り逆数にする事!)
                double log_e2 = 1.0 / System.Math.Log(System.Math.E, 8); // 1.0から割り逆数にする
                MessageBox.Show(log_e1.ToString()); // →「2.07944154167984」
                MessageBox.Show(log_e2.ToString()); // →「2.07944154167984」


C#と関数電卓でのlogの違い
「log」の解釈は「関数電卓」と「C#」で変わります。
「関数電卓」では「底(てい)」を省略時「常用対数(log10)」として扱います。
「プログラム」では「底(てい)」を省略時「自然対数(log又はln)」として扱います。
「関数電卓」と「プログラム」で省略時の解釈が逆になるので注意が必要です。
更に、
「プログラム」上で「底(てい)」を明示して計算する時は、
「1.0」から割り数値を逆数にする必要があります。
この点も注意が必要となります。
  「関数電卓」で「log(8)」→「log108」(常用対数)
  「関数電卓」で「log(e,8)」→「log8」(自然対数)
  「関数電卓」で「ln(8)」→「log8」(自然対数)
  「C#」で「Math.Log10(8)」→「log108」(常用対数)
  「C#」で「Math.Log(8)」→「log8」(自然対数)
  「C#」で「1.0/Math.Log(10,8)」→「log108」(常用対数)
  「C#」で「1.0/Math.Log(Math.E,8)」→「log8」(自然対数)



PCや関数電卓で「指数表記e」を扱う際の注意


「E」や「e」を「指数表記」として扱う!?
ちょっとややこしい話なのですが「PCや関数電卓」などでは
「E又はe」の表記を「ネイピア数e」としてではなく、
「×10」の「指数表記」として扱う事があります。

例えば
  「100000」という数字を表すのに以下のように表示します。
    「1E+5」又は「1e+5」
  ここでの「E+5又はe+5」は「×105」の事なので「1×105」となります。
  「1500000」という数字を表すのに以下のように表示します。
    「1.5E+6」又は「1.5e+6」
  ここでの「E+6又はe+6」は「×106」の事なので「1.5×106」となります。
この例のように「E又はe」が「指数表記」として扱われます。

「関数電卓」によっては「指数表記e」を「ネイピア数e」と区別する為に
  「100000」を「1×105
  「1500000」を「1.5×106
のように、
あえて「指数表記e」を使わず分かりやすく表示してくれる電卓もあります。

「C#」のプログラムでは数値と文字列を相互変換する時に、
意図せず「指数表記e」が付いたり外れたりする事があります。
明示的に「指数表記e」を付けたり外したりする為には、
以下ような記述が必要となります。
                // 指数表記を行う
                double testNum1 = 12.3456789;
                MessageBox.Show(testNum1.ToString()); // 「12.3456789」
                MessageBox.Show(testNum1.ToString("E")); // 「1.234568E+001」
                MessageBox.Show(testNum1.ToString("E3")); // 「1.235E+001」
                MessageBox.Show(testNum1.ToString("E2")); // 「1.23E+001」
                MessageBox.Show(testNum1.ToString("0.000000e+0")); // 「1.234568e+1」
                MessageBox.Show(testNum1.ToString("0.000e+0")); // 「1.235e+1」
                MessageBox.Show(testNum1.ToString("0.00e+0")); // 「1.23e+1」

                // 指数表記を外す
                double testNum2 = 0.00001; // ← 勝手に指数表記となってしまう数値
                string testStr2 = "0.######################";
                MessageBox.Show(testNum2.ToString()); // 「1E-05」
                MessageBox.Show(testNum2.ToString(testStr2)); // 「0.0000011」
                MessageBox.Show((10.0).ToString(testStr2)); // 「10」
                MessageBox.Show((12.30).ToString(testStr2)); // 「12.3」
                MessageBox.Show((0).ToString(testStr2)); // 「0」

                // 「指数表記を使用 | カンマ付きの数字文字列を使用」で
                // 文字列 → double変換
                double testNum3 = double.Parse("1.2345E+2", System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.Number);
                MessageBox.Show(testNum3.ToString()); // 「123.45」
                MessageBox.Show(testNum3.ToString("0.######################")); // 「123.45」





以下のサイトを参考にしました。

対数関数
自然対数 ln(x)、常用対数 log(x)、aを底とする対数 log_a(x)の対数関数を計算
http://keisan.casio.jp/exec/system/1260332465

対数とは何なのかとその公式・メリットについて。対数をとるとはどういう意味か?
https://atarimae.biz/archives/12581

対数(LOG)の計算と公式!これでもうバッチリ!!
http://kenyu.red/archives/3132.html

対数 log の公式と計算
https://sci-pursuit.com/math/logarithm-formulae-and-calculation.html

logの計算機での計算方法
http://support.casio.jp/answer.php?cid=004002001001&qid=26860&num=10

logとlnの違い
https://okwave.jp/qa/q224511.html

数学記号exp,ln,lgの意味
https://mathtrain.jp/explnlg

【指数・対数関数】指数と対数の関係
http://kou.benesse.co.jp/nigate/math/a14m1208.html

数学記号の表
https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E8%A8%98%E5%8F%B7%E3%81%AE%E8%A1%A8

数式記号の読み方・表し方
http://izumi-math.jp/sanae/report/suusiki/suusiki.htm



0 件のコメント:

コメントを投稿

↑Topへ