見出し画像

高校数学をプログラミングで解く(数学II編)「4-4 対数関数」

マガジンリスト > 数学Ⅱ編 4.指数関数と対数関数 > 4-4 対数関数


はじめに

今回は、数学IIで学ぶ「対数関数」について、対数関数のグラフを描くプログラムを作成します。

対数関数

まず、対数関数について解説しておきます。

対数関数

$$
y=\log_a x \ (a >0, \ a \neq 1)
$$

① 定義域は正の数全体、値域は実数全体
② $${ a>1 }$$のとき $${x}$$の値が増加すると$${y}$$の値も増加

$$
0 < p < q \Leftrightarrow \log_a p < \log_a q
$$

 $${0 < a < 1}$$のとき $${x}$$の値が増加すると$${y}$$の値は減少

$$
0 < p < q \Leftrightarrow \log_a p > \log_a q
$$

③ グラフは点$${(1,0), \ (a,1)}$$を通り、$${y}$$軸が漸近線
④ $${y=\log_a x}$$と$${y=a^x}$$のグラフは、$${y=x}$$に関して対称

図1 対数関数のグラフ

対数関数のグラフを描く

今回は、いくつかの対数関数のグラフを描くプログラムを作成します。

問題
次の関数のグラフを描け。
(1) $${ y = \log_2 \frac{x}{2} }$$
(2) $${ y = \log_{\frac{1}{2}} 4x }$$
(3) $${ y = \log_3 (9-x) }$$

アルゴリズム設計

対数関数は、記事『高校数学をプログラミングで解く(数学II編)「4-3 対数とその性質」』でのスケッチ「calc_logarithms」内で作成した関数 logarithm を再利用することができます。

// 底aを持つ対数を計算する関数
float logarithm(
  float a, // 底
  float x  // 真数
){
  return log(x)/log(a);
}

なお、今回のプログラムでは、対数関数を一般化して

$$
y = p \log_a k(x-q) + r \ \ (p,q,r,a\mathrm{は実数で}、p \neq 0, a >0, k = 1  \mathrm{or} -1 )
$$

の形にして、これら$${p, q, r, a, k}$$を引数とした対数関数のグラフを描くための関数を準備することにします。また、今回の対数関数のグラフを描くための関数では、定義域についても引数で指定するようにします。理由としては、真数の部分$${k(x-q)}$$が$${k}$$や$${q}$$の値によって定義域が変化するからです。この定義域の変化も考慮して対数関数のグラフを描くための関数を作成することもできますので、皆さんチャレンジしてみてください。
対数関数のグラフを描くための関数をこのように準備することにより、問題(1)は、

$$
y = \log_2 \frac{x}{2} = \log_2 x -1 \rightarrow p=1, q=0, r = -1, a=2, k=1, x>0
$$

問題(2)は

$$
y = \log_{\frac{1}{2}} 4x = \log_{\frac{1}{2}} x -2 \rightarrow p=1, q=0, r = -2, a=0.5, k=1, x>0
$$

問題(3)は

$$
y = \log_3 (9-x) = \log_3 \{ -(x-9) \} \\ \ \ \ \ \ \rightarrow p=1, q=9, r = 0, a=3, k=-1, x<9
$$

とそれぞれ$${p, q, r, a, k}$$と定義域を設定することで対数関数のグラフを描くことができます。

プログラム

それでは、対数関数のグラフを描くプログラムを作成します。
今回は、座標軸を描くための関数 setAxes をもっていることや、対数関数のグラフを描くための関数を準備しやすさなどを考慮して、記事『高校数学をプログラミングで解く(数学II編)「4-2 指数関数」』で作成したスケッチ「drawExponentialFunctions」を再利用して作成していきます。
スケッチ「drawExponentialFunctions」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「drawLogarithmicFunctions」と変更し、またスケッチ「drawLogarithmicFunctions」内の「drawExponentialFunctions.pde」ファイルの名前を「drawLogarithmicFunctions.pde」に変更します。そして、pdeファイル「drawLogarithmicFunctions.pde」をダブルクリックしてスケッチ「drawLogarithmicFunctions」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「drawLogarithmicFunctions」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。

float x_range = 10.0; // x軸の表示範囲 -x_rangeからx_rangeまで
float y_range = 10.0; // y軸の表示範囲 -y_rangeからy_rangeまで 

void setup(){
  size(500,500);
  noLoop();

  setAxes(x_range, y_range); // 座標軸の準備
  
  noFill();
  
  // (1) y= log_2 x/2(赤色)
  stroke(255,0,0);  
  float p = 1.0;
  float q = 0.0;
  float r = -1.0;
  float a = 2.0;
  float k = 1.0;
  float x_min = 0.0;
  float x_max = x_range;
  draw_logarithmic_function(p,q,r,a,k,x_min,x_max);
  
  // (2) y= log_{1/2} 4x(緑色)
  stroke(0,255,0);
  p = 1.0;
  q = 0.0;
  r = -2.0;
  a = 0.5;
  k = 1.0;
  x_min = 0.0;
  x_max = x_range;
  draw_logarithmic_function(p,q,r,a,k,x_min,x_max);
  
  // (3) y= log_3 (9-x)(青色)
  stroke(0,0,255);
  p = 1.0;
  q = 9.0;
  r = 0.0;
  a = 3.0;
  k = -1.0;
  x_min = -x_range;
  x_max = 9.0;
  draw_logarithmic_function(p,q,r,a,k,x_min,x_max);

}

// 底aを持つ対数を計算する関数
float logarithm(
  float a, // 底
  float x  // 真数
){
  return log(x)/log(a);
}

// 対数関数のグラフy = p log_a k(x-q) + rを描く関数
void draw_logarithmic_function(
  float p, // 対数関数の係数 
  float q, // 対数関数の漸近線
  float r, // y軸方向の移動
  float a, // 底
  float k, // xの符号 1 or -1
  float x_min, // グラフの定義域の下限
  float x_max  // グラフの定義域の上限
){
  int plot_num = 2000; // グラフを描くための頂点の個数  
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標 
  beginShape();
  for(int i=1; i<plot_num; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 対数関数上の点のx座標
    y = p * logarithm(a,k*(x-q)) + r; // 対数関数上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

ソースコード1 指数関数のグラフを描くプログラム

ソースコード1で、対数関数$${y = p \log_a k(x-q) + r}$$のグラフを描く関数を draw_logarithmic_function という名前で準備しています。記事『高校数学をプログラミングで解く(数学II編)「4-2 指数関数」』で作成したスケッチ「drawExponentialFunctions」の中で定義した指数関数を描く関数 draw_exponential_function との違いは、引数のほか、

y = A * pow(a,x) + B; // 指数関数上の点のyの値

の部分と、定義域が開区間であることを考慮してforループの部分を

  for(int i=1; i<plot_num; i++){

と変更しただけとなっています。

ソースコード1を、スケッチ「drawLogarithmicFunctions」の「drawLogarithmicFunctions」タブのテキストエディタ部分に書いて実行すると、図2のように、実行ウィンドウのキャンバス上に問題の3つの対数関数のグラフが(1) 赤色、(2) 緑色、(3) 青色で描かれます。

図2 3つの対数関数のグラフ

まとめ

今回は、数学IIで学ぶ「対数関数」について、対数関数のグラフを描くプログラムを作成しました。
対数関数は、記事『高校数学をプログラミングで解く(数学II編)「4-3 対数とその性質」』でのスケッチ「calc_logarithms」内で作成した関数 logarithm を再利用することができました。また、記事『高校数学をプログラミングで解く(数学II編)「4-2 指数関数」』で作成したスケッチ「drawExponentialFunctions」やその中で定義した指数関数の関数を再利用することで、比較的簡単に対数関数のグラフを描く関数を準備することができました。
今回、対数関数を描くための関数 draw_logarithmic_function では定義域を引数で指定するようにしましたが、定義域は引数に指定せず、関数のその他の引数$${k, q}$$での場合分けにより自動的に算出することができます。是非このような関数の改良を行ってみてください。

参考文献

改訂版 教科書傍用 スタンダード 数学II(数研出版、ISBN9784410209369)

この記事が気に入ったらサポートをしてみませんか?