見出し画像

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


はじめに

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

指数関数

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

指数関数

$$
y=a^r \ (a >0, \ a \neq 1)
$$

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

$$
p < q \Leftrightarrow a^p < a^q
$$

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

$$
p < q \Leftrightarrow a^p > a^q
$$

③ グラフは点$${(0,1), \ (1,a)}$$を通り、$${x}$$軸が漸近線

図1 指数関数のグラフ


指数関数のグラフを描く

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

問題
次の関数のグラフを描け。
(1) $${ y = 2^x + 3 }$$
(2) $${ y = 2^{x-3} }$$
(3) $${ y = 8 \cdot 2^x }$$
(4) $${ y = \frac{2^{-x}}{4} }$$

アルゴリズム設計

指数関数は、記事『高校数学をプログラミングで解く(数学II編)「4-1 指数の拡張」』でも利用した、pow 関数を利用することができます。

pow(p, r);

p:べき乗の底 float型
r:べき指数 float型
返り値:$${p^r}$$の値 float型

たとえば、問題(1)の$${y=2^x+3}$$は、

float y = pow(2.0,x)+3.0;

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

$$
y = Aa^x+B \ \ (A,B,a\mathrm{は実数で}、A \neq 0, a >0 )
$$

の形にして、これら$${A,B,a}$$を引数とした指数関数のグラフを描くための関数を準備することにします。その結果、問題(1)は、

$$
y = 2^x+3 \rightarrow A=1, B=3, a=2
$$

問題(2)は

$$
y = 2^{x-3} = \frac{1}{8} 2^x \rightarrow A=\frac{1}{8}, B=0, a=2
$$

問題(3)は

$$
y = 8 \cdot 2^x \rightarrow A=8, B=0, a=2
$$

問題(4)は

$$
y = \frac{2^{-x}}{4} = \frac{1}{4} \left( \frac{1}{2} \right)^x \rightarrow A=\frac{1}{4}, B=0, a=\frac{1}{2}
$$

とそれぞれ$${A,B,a}$$を設定することで指数関数のグラフを描くことができます。

プログラム

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

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=2^x + 3(黒色)
  stroke(0,0,0);  
  float A = 1.0;
  float B = 3.0;
  float a = 2.0;
  draw_exponential_function(A, B, a);
  
  // (2) y=2^{x-3}(赤色)
  stroke(255,0,0);
  A = 1.0/8.0;
  B = 0.0;
  a = 2.0;
  draw_exponential_function(A, B, a);
  
  // (3) y=8・2^x(緑色)
  stroke(0,255,0);
  A = 8.0;
  B = 0.0;
  a = 2.0;
  draw_exponential_function(A, B, a);

  // (4) y=2^x / 4(青色)
  stroke(0,0,255);
  A = 1.0/4.0;
  B = 0.0;
  a = 0.5;
  draw_exponential_function(A, B, a);

}

// 指数関数のグラフy = A a^x + Bを描く関数
void draw_exponential_function(
  float A, // 指数関数の係数 
  float B, // 指数関数の漸近線
  float a  // 底
){
  // グラフの定義域
  float x_min = -x_range;
  float x_max = x_range;
  int plot_num = 200; // グラフを描くための頂点の個数  
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標 
  beginShape();
  for(int i=0; i<=plot_num; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 指数関数上の点のx座標
    y = A * pow(a,x) + B; // 指数関数上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

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

ソースコード1で、指数関数$${y=Aa^x+B}$$のグラフを描く関数を draw_exponential_function という名前で準備しています。記事『高校数学をプログラミングで解く(数学II編)「2-1 直線の方程式」』で作成したスケッチ「drawEquationOfLine1」の中で定義した直線を描く関数 draw_equation_of_line1 との違いは、引数のほか、

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

の部分を変更しただけとなっています。

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

図2 4つの指数関数のグラフ

まとめ

今回は、数学IIで学ぶ「指数関数」について、指数関数のグラフを描くプログラムを作成しました。
指数関数は、記事『高校数学をプログラミングで解く(数学II編)「4-1 指数の拡張」』でも利用した、pow 関数を利用することができました。また、記事『高校数学をプログラミングで解く(数学II編)「2-1 直線の方程式」』で作成したスケッチやその中で定義した直線の関数を再利用することで、比較的簡単に指数関数のグラフを描く関数を準備することができたのではないでしょうか。このように、プログラムを再利用することはプログラムを作成する際によく行うことですので、慣れていってください。

参考文献

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

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