見出し画像

高校数学10分プログラミング(数学Ⅱ編 4.指数関数と対数関数)4日目「対数関数のグラフを描く」

マガジンリスト > 数学Ⅱ編 4.指数関数と対数関数 > 4日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学II編 4.指数関数と対数関数)の4日目です。

本日の課題は、対数関数のグラフを描くプログラムを作成することです。


対数関数

$$
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) }$$


ヒント

アルゴリズム設計

対数関数は、前回の課題『高校数学10分プログラミング(数学Ⅱ編 4.指数関数と対数関数)3日目「対数の値を計算する」』で作成した logarithm 関数を利用することができます。

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

a:底 float型
x:真数 float型
返り値:$${\log_a x}$$の値 float型

たとえば、課題(1)の$${y=\log_2 \frac{x}{2}}$$は、

float y = logarithm(2.0,x/2.0);

と記述することができます。
なお、今回のプログラムでは、対数関数を一般化して

$$
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}$$を引数とした対数関数のグラフを描くための関数 draw_logarithmic_function を準備し、draw_logarithmic_function 関数を setup 関数内で呼び出すことでグラフを描くようにします。また、真数の部分$${k(x-q)}$$が$${k}$$や$${q}$$の値によって定義域が変化するため、今回の対数関数のグラフを描くための関数 draw_logarithmic_function では、定義域についても引数で指定するようにします(以下のソースコード1を参照)。


プログラム

キャンバス上に座標軸を描く関数 setAxes を利用して対数関数のグラフを描くためのスケッチ「drawLogarithmicFunctions」を準備しました。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。

展開または解凍して得られるスケッチ「drawLogarithmicFunctions」の中の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 =
  float q =
  float r =
  float a =
  float k =
  float x_min = 
  float x_max = 
  draw_logarithmic_function(p,q,r,a,k,x_min,x_max);
  
  // (2) y= log_{1/2} 4x(緑色)
  stroke(0,255,0);
  p = 
  q = 
  r = 
  a = 
  k = 
  x_min = 
  x_max = 
  draw_logarithmic_function(p,q,r,a,k,x_min,x_max);
  
  // (3) y= log_3 (9-x)(青色)
  stroke(0,0,255);
  p = 
  q = 
  r = 
  a = 
  k = 
  x_min = 
  x_max = 
  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 スケッチ「drawLogarithmicFunctions」の 「drawLogarithmicFunctions」タブに書かれているコード

このソースコード1は未完成です。各課題の式を$${y = p \log_a k(x-q) + r}$$の形に書き換えて、各係数の変数 p, q, r, a, k の値を算出、定義域の下限と上限の値 x_min と x_max を設定し、setup 関数内に記述してプログラムを完成させてください。
最後に、実行ボタンを押すと、キャンバス上に座標軸とともに課題の対数関数のグラフが描かれるはずです。


それでは、よろしくお願いします。

MK's papa


いいなと思ったら応援しよう!