見出し画像

高校数学をプログラミングで解く(数学III編)「5-2 いろいろな関数の導関数」

割引あり

マガジンリスト > 数学Ⅲ編 5.微分法 > 5-2 いろいろな関数の導関数


はじめに

今回は、数学IIIで学ぶ「いろいろな関数の導関数」について、三角関数、対数関数、指数関数の導関数が正しく算出されていることを確かめるためのプログラムを作成していきます。

いろいろな関数の導関数

まず、三角関数、対数・指数関数の導関数について解説しておきます。

三角関数の導関数

$$
\mathrm{①} \ ( \sin x)'=\cos x \ \ \ \ \ \ \mathrm{②} \ (\cos x)' = -\sin x \ \ \ \ \ \ \mathrm{③} \ (\tan x)' = \frac{1}{\cos^2 x}  
$$

対数・指数関数の導関数

$${a > 0, \ a \neq 1}$$とする。

自然対数の底$${e}$$の定義

$$
e = \lim_{k \to 0} (1+k)^{\frac{1}{k}} = 2.71828 \cdots
$$

対数関数の導関数

$$
( \log|x|)' = \frac{1}{x}, \ \ \ \ \ \ (\log_a|x|)' = \frac{1}{x \log a}, \ \ \ \ \ \ \{\log |f(x)| \}' = \frac{f'(x)}{f(x)}
$$

指数関数の導関数

$$
( e^x)' = e^x, \ \ \ \ \ \ (a^x)'=a^x \log a
$$

いろいろな関数の導関数を確認する

今回は、上記で説明した三角関数の導関数、対数関数の導関数、指数関数の導関数について、それぞれ左辺を数値微分で計算したものと右辺の関数とをグラフに描いて比較することで導関数が正しく算出されているかを確認してみます。

sin 関数の導関数を確認する

まず、三角関数のうち、sin 関数の導関数が正しく算出されているかを確認してみます。

$$
( \sin x)'=\cos x
$$

アルゴリズム設計

基本的には、記事『高校数学をプログラミングで解く(数学III編)「5-1 微分係数と導関数」』で各公式が正しく機能しているかを確かめた手順と同様のものになります。

① 左辺の$${( \sin x)'}$$は、数値微分(前方差分)を用いて計算を行います。

$$
( \sin x)' = \frac{\sin(x+\Delta x)-\sin x}{\Delta x}
$$

② ①で求めた数値微分による導関数のグラフと右辺の関数($${\cos x}$$)のグラフを描きます。これらのグラフが一致すれば、sin 関数の導関数が cos 関数であると考えることができます。

プログラム

それでは、sin 関数の導関数が正しく算出されているかを確認するためのプログラムを作成していきます。

今回は、記事『高校数学をプログラミングで解く(数学III編)「5-1 微分係数と導関数」』で作成したスケッチ「check_product_formula」を再利用して作成していきます。以下の zip ファイルをダウンロードして展開または解凍してください。

そして、スケッチの名前(フォルダ名)を「check_derivative_sin」と変更し、またスケッチ「check_derivative_sin」内の「check_product_formula.pde」ファイルの名前を「check_derivative_sin.pde」に変更します。そして、pdeファイル「check_derivative_sin.pde」をダブルクリックしてスケッチ「check_derivative_sin」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「check_derivative_sin」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。


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

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

  setAxes(x_range, y_range); // 座標軸の準備
  noFill();
  
  // グラフの描画範囲  
  float x_min = -x_range;
  float x_max = x_range;
  
  // sin の数値微分による導関数のグラフを描く
  stroke(0,255,0);  
  strokeWeight(5);
  draw_dsin(x_min, x_max);

  // sin の導関数 cos のグラフを描く
  stroke(255,0,0);
  strokeWeight(2);
  draw_cos(x_min, x_max);

}

// 関数 sin の数値微分による導関数
float dsin(
  float x
){
  float dx = 0.001;
  return (sin(x+dx)-sin(x))/dx;
}

// 数値微分による導関数 dsin を描く関数
void draw_dsin(
  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 = dsin(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

// sin の導関数 cos x を描く関数
void draw_cos(
  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 = cos(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

ソースコード1 sin 関数の導関数が正しく算出されているかを確認するためのプログラム

ソースコード1で、sin 関数の数値微分による導関数を dsin 関数として準備しています。なお、この導関数は前方差分を用いて算出しており、差分$${ \Delta x}$$は変数 dx = 0.001 で表しています。そして、左辺の導関数 dsin と右辺の関数($${ \cos x}$$)のグラフを描くための関数をそれぞれ draw_dsin 関数と draw_cos 関数として準備し、これらの関数を setup 関数内で呼び出すことでグラフを描いています。

ソースコード1を、スケッチ「check_derivative_sin」の「check_derivative_sin」タブのテキストエディタ部分に書いて実行すると、図1のように、実行ウィンドウのキャンバス上に左辺の数値微分による導関数$${( \sin x)'}$$のグラフが緑色の太線で、右辺の関数$${\cos x}$$のグラフが赤色の線でそれぞれ描かれます。

図1 スケッチ「check_derivaive_sin」の実行結果

図1を見ると、左辺の数値微分による導関数$${( \sin x)'}$$のグラフと右辺の関数$${\cos x}$$のグラフが重なっています。つまり、これは sin 関数の導関数が$${\cos x}$$であることを示唆しています。

cos 関数の導関数を確認する

次は、cos 関数の導関数が正しく算出されているかを確認してみます。

$$
( \cos x)'=-\sin x
$$

アルゴリズム設計

アルゴリズムについては、上記で sin 関数の導関数を考えたときと同様です。

① 左辺の$${( \cos x)'}$$は、数値微分(前方差分)を用いて計算を行います。

$$
( \cos x)' = \frac{\cos(x+\Delta x)-\cos x}{\Delta x}
$$

② ①で求めた数値微分による導関数のグラフと右辺の関数($${-\sin x}$$)のグラフを描きます。これらのグラフが一致すれば、cos 関数の導関数が $${-\sin x}$$であると考えることができます。

プログラム

それでは、$${\cos x}$$の導関数が正しく算出されているかを確認するためのプログラムを作成していきます。

先程作成したスケッチ「check_derivative_sin」を再利用します。スケッチ「check_derivative_sin」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「check_derivative_cos」と変更し、またスケッチ「check_derivative_cos」内の「check_derivative_sin.pde」ファイルの名前を「check_derivative_cos.pde」に変更します。そして、pdeファイル「check_derivative_cos.pde」をダブルクリックしてスケッチ「check_derivative_cos」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「check_derivative_cos」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。

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

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

  setAxes(x_range, y_range); // 座標軸の準備
  noFill();
  
  // グラフの描画範囲  
  float x_min = -x_range;
  float x_max = x_range;
  
  // cos の数値微分による導関数のグラフを描く
  stroke(0,255,0);  
  strokeWeight(5);
  draw_dcos(x_min, x_max);

  // cos の導関数 -sin のグラフを描く
  stroke(255,0,0);
  strokeWeight(2);
  draw_minus_sin(x_min, x_max);

}

// 関数 cos の数値微分による導関数
float dcos(
  float x
){
  float dx = 0.001;
  return (cos(x+dx)-cos(x))/dx;
}

// 数値微分による導関数 dcos を描く関数
void draw_dcos(
  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 = dcos(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

// cos の導関数 -sin x を描く関数
void draw_minus_sin(
  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 = -sin(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

ソースコード2 cos 関数の導関数が正しく算出されているかを確認するためのプログラム

ソースコード2で、cos 関数の数値微分による導関数を dcos 関数として準備しています。なお、この導関数は前方差分を用いて算出しており、差分$${ \Delta x}$$は変数 dx = 0.001 で表しています。そして、左辺の導関数 dcos と右辺の関数($${ -\sin x}$$)のグラフを描くための関数をそれぞれ draw_dcos 関数と draw_minus_sin 関数として準備し、これらの関数を setup 関数内で呼び出すことでグラフを描いています。

ソースコード2を、スケッチ「check_derivative_cos」の「check_derivative_cos」タブのテキストエディタ部分に書いて実行すると、図2のように、実行ウィンドウのキャンバス上に左辺の数値微分による導関数$${( \cos x)'}$$のグラフが緑色の太線で、右辺の関数$${-\sin x}$$のグラフが赤色の線でそれぞれ描かれます。

図2 スケッチ「check_derivaive_cos」の実行結果

図2を見ると、左辺の数値微分による導関数$${( \cos x)'}$$のグラフと右辺の関数$${-\sin x}$$のグラフが重なっています。つまり、これは cos 関数の導関数が$${-\sin x}$$であることを示唆しています。

tan 関数の導関数を確認する

今度は、tan 関数の導関数が正しく算出されているかを確認してみます。

$$
( \tan x)'=\frac{1}{\cos^2 x}
$$

アルゴリズム設計

アルゴリズムについては、上記で sin 関数の導関数を考えたときと同様です。

① 左辺の$${( \tan x)'}$$は、数値微分(前方差分)を用いて計算を行います。

$$
( \tan x)' = \frac{\tan(x+\Delta x)-\tan x}{\Delta x}
$$

② ①で求めた数値微分による導関数のグラフと右辺の関数($${1/\cos^2 x}$$)のグラフを描きます。これらのグラフが一致すれば、tan 関数の導関数が $${1/\cos^2 x}$$であると考えることができます。

プログラム

それでは、$${\tan x}$$の導関数が正しく算出されているかを確認するためのプログラムを作成していきます。

先程作成したスケッチ「check_derivative_sin」を再利用します。スケッチ「check_derivative_sin」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「check_derivative_tan」と変更し、またスケッチ「check_derivative_tan」内の「check_derivative_sin.pde」ファイルの名前を「check_derivative_tan.pde」に変更します。そして、pdeファイル「check_derivative_tan.pde」をダブルクリックしてスケッチ「check_derivative_tan」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「check_derivative_tan」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。

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

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

  setAxes(x_range, y_range); // 座標軸の準備
  noFill();
  
  // グラフの描画範囲  
  float x_min = -x_range;
  float x_max = x_range;
  
  // cos の数値微分による導関数のグラフを描く
  stroke(0,255,0);  
  strokeWeight(5);
  draw_dtan(x_min, x_max);

  // cos の導関数 -sin のグラフを描く
  stroke(255,0,0);
  strokeWeight(2);
  draw_cos_minus2(x_min, x_max);

}

// 関数 tan の数値微分による導関数
float dtan(
  float x
){
  float dx = 0.001;
  return (tan(x+dx)-tan(x))/dx;
}

// 数値微分による導関数 dtan を描く関数
void draw_dtan(
  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 = dtan(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

// tan の導関数 1/cos^2 x を描く関数
void draw_cos_minus2(
  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 = 1.0/cos(x)/cos(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

ソースコード3 tan 関数の導関数が正しく算出されているかを確認するためのプログラム

ソースコード3で、tan 関数の数値微分による導関数を dtan 関数として準備しています。なお、この導関数は前方差分を用いて算出しており、差分$${ \Delta x}$$は変数 dx = 0.001 で表しています。そして、左辺の導関数 dtan と右辺の関数($${1/\cos^2 x}$$)のグラフを描くための関数をそれぞれ draw_dtan 関数と draw_cos_minus2 関数として準備し、これらの関数を setup 関数内で呼び出すことでグラフを描いています。
また、$${\tan x}$$は$${x = \pi/2 + n \pi}$$($${n}$$は整数)で不連続ですので、今回は$${x}$$軸方向の表示範囲を$${-1.5}$$から$${1.5}$$までに設定することで不連続点を避けています。ただし、$${y}$$軸方向の表示範囲は$${-5}$$から$${5}$$までに設定していますので、$${x}$$軸方向と$${y}$$軸方向とでスケールが異なっていることに注意が必要です。

ソースコード3を、スケッチ「check_derivative_tan」の「check_derivative_tan」タブのテキストエディタ部分に書いて実行すると、図3のように、実行ウィンドウのキャンバス上に左辺の数値微分による導関数$${( \tan x)'}$$のグラフが緑色の太線で、右辺の関数$${1/\cos^2 x}$$のグラフが赤色の線でそれぞれ描かれます。

図3 スケッチ「check_derivaive_tan」の実行結果

図3を見ると、左辺の数値微分による導関数$${( \tan x)'}$$のグラフと右辺の関数$${1/\cos^2 x}$$のグラフが重なっています。つまり、これは tan 関数の導関数が$${1/\cos^2 x}$$であることを示唆しています。

対数関数の導関数を確認する

今度は、対数関数の導関数が正しく算出されているかを確認してみます。

$$
( \log |x|)'=\frac{1}{x}
$$

アルゴリズム設計

アルゴリズムについては、上記で sin 関数の導関数を考えたときと同様です。

① 左辺の$${( \log |x|)'}$$は、数値微分(前方差分)を用いて計算を行います。

$$
( \log |x|)' = \frac{\log|x+\Delta x|-\log |x|}{\Delta x}
$$

② ①で求めた数値微分による導関数のグラフと右辺の関数($${1/x}$$)のグラフを描きます。これらのグラフが一致すれば、対数関数の導関数が $${1/x}$$であると考えることができます。

プログラム

それでは、対数関数の導関数が正しく算出されているかを確認するためのプログラムを作成していきます。

先程作成したスケッチ「check_derivative_sin」を再利用します。スケッチ「check_derivative_sin」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「check_derivative_logarithm」と変更し、またスケッチ「check_derivative_logarithm」内の「check_derivative_sin.pde」ファイルの名前を「check_derivative_logarithm.pde」に変更します。そして、pdeファイル「check_derivative_logarithm.pde」をダブルクリックしてスケッチ「check_derivative_logarithm」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「check_derivative_logarithm」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。

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

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

  setAxes(x_range, y_range); // 座標軸の準備
  noFill();
  
  // グラフの描画範囲  
  float x_min = -x_range;
  float x_max = x_range;
  
  // 対数関数の数値微分による導関数のグラフを描く
  stroke(0,255,0);  
  strokeWeight(5);
  draw_dlog(x_min, x_max);

  // 対数関数の導関数 1/x のグラフを描く
  stroke(255,0,0);
  strokeWeight(2);
  draw_x_inverse(x_min, x_max);

}

// 対数関数の数値微分による導関数
float dlog(
  float x
){
  float dx = 0.001;
  return (log(abs(x+dx))-log(abs(x)))/dx;
}

// 数値微分による導関数 dlog を描く関数
void draw_dlog(
  float x_min, // グラフの定義域の下限
  float x_max  // グラフの定義域の上限
){
  int plot_num = 2000; // グラフを描くための頂点の個数  
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標 
  // x < 0の領域を描画
  beginShape();
  for(int i=1; i<plot_num/2; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 曲線上の点のx座標
    y = dlog(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();
  // x > 0の領域を描画
  beginShape();
  for(int i=plot_num/2+1; i<plot_num; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 曲線上の点のx座標
    y = dlog(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();
}

// 対数関数の導関数 1/x を描く関数
void draw_x_inverse(
  float x_min, // グラフの定義域の下限
  float x_max  // グラフの定義域の上限
){
  int plot_num = 2000; // グラフを描くための頂点の個数  
  
  // グラフを描画
  float x, y; // 関数の座標
  float X, Y; // キャンバス上の座標 
  // x < 0の領域を描画
  beginShape();
  for(int i=1; i<plot_num/2; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 曲線上の点のx座標
    y = 1.0/x; // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();
  // x > 0の領域を描画
  beginShape();
  for(int i=plot_num/2+1; i<plot_num; i++){
    x = x_min + (x_max - x_min) / plot_num * i; // 曲線上の点のx座標
    y = 1.0/x; // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

ソースコード4 対数関数の導関数が正しく算出されているかを確認するためのプログラム

ソースコード4で、対数関数の数値微分による導関数を dlog 関数として準備しています。なお、この導関数は前方差分を用いて算出しており、差分$${ \Delta x}$$は変数 dx = 0.001 で表しています。そして、左辺の導関数 dlog と右辺の関数($${1/x}$$)のグラフを描くための関数をそれぞれ draw_dlog 関数と draw_x_inverse 関数として準備し、これらの関数を setup 関数内で呼び出すことでグラフを描いています。
また、$${\log |x|}$$は$${x = 0}$$で発散しますので、今回は$${x < 0}$$の領域と$${x > 0}$$の領域とに分けてグラフを表示するようにしています。

ソースコード4を、スケッチ「check_derivative_logarithm」の「check_derivative_logarithm」タブのテキストエディタ部分に書いて実行すると、図4のように、実行ウィンドウのキャンバス上に左辺の数値微分による導関数$${( \log |x|)'}$$のグラフが緑色の太線で、右辺の関数$${1/ x}$$のグラフが赤色の線でそれぞれ描かれます。

図4 スケッチ「check_derivaive_logarithm」の実行結果

図4を見ると、左辺の数値微分による導関数$${( \log |x|)'}$$のグラフと右辺の関数$${1/ x}$$のグラフが重なっています。つまり、これは 対数関数の導関数が$${1/x}$$であることを示唆しています。

指数関数の導関数を確認する

最後に、指数関数の導関数が正しく算出されているかを確認してみます。

$$
(e^x)'=e^x
$$

アルゴリズム設計

アルゴリズムについては、上記で sin 関数の導関数を考えたときと同様です。

① 左辺の$${( e^x)'}$$は、数値微分(前方差分)を用いて計算を行います。

$$
( e^x)' = \frac{e^{x+\Delta x}-e^x}{\Delta x}
$$

② ①で求めた数値微分による導関数のグラフと右辺の関数($${e^x}$$)のグラフを描きます。これらのグラフが一致すれば、指数関数の導関数が $${e^x}$$であると考えることができます。

プログラム

それでは、指数関数の導関数が正しく算出されているかを確認するためのプログラムを作成していきます。

先程作成したスケッチ「check_derivative_sin」を再利用します。スケッチ「check_derivative_sin」をフォルダごとコピーして、スケッチの名前(フォルダ名)を「check_derivative_exponential」と変更し、またスケッチ「check_derivative_exponential」内の「check_derivative_sin.pde」ファイルの名前を「check_derivative_exponential.pde」に変更します。そして、pdeファイル「check_derivative_exponential.pde」をダブルクリックしてスケッチ「check_derivative_exponential」の開発環境ウィンドウを立ち上げます。開発環境ウィンドウのタブ欄で「check_derivative_exponential」タブを選択し、そのテキストエリアのソースコードを以下で書き換えます。

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

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

  setAxes(x_range, y_range); // 座標軸の準備
  noFill();
  
  // グラフの描画範囲  
  float x_min = -x_range;
  float x_max = x_range;
  
  // 指数関数の数値微分による導関数のグラフを描く
  stroke(0,255,0);  
  strokeWeight(5);
  draw_dexponential(x_min, x_max);

  // 指数関数の導関数 e^x のグラフを描く
  stroke(255,0,0);
  strokeWeight(2);
  draw_exponential(x_min, x_max);

}

// 指数関数の数値微分による導関数
float dexponential(
  float x
){
  float dx = 0.001;
  return (exp(x+dx)-exp(x))/dx;
}

// 数値微分による導関数 dexponential を描く関数
void draw_dexponential(
  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 = dexponential(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

// 指数関数の導関数 e^x を描く関数
void draw_exponential(
  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 = exp(x); // 曲線上の点のyの値
    // キャンバス上の座標位置に換算
    X = width / 2.0 / x_range * x;
    Y = height / 2.0 / y_range * y;
    vertex(X, Y);
  }
  endShape();

}

ソースコード5 指数関数の導関数が正しく算出されているかを確認するためのプログラム

ソースコード5で、指数関数の数値微分による導関数を dexponential 関数として準備しています。なお、この導関数は前方差分を用いて算出しており、差分$${ \Delta x}$$は変数 dx = 0.001 で表しています。そして、左辺の導関数 dexponential と右辺の関数($${e^x}$$)のグラフを描くための関数をそれぞれ draw_dexponential 関数と draw_exponential 関数として準備し、これらの関数を setup 関数内で呼び出すことでグラフを描いています。

あと、指数関数はこれまで pow 関数を用いて表してきました(記事『高校数学をプログラミングで解く(数学II編)「4-2 指数関数」』を参照)が、自然対数の底$${e}$$を底とする指数関数$${e^x}$$については exp 関数が用意されています。

exp(x)

x:べき指数 float型

ソースコート5では、この exp 関数を利用して実装しています。

ソースコード5を、スケッチ「check_derivative_exponential」の「check_derivative_exponential」タブのテキストエディタ部分に書いて実行すると、図5のように、実行ウィンドウのキャンバス上に左辺の数値微分による導関数$${( e^x)'}$$のグラフが緑色の太線で、右辺の関数$${e^x}$$のグラフが赤色の線でそれぞれ描かれます。

図5 スケッチ「check_derivaive_exponential」の実行結果

図5を見ると、左辺の数値微分による導関数$${( e^x)'}$$のグラフと右辺の関数$${e^x}$$のグラフが重なっています。つまり、これは 指数関数の導関数が$${e^x}$$であることを示唆しています。

まとめ

今回は、数学IIIで学ぶ「いろいろな関数の導関数」について、三角関数、対数関数、指数関数の導関数が正しく算出されていることを確かめるためのプログラムを作成しました。
確かめ方は、記事『高校数学をプログラミングで解く(数学III編)「5-1 微分係数と導関数」』で各公式が正しく機能しているかを確かめたときと同様に、左辺を数値微分により表した導関数のグラフと右辺の関数のグラフを描き、これらのグラフが一致すれば、導関数が正しく算出されていると考えました。

対数関数の導関数

$$
(\log_a|x|)' = \frac{1}{x \log a}, \ \ \ \ \ \ \{\log |f(x)| \}' = \frac{f'(x)}{f(x)}
$$

や、指数関数の導関数

$$
(a^x)'=a^x \log a
$$

についても、$${a}$$や$${f(x)}$$を与えて、同様な方法で確かめることができます。演習問題としましたので、是非やってみてください。


読んだ感想などをお寄せください

本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。感想、質問をいただいた方には本記事の演習問題の解答をプレゼントします。(お問合せフォームの本文に、本記事のタイトルを入れてください。)


参考文献

改訂版 教科書傍用 スタンダード・オリジナル 数学III(数研出版、ISBN9784410209567)


演習問題

対数関数の導関数

$$
(\log_a|x|)' = \frac{1}{x \log a}, \ \ \ \ \ \ \{\log |f(x)| \}' = \frac{f'(x)}{f(x)}
$$

や、指数関数の導関数

$$
(a^x)'=a^x \log a
$$

について、これらの導関数が正しく算出されているかを確かめるプログラムを作成してください。なお、

$$
a=2, \ \ f(x) = x^2+1
$$

としてください。


演習問題の解答例

ここから先は

1,318字 / 3画像 / 3ファイル

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

この記事が気に入ったらチップで応援してみませんか?