見出し画像

高校数学をプログラミングで解く(数学II編)「5-6 定積分(1)」

マガジンリスト > 数学Ⅱ編 5.微分法と積分法 > 5-6 定積分(1)


はじめに

今回は、数学IIで学ぶ「定積分」について、特に3次関数を被積分関数とする定積分を台形公式を用いて数値計算するプログラムを作成します。

定積分

まず、定積分について解説しておきます。

定積分

$${k,l}$$は定数とする。

① 定義 関数$${f(x)}$$の不定積分の1つを$${F(x)}$$とするとき

$$
\int_a^b f(x) dx = \left[ F(x) \right]_a^b = F(b)-F(a)
$$

$$
\int_a^b \{ kf(x)+lg(x) \} dx = k \int_a^b f(x) dx  + l \int_a^b g(x) dx
$$

$$
\int_a^b f(x) dx = \int_a^b f(t) dt, \ \ \int_a^a f(x) dx = 0, \ \ \int_b^a f(x) dx = - \int_a^b f(x) dx
$$

$$
\int_a^b f(x) dx = \int_a^c f(x) dx + \int_c^b f(x) dx
$$

台形公式(定積分の数値計算)

定積分をコンピュータで数値的に計算する方法のひとつである 台形公式 について解説します。

台形公式は、図1のように関数$${f(x)}$$の$${a}$$から$${b}$$までの積分領域を$${n}$$個の部分に分割し、分割した各部分の面積を台形の面積で近似して足し合わせることで定積分の値を計算する方法です。

図1 台形公式

具体的には、まず$${\Delta x}$$を積分範囲の大きさ$${b-a}$$と比較して十分小さな値をもつ定数で、かつ

$$
n= \frac{b-a}{\Delta x}
$$

が整数となるように、調整して決めます。このようにして決めた$${\Delta x}$$を用いると、$${x_i}$$は、

$$
x_i = a +i\Delta x \ \ (i=0,1,2,\cdots,n)
$$

となります。なお、$${x_0 = a, \ \ x_n = b}$$となります。このとき、図1の分割した各部分を台形で近似したときの面積は

$$
\frac{1}{2} (f(x_i)+f(x_{i+1})) \Delta x \ \ (i=0,1,2,\cdots,n-1)
$$

と計算することができます。したがって、定積分は、

$$
\int_a^b f(x) dx = \sum_{i=0}^{n-1} \left[ \frac{1}{2} (f(x_i)+f(x_{i+1})) \Delta x \right]
$$

で計算することができます。

定積分を計算する

今回は、以下の定積分を台形公式を用いて数値計算するプログラムを作成します。

問題
(1) $${ \int_0^2 (6x^2-1)dx }$$
(2) $${ \int_1^2 (-3) dx }$$
(3) $${ \int_0^1 (3x^2+2x-1) dx }$$
(4) $${ \int_2^4 (x-1)(x-2) dx }$$
(5) $${ \int_{-2}^3 (x-2)^2 dx }$$
(6) $${ \int_{-1}^3 (x+1)^2(x-1) dx }$$

プログラムの設計

今回は、問題(1),(3)-(5)の被積分関数が2次関数、問題(2)の被積分関数が定数、問題(6)の被積分関数が3次関数となっているので、被積分関数が

$$
f(x) = ax^3+bx^2+cx+d
$$

の形をもつ定積分を台形公式を用いて計算する関数を準備して問題を解いていくことにします。なお、問題(4)-(6)の被積分関数は、それぞれ
(4) $${(x-1)(x-2) = x^2-3x+2}$$
(5) $${(x-2)^2 = x^2-4x+4 }$$
(6) $${(x+1)^2(x-1) = x^3+x^2-x-1 }$$
と展開した形にして台形公式を利用します。

プログラム

それでは、定積分を台形公式を用いて数値計算するプログラムを作成します。

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

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

// 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では、特に3次関数に関する定積分を台形公式を用いて数値計算する関数 trapezoidal_rule_cubic_function を準備して利用しました。

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

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

図1のように、各問題の定積分の計算結果がコンソールに出力されます。

(1): 14.0002
(2): -2.9999976
(3): 1.0000498
(4): 4.666698
(5): 21.666739
(6): 21.333597

各問題を解析的に求めた結果は、それぞれ

$$
\mathrm{(1):}14, \mathrm{(2):}-3, \mathrm{(3):}1, \mathrm{(4):}\frac{14}{3}, \mathrm{(5):} \frac{65}{3}, \mathrm{(6):}\frac{64}{3}
$$

となります。これらと比較すると、数値計算結果は丸め誤差より少し大きな誤差にはなっているようです。ただ、台形公式は定積分を近似的に数値計算するものなので、これくらいの誤差は出てもおかしくないと考えます。

まとめ

今回は、数学IIで学ぶ「定積分」について、特に3次関数を被積分関数とする定積分を台形公式を用いて数値計算するプログラムを作成しました。
定積分の数値計算方法として台形公式はよく利用される方法です。ただ、台形公式は近似的に数値計算する方法なので、やはり誤差はある程度出てきます。この定積分の数値計算の誤差をできるだけ減らすような方法が他にありますが、この記事では、これ以上触れないことにします。Webで調べてみるといろいろ出てくると思いますので、興味のある方はぜひ他の計算方法も調べて実装してみてください。そして、台形公式と比較してみて下さい。

参考文献

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

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