高校数学をプログラミングで解く(数学II編)「4-3 対数とその性質」
マガジンリスト > 数学Ⅱ編 4.指数関数と対数関数 > 4-3 対数とその性質
はじめに
今回は、数学IIで学ぶ「対数とその性質」について、対数の値を計算するプログラムを作成します。
対数
まず、対数とその性質について解説しておきます。
対数とその性質
$${a>0, \ a \neq 1}$$;$${M>0, \ N>0}$$;$${p}$$は実数、$${n}$$は自然数
① 定義
$$
a^p =M \Leftrightarrow p = \log_a M \ \ \ \ \log_a a^p = p
$$
特に
$$
\log_a a = 1, \ \ \log_a 1=0, \ \ \log_a \frac{1}{a} = -1
$$
② 性質
$$
\log_a MN = log_a M + \log_a N, \ \ \log_a \frac{M}{N} = \log_a M - \log_a N
$$
$$
\log_a M^p = p \log_a M, \ \ \log_a \frac{1}{N} = - \log_a N, \ \ \log_a \sqrt[n]{M} = \frac{1}{n} \log_a M
$$
③ 底の変換公式
$${b>0, \ \ b \neq 0}$$のとき
$$
\log_a M = \frac{\log_b M}{\log_b a}
$$
対数の値を計算する
今回は、次の対数の値を計算するプログラムを作成します。
問題
次の対数の値を計算せよ。
(1) $${ \log_6 4 + \log_6 9 }$$
(2) $${ \log_{10} 25 + \log_{10} 4 }$$
(3) $${ \log_3 18 - \log_3 2 }$$
(4) $${ \log_2 2\sqrt{6} - \log_2 \sqrt{3}}$$
(5) $${ 2 \log_2 \sqrt{2} - \frac{1}{2} \log_2 3 + \log_2 \frac{\sqrt{3}}{2} }$$
アルゴリズム設計
Processingでは、任意の底を持つような対数を計算する関数は用意されておらず、自然対数と呼ばれる底$${e = 2.718 \cdots }$$の対数を計算する関数 log のみ用意されています。
log(x);
x:真数 float型
返り値:xの自然対数の値 float型
つまり、この関数 log は、$${ \log_e x}$$の値を返します。
そこで、今回任意の底を持つような対数を計算する関数を自前で準備します。上記で説明した対数の性質③底の変換公式を利用すると、
$$
\log_a x = \frac{ \log_e x}{ \log_e a}
$$
と変換することができるので、底$${a}$$を持つ対数を計算する関数 logarithm は、
// 底aを持つ対数を計算する関数
float logarithm(
float a, // 底
float x // 真数
){
return log(x)/log(a);
}
とすればよいことがわかります。
あとは、この関数を利用して問題の式の値を計算するプログラムを作成していきます。今回の問題は対数の性質②を利用すると、
(1) $${ \log_6 4 + \log_6 9 =2}$$
(2) $${ \log_{10} 25 + \log_{10} 4 =2 }$$
(3) $${ \log_3 18 - \log_3 2 =2}$$
(4) $${ \log_2 2\sqrt{6} - \log_2 \sqrt{3} = 1.5}$$
(5) $${ 2 \log_2 \sqrt{2} - \frac{1}{2} \log_2 3 + \log_2 \frac{\sqrt{3}}{2} = 0 }$$
と式変形だけで計算することができますが、今回は敢えてそれぞれの式の各対数部分に logarithm 関数を適用して計算することします。
プログラム
それでは、対数の値を計算するプログラムを作成します。
// 対数を計算する
void setup(){
// (1)
float a01 = logarithm(6.0,4.0) + logarithm(6.0, 9.0);
println("(1):", a01);
// (2)
float a02 = logarithm(10.0,25.0) + logarithm(10.0, 4.0);
println("(2):", a02);
// (3)
float a03 = logarithm(3.0,18.0) - logarithm(3.0, 2.0);
println("(3):", a03);
// (4)
float a04 = logarithm(2.0,2.0*sqrt(6.0)) - logarithm(2.0, sqrt(3.0));
println("(4):", a04);
// (5)
float a05 = 2.0*logarithm(2.0,sqrt(2.0)) - 0.5 * logarithm(2.0, 3.0)
+ logarithm(2.0, sqrt(3.0)/2.0);
println("(5):", a05);
}
// 底aを持つ対数を計算する関数
float logarithm(
float a, // 底
float x // 真数
){
return log(x)/log(a);
}
ソースコード1 対数の値を計算するプログラム
ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「calc_logarithms」としています)、テキストエディタ部分に書いて実行します。
図1のように、コンソールに各問題の値が出力されます。
(1): 2.0
(2): 2.0
(3): 2.0
(4): 1.5
(5): -8.940697E-8
これらの結果は丸め誤差の範囲内で正しく得られています。なお、最後の「-8.940697E-8」はあまり出てきていませんでしたが、$${-8.940697 \times 10^{-8}}$$を表しています。つまり、丸め誤差の範囲では 0 となっています。
まとめ
今回は、数学IIで学ぶ「対数とその性質」について、対数の値を計算するプログラムを作成しました。
Processingでは、任意の底を持つような対数を計算する関数は用意されておらず、自然対数と呼ばれる底$${e = 2.718 \cdots }$$の対数を計算する関数 log のみ用意されていますので、log 関数と対数の性質③底の変換公式を利用して、任意の底をもつ対数の値を計算する関数を自前で用意することにしました。
このように、公式などを利用、工夫して関数を作っていくことはプログラミングでよく行うことなので、少しずつ慣れていってください。
参考文献
改訂版 教科書傍用 スタンダード 数学II(数研出版、ISBN9784410209369)
この記事が気に入ったらサポートをしてみませんか?