関数の積分

今回の授業では一次元の関数の積分を考えます。

復習

Wikipediaの定積分の定義を引用し、積分の概念を復習します。

実数直線上の区間 [a, b] 上で定義される実変数 x の関数 f の定積分 $$\int_a^b f(x) dx$$ は、略式的に言えば f のグラフと x-軸、および x = a と x = b で囲まれる xy-平面の領域の符号付面積として定義される。

定積分のイメージ

現代的な積分の概念はリーマン積分、ルベーグ積分などの考え方があります。今回の授業はリーマン積分の定義を考察します。

1. 積分の概念の導入

始めに、$x = 0$ から $x = 1$ までの間で $f(x)=\sqrt{x}+1$ によって与えられる曲線$y = f (x)$ を考え、 0 から 1 までの区間において $f$ の下にある領域の面積はいくらか という問いを立てて、この(未知の)面積を$f$の積分と呼んで

$$\int_{0}^{1}{\sqrt {x}}+1~ dx $$

で書き表す。

積分の例

ニュートンとライプニッツが提案した微分積分学の基本定理(17世紀)によりますと、上記の積分を$f(x)$の原始関数$F(x)=\frac{2}{3}x^{3/2}+x$を利用することで算出できます。

$$\int_{0}^{1}{\sqrt {x}}+1dx = F(1) - F(0) = \frac{5}{3}$$

微分積分学の基本定理が発見されるまで、積分は微分とは関係ない「面積」という概念で理解されています。

2. 面積の近似方法

$f(x)=\sqrt{x}+1$ が$[0,1]$における積分の近似方法を考えます。

まず、曲線$y=f(x)$のグラフを描きます。

In [47]:
%関数fを定義する
function value=f(x)
    value = sqrt(x)+1;
end

% グラフを描くOctaveの関数を定義します。
function draw_f()
   x=0:0.001:1;
   y=f(x);
   plot(x,y,'r-');
   hold on %現在グラフの上に新しいグラフを描く(重ねて)
   grid on  %grid を描く
   plot(0,0) %原点を描く
   axis([0, 1.2, 0, 2.2], "square"); %x軸の範囲を[0,1.2]、y軸の範囲を[0,2.2]にする。
end
In [19]:
#x=0.25におけるfの値
f(0.25)
ans =  1.5000
In [20]:
%新しく作ったdraw_fという関数を呼び出して、グラフを描きます。
draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a

Step1:長方形によって、面積の上界と下界を定める

最初の近似として、0から1までの範囲で、x軸 $y = 0$と線分$y = f(1)=2$囲んでいる長方形領域は積分範囲をカーバーはしているので、当該長方形の面積$2$が目標積分の上界となります。

fill命令によって、該当長方形領域を緑色で塗りつぶします。

塗りつぶしの方法

fillを使って、幾つかの点が囲んでいる範囲を色で塗りつぶします。

使い方: fill(x座標のリスト, y座標のリスト, 色)

In [30]:
x1=0; x2=1;
y1=f(x1); y2=f(x2);

%長方形の4の点をリストします。
p1 = [x1, 0];  %左下
p2 = [x2, 0];  %右下
p3 = [x2,y2];  %右上
p4 = [x1,y2];  %左上

x_list = [p1(1),p2(1),p3(1),p4(1)]; %x座標のリスト
y_list = [p1(2),p2(2),p3(2),p4(2)]; %y座標のリスト

fill(x_list, y_list, 'g') %緑色で長方形を塗りつぶします
hold on
draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a

同じ考え方で、0から1までの範囲で、x軸 $y = 0$と線分$y = f(0)=1$囲んでいる長方形領域は積分範囲の一部となりますので、 当該長方形の面積$1$が目標積分の下界となります。

該当長方形領域を青色で塗りつぶします。

In [33]:
x1=0; x2=1;
y1=f(x1); y2=f(x2);

%長方形の4の点をリストします。
p1 = [x1, 0];  %左下
p2 = [x2, 0];  %右下
p3 = [x2,y1];  %右上
p4 = [x1,y1];  %左上

x_list = [p1(1),p2(1),p3(1),p4(1)]; %x座標のリスト
y_list = [p1(2),p2(2),p3(2),p4(2)]; %y座標のリスト

fill(x_list, y_list, 'b') %青色で長方形を塗りつぶします
hold on
draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a

まとめ:

目標面積$S$が$1

Step2: $[0,1]$を2分割してから積分を近似する

$x = 0$, $x=0.5$, $x=1$における$f(x)$の値を利用して、面積の上界と下界を考えます。

まず、面積の下界をあける計算方法を考えます。

In [34]:
% -------------- 区間 [0, 0.5] -----------------------
x1=0; x2=0.5;
y1=f(x1); y2=f(x2);

p1 = [x1,0];
p2 = [x2,0];
p3 = [x2,y1];
p4 = [x1,y1];

x_list = [p1(1),p2(1),p3(1),p4(1),p1(1)];
y_list = [p1(2),p2(2),p3(2),p4(2),p1(2)];

plot(x_list, y_list, '-')
fill(x_list, y_list, 'b') %青色で塗りつぶす

hold on

% -------------- 区間 [0.5, 1] -----------------------
x1=0.5; x2=1;
y1=f(x1); y2=f(x2);

p1 = [x1,0];
p2 = [x2,0];
p3 = [x2,y1];
p4 = [x1,y1];

x_list = [p1(1),p2(1),p3(1),p4(1),p1(1)];
y_list = [p1(2),p2(2),p3(2),p4(2),p1(2)];

plot(x_list, y_list, '-')
fill(x_list, y_list, 'b') %青色で塗りつぶす

hold on

draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a

演習1 関数の積分に対応する領域をカーバーしている2つの長方形を色で塗りつぶしてください。

注意:??のある部分について、正しいいコードを書いてください。

In [35]:
% -------------- 区間 [0, 0.5] -----------------------
x1=0; x2=0.5;
y1=f(x1); y2=f(x2);

p1 = ??;
p2 = ??;
p3 = ??;
p4 = ??;

x_list = [p1(1),p2(1),p3(1),p4(1),p1(1)];
y_list = [p1(2),p2(2),p3(2),p4(2),p1(2)];

fill(x_list, y_list, 'g')

% -------------- 区間 [0.5, 1] -----------------------
hold on

x1=0.5; x2=1;
y1=f(x1); y2=f(x2);

p1 = ??;
p2 = ??;
p3 = ??;
p4 = ??;

x_list = [p1(1),p2(1),p3(1),p4(1),p1(1)];
y_list = [p1(2),p2(2),p3(2),p4(2),p1(2)];

fill(x_list, y_list, 'g')

hold on

draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a

上記のコードをコンパクトにするために、ブロックを塗りつぶす関数を定義します。

  • draw_f_lower(x1,x2) : 区間[x1, x2]における$f(x)=\sqrt{x}+1$に囲まれるブロックを描く。
  • draw_f_upper(x1,x2) : 区間[x1, x2]における$f(x)=\sqrt{x}+1$をカーバーしているブロックを描く。
In [36]:
function draw_f_lower(x1,x2)

    y1=f(x1); y2=f(x2);
    p_list = [x1,0; x2,0; x2,y1; x1,y1];
    
    fill(p_list(:,1), p_list(:,2), 'b')
end

function draw_f_upper(x1,x2)

    y1=f(x1); y2=f(x2);
    p_list = [x1,0; x2,0; x2,y2; x1,y2];
    
    fill(p_list(:,1), p_list(:,2), 'g')
end

上記の2つの関数を利用して、グラフを再描画します。

In [37]:
hold on
draw_f_lower(0,0.5)
draw_f_lower(0.5,1)
draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a
In [38]:
hold on
draw_f_upper(0,0.5)
draw_f_upper(0.5,1)
draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a

演習 2

$[0,1]$の2分割で作成した青色の長方形と緑色の長方形の面積を計算しなさい。 ここで計算した面積はそれぞれ積分値の上界と下界となります。

In [ ]:

演習 3:

$h=0.1$ とします。 節点のリスト$x=0:h:1$を利用して、面積の上界と下界となる長方形領域の集まりを描いてください。

In [46]:
h=0.1;  x=0:h:1;  n=length(x);

hold on
for k=1:(n-1)
  x1 = x(k);   y1 = f(x1); 
  x2 = x(k+1); y2 = f(x2);
  %ここにコードを書いてください。


end
draw_f()
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 1.2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a

Step 3. ブロックによる面積の近似計算

節点リスト$x=0, 0.5,1$における$f$の値を利用して、面積の上界と下界を算出できます。

節点の間隔をh=0.5とします。

面積の下界: $$ S1 = h\cdot [ \, f(0) + f(0.5)\, ] $$ 面積の上界: $$ S2 = h\cdot [ \, f(0.5) + f(1)\, ] $$

In [48]:
h=0.5;
S1 = h*( f(0) + f(0.5) );
S2 = h*( f(0.5) + f(1) );
printf("積分値の下界: %10.5f\n", S1)
printf("積分値の上界: %10.5f\n", S2)
printf("積分値の厳密値: %10.5f\n", 5/3)
積分値の下界:    1.35355
積分値の上界:    1.85355
積分値の厳密値:    1.66667

演習4

  • $h=0.1$ とします。節点$x=0:h:1$を利用して、$f(x)=\sqrt{x}+1$の$[0,1]$における積分$S$の上界と下界を計算してください。

  • $h=0.01$とします。 $S$の上界と下界を計算してください。

  • $h=0.01$, $h=0.001$とするとき、上界と下界が一致するかどうかを考察してください。

In [ ]:
h=0.1;  x=0:h:1;  n=length(x);
S1=0;
S2=0;
for k=1:(n-1)
  x1 = x(k);   y1 = f(x1); 
  x2 = x(k+1); y2 = f(x2);
  S1 = S1 + ??; %下界
  S2 = S2 + ??; %上界 
end


printf("積分値の下界: %10.5f\n", S1)
printf("積分値の上界: %10.5f\n", S2)
printf("積分値の厳密値: %10.5f\n", 5/3)

3. 一般的な関数の積分

演習5 (オプション)

この授業で紹介した方法を利用して、以下の関数が$[0,1]$における積分の近似値を計算してみてください。 分割の点で関数の値が発散する場合、分割の小区間の中点を使って計算してください。

注意:

関数の積分の上界と下界を得るために、関数の単調性は大切です。以下3番目と4番目の関数について、 分割の各部分区間$[x_i,x_{i+1}]$の上に関数の単調性を確保するために、区間の分割に工夫が必要です。

関数の単調性を調べるのは難しい場合、与えられる分割におけるリーマン和を計算して、リーマン和が収束しているかどうかを考察してください。

  • [1] $f(x)=\frac{1}{\sqrt{x}}$

  • [2] $f(x)=\frac{1}{x}$

  • [3] $f(x)=x\sin \frac{1}{x}$

  • [4] $f(x)=\sin \frac{1}{x}$

リーマン和

分割$x_0=0 < x_1

(参考:https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%9E%E3%83%B3%E7%A9%8D%E5%88%86

In [ ]:
%ここにコードを描いてください。

参考

積分の厳密な定義(リーマン積分)

微分積分の授業で学んだリーマン積分は積分を厳密に定義します。その詳細は教科書またはWikipediaを参考してください。

In [ ]: