始めに、$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}$$
微分積分学の基本定理が発見されるまで、積分は微分とは関係ない「面積」という概念で理解されています。
%関数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
#x=0.25におけるfの値
f(0.25)
%新しく作ったdraw_fという関数を呼び出して、グラフを描きます。
draw_f()
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()
同じ考え方で、0から1までの範囲で、x軸 $y = 0$と線分$y = f(0)=1$囲んでいる長方形領域は積分範囲の一部となりますので、 当該長方形の面積$1$が目標積分の下界となります。
該当長方形領域を青色で塗りつぶします。
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()
目標面積$S$が$1<S<2$を満たすことを確認しました。
$x = 0$, $x=0.5$, $x=1$における$f(x)$の値を利用して、面積の上界と下界を考えます。
まず、面積の下界をあける計算方法を考えます。
% -------------- 区間 [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()
注意:??のある部分について、正しいいコードを書いてください。
% -------------- 区間 [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()
上記のコードをコンパクトにするために、ブロックを塗りつぶす関数を定義します。
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つの関数を利用して、グラフを再描画します。
hold on
draw_f_lower(0,0.5)
draw_f_lower(0.5,1)
draw_f()
hold on
draw_f_upper(0,0.5)
draw_f_upper(0.5,1)
draw_f()
$[0,1]$の2分割で作成した青色の長方形と緑色の長方形の面積を計算しなさい。 ここで計算した面積はそれぞれ積分値の上界と下界となります。
$h=0.1$ とします。 節点のリスト$x=0:h:1$を利用して、面積の上界と下界となる長方形領域の集まりを描いてください。
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()
節点リスト$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)\, ] $$
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)
$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$とするとき、上界と下界が一致するかどうかを考察してください。
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)
この授業で紹介した方法を利用して、以下の関数が$[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 <x_2 < \cdots < x_n=1$に対して、$t_i$を$[x_i,x_{i+1}]$の中の点とします。たとえば、$t_i=0.5*(x_i+x_{i+1})$。この場合、リーマン和は以下のように計算できます。 $$ \sum^{n-1}_{i=0} f(t_i) (x_{i+1} - x_{i} ) $$
(参考:https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%9E%E3%83%B3%E7%A9%8D%E5%88%86)
%ここにコードを描いてください。