見出し画像

高校数学をプログラミングで解く(数学II編)「5-8 面積」

マガジンリスト > 数学Ⅱ編 5.微分法と積分法 > 5-8 面積


はじめに

今回は、数学IIで学ぶ「(積分を利用した)面積」について、図形の面積を台形公式を用いて数値計算するプログラムを作成します。

面積の公式

まず、面積の公式について解説しておきます。

面積の公式

区間$${a \leq x \leq b}$$で考えます。

① 常に$${f(x) \geq 0}$$のとき、曲線$${y=f(x)}$$と$${x}$$軸、および2直線$${x=a, \ x=b}$$で囲まれた図形の面積$${S}$$は、

$$
S= \int_a^b f(x)dx = \int_a^b y dx
$$

図1 面積の公式

② 常に$${f(x) \geq g(x)}$$のとき、2曲線$${y=f(x), \ y=g(x)}$$、および2直線$${x=a, \ x=b}$$で囲まれた図形の面積$${S}$$は、

$$
S=\int_a^b \{f(x)-g(x) \} dx
$$

台形公式を用いた面積の計算

今回は、以下の面積を求める問題を台形公式を用いて数値的に求めてみます。

問題
次の曲線や直線で囲まれた図形の面積を求めよ。
(1) $${y=x^2+4, \ x=-2, \ x=3, \ y=0}$$
(2) $${y=x^2-3x+5, \ y=2x-1}$$

アルゴリズム設計

問題(1)の面積$${S_1}$$は、

$$
S_1 = \int_{-2}^3 ( x^2+4 ) dx
$$

を台形公式を用いて計算するだけです。
問題(2)の面積$${S_2}$$を求めるためには少し前処理が必要です。図2に$${y=x^2-3x+5}$$と$${y=2x-1}$$のグラフを描いています。面積を求めたい領域はグラフで挟まれた灰色の領域になります。

図2 問題(2)のグラフ

図2から、面積を求めたい領域では、

$$
2x-1 \geq x^2-3x+5 
$$

となっています。また、積分領域は、方程式$${2x-1 = x^2-3x+5}$$を解いて$${x = 2,3}$$が得られるので、

$$
2 \leq x \leq 3
$$

となります。したがって、問題(2)の面積$${S_2}$$は、

$$
S_2 = \int_2^3 \{ (2x-1) - (x^2-3x+5) \} dx
$$

を台形公式を用いて計算することができます。

問題(1)のプログラム

それでは、まず問題(1)について、面積を台形公式を用いて数値計算するプログラムを作成します。
今回の問題は記事『高校数学をプログラミングで解く(数学II編)「5-6 定積分(1)」』で作成したスケッチ「calc_definite_integral」がほぼそのまま利用できます。

// 面積を台形公式を利用して計算するプログラム
void setup(){

  // (1) 
  float a = 0.0; // x^3の係数
  float b = 1.0; // x^2の係数
  float c = 0.0; // x の係数
  float d = 4.0; // 定数項
  float l = -2.0; // 積分領域の下限
  float r = 3.0; // 積分領域の上限
  float res1 = trapezoidal_rule_cubic_function(a,b,c,d,l,r);
  println("(1):", res1);

}

// 3次関数
float f(
  float a, // x^3の係数
  float b, // x^2の係数
  float c, // xの係数
  float d, // 定数項
  float x 
){
  return a*x*x*x + b*x*x + c*x + d;
}

// 3次関数に対する定積分を計算する関数
float trapezoidal_rule_cubic_function(
  float a, // x^3の係数
  float b, // x^2の係数
  float c, // x の係数
  float d, // 定数項
  float l, // 積分領域の下限
  float r // 積分領域の上限
){
  float dx = 0.01;
  int division_num = (int)((r-l)/dx);
  float x, y1, y2;
  float dintegral = 0.0;
  for(int i=0; i<division_num; i++){
    x = l + i*dx;
    y1 = f(a,b,c,d,x);
    y2 = f(a,b,c,d,x+dx);
    dintegral = dintegral + (y1+y2)*dx/2.0;
  }
  return dintegral;
}

ソースコード1 問題(1)の面積を台形公式を用いて数値計算するプログラム

問題(1)の被積分関数は2次関数になりますが、スケッチ「calc_definite_integral」で3次関数に関する定積分を台形公式を用いて数値計算する関数 trapezoidal_rule_cubic_function を準備して利用していましたので、$${x^3}$$の係数を$${0}$$に設定して、この関数をそのまま利用しています。

ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「calc_area_1」としています)、テキストエディタ部分に書いて実行します。

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

図3のように、問題(1)の面積の計算結果がコンソールに出力されます。

(1): 31.666748

なお、解析的に求めた結果は、

$$
\mathrm{(1):}\frac{95}{3}
$$

となります。これらと比較すると、数値計算結果は丸め誤差より少し大きな誤差にはなっているようですが、比較的小さな誤差範囲で数値計算できていることがわかります。

問題(2)のプログラム

次に、問題(2)について、面積を台形公式を用いて数値計算するプログラムを作成します。
このプログラムは、問題(1)で作成したスケッチ「calc_area_1」を少し修正するだけでほぼそのまま利用できます。

// 面積を台形公式を利用して計算するプログラム
void setup(){

  // (2) 
  float a = 0.0; // x^3の係数
  float b = -1.0; // x^2の係数
  float c = 2.0-(-3.0); // x の係数
  float d = -1.0-(5.0); // 定数項

  // bx^2+cx+d=0の2つの実数解
  float x1 = (-c + sqrt(c*c-4.0*b*d))/2.0/b;
  float x2 = (-c - sqrt(c*c-4.0*b*d))/2.0/b;

  float l, r; // 積分領域の下限、上限
  if( x1 < x2 ){
    l = x1; 
    r = x2;
  } else {
    l = x2;
    r = x1;
  }
  
  float res2 = trapezoidal_rule_cubic_function(a,b,c,d,l,r);
  println("(2):", res2);

}

// 3次関数
float f(
  float a, // x^3の係数
  float b, // x^2の係数
  float c, // xの係数
  float d, // 定数項
  float x 
){
  return a*x*x*x + b*x*x + c*x + d;
}

// 3次関数に対する定積分を計算する関数
float trapezoidal_rule_cubic_function(
  float a, // x^3の係数
  float b, // x^2の係数
  float c, // x の係数
  float d, // 定数項
  float l, // 積分領域の下限
  float r // 積分領域の上限
){
  float dx = 0.01;
  int division_num = (int)((r-l)/dx);
  float x, y1, y2;
  float dintegral = 0.0;
  for(int i=0; i<division_num; i++){
    x = l + i*dx;
    y1 = f(a,b,c,d,x);
    y2 = f(a,b,c,d,x+dx);
    dintegral = dintegral + (y1+y2)*dx/2.0;
  }
  return dintegral;
}

ソースコード2 問題(2)の面積を台形公式を用いて数値計算するプログラム

アルゴリズム設計のところで、問題(2)の積分領域は$${[2,3]}$$となっていることを解析的に求めていますが、ソースコード2では、2次方程式の解の公式を利用して数値的に計算するようにしています。

ソースコード2を、Processingの開発環境ウィンドウを開いて(スケッチ名を「calc_area_2」としています)、テキストエディタ部分に書いて実行します。

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

図4のように、問題(2)の面積の計算結果がコンソールに出力されます。

(2): 0.16665

解析的に求めた結果は、

$$
\mathrm{(2):}\frac{1}{6}
$$

となりますので、こちらも比較的小さな誤差範囲で数値計算できていることがわかります。

まとめ

今回は、数学IIで学ぶ「(積分を利用した)面積」について、図形の面積を台形公式を用いて数値計算するプログラムを作成しました。
なお、今回のプログラムは記事『高校数学をプログラミングで解く(数学II編)「5-6 定積分(1)」』で作成したスケッチ「calc_definite_integral」をほぼそのまま利用することができました。
今回のアルゴリズム設計で1点物足りないと感じたことは、問題(2)でそれぞれの関数を描いて(図2参照)、図を見ながら、面積を求めたい領域で

$$
2x-1 \geq x^2-3x+5 
$$

となっていることを判断したところです。この判断は、できればプログラムの中で行いたいところです。この判断については、たとえば、積分範囲の中央の位置$${x=2.5}$$での$${2x-1}$$と$${x^2-3x+5}$$との値を比較するだけでも十分そうです。これを踏まえて、是非プログラム(ソースコード2)の改良にチャレンジしてみてください。

参考文献

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

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