始めに、$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}}+1 ~ dx = F(1) - F(0) = \frac{5}{3}$$
微分積分学の基本定理が発見されるまで、積分は微分とは関係ない「面積」という概念で理解されています。
$f(x)=\sqrt{x}+1$ が$[0,1]$における積分の近似方法を考えます。
まず、曲線$y=f(x)$のグラフを描きます。 <!-- %関数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 -->
import math
import matplotlib.pyplot as plt
#関数fを定義
def f(x):
value = math.sqrt(x)+1;
return value
#グラフを描く関数を定義
def draw_f():
x_list=[]
y_list=[]
for i in range(0, 101):
x=i/100
x_list.append(x)
y_list.append(f(x))
plt.plot(x_list,y_list,'-r');
plt.grid() #グリッドを描く
plt.plot(0,0,'o',color='red') #原点を描く
x_list.append(1); y_list.append(0)
x_list.append(0); y_list.append(0)
plt.fill(x_list,y_list,color="r",alpha=0.2)#ピンク色で積分に対応するエリアを塗りつぶします
#新しく作ったdraw_fという関数を呼び出して、グラフを描きます。
draw_f()
fill命令によって、長方形領域を緑色で塗りつぶします。
塗りつぶしの方法¶
fillを使って、幾つかの点が囲んでいる範囲を色で塗りつぶします。
使い方: fill(x座標のリスト, y座標のリスト, 色) <!-- 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() -->
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[0],p2[0],p3[0],p4[0]]; #x座標のリスト
y_list = [p1[1],p2[1],p3[1],p4[1]]; #y座標のリスト
draw_f()
plt.fill(x_list,y_list,color="g",alpha=0.5)#緑色で長方形を塗りつぶします
plt.show()
上記のコードをコンパクトにするために、ブロックを塗りつぶす関数を定義します。
def draw_f_upper(x1,x2):
y1=f(x1)
y2=f(x2);
x_list = [x1,x2,x2,x1]; #x座標のリスト
y_list = [0,0,y2,y2]; #y座標のリスト
plt.fill(x_list, y_list, 'g',alpha=0.7)
def draw_f_lower(x1,x2):
y1=f(x1)
y2=f(x2);
x_list = [x1,x2,x2,x1]; #x座標のリスト
y_list = [0,0,y1,y1]; #y座標のリスト
plt.fill(x_list, y_list, 'b',alpha=0.7)
積分範囲を[0.0.5],[0.5,1]に分けて、ブロックを描きます。
plt.figure(1)
draw_f()
draw_f_upper(0, 0.5)
draw_f_upper(0.5, 1)
plt.figure(2)
draw_f()
draw_f_lower(0, 0.5)
draw_f_lower(0.5, 1)
ブロックの面積によって、積分値の上界と下界を算出することができます。
[0,1]の分割点x=0,0.5,1におけるブロックの面積を検討してみます。このとき、各小区間の幅は$h=0.5$です。
分割点がx=0,0.5,1の場合、 青色のブロックの面積S1と緑色のブロックの面積S2を計算しなさい。
#演習1の計算過程を書いてください。
[0,1]の10等分割を考えます。積分領域をカーバーする緑のブロックと、積分領域に囲まれる青色のブロックを描いてみます。
#演習2
n=10; h=1/n
plt.figure(1)
draw_f()
for k in range(0,n):
draw_f_upper(k*h, k*h+h)
plt.figure(2)
draw_f()
for k in range(0,n):
draw_f_lower(k*h, k*h+h)
描いた緑色のブロックの面積と青色の面積を計算しなさい。それぞれは積分値の上界と下界となります。
#ここに計算の過程を書いてください。
#ヒントとして、S1の計算法を用意しています。S2の計算法を考えてください。
h = 0.1
S1 = 0.0
for n in range(0,10):
x = n*h
S1 = S1 + h*f(x)
print("S1 is:", S1)
積分値の上界(S2)と下界(S1)の差を0.01以下に抑えるように、[0,1]の分割点を調整して、S1,S2を計算してください。即ち、計算されるS1,S2については,S2-S1<0.01を満たすことが要求されています。
#演習3
この授業で紹介した方法を利用して、以下の関数が$[0,1]$における積分の近似値を計算してみてください。 分割の点で関数の値が発散する場合、分割の小区間の中点を使って計算してください。
注意:
関数の積分の上界と下界を得るために、関数の単調性は大切です。以下3番目と4番目の関数について、 分割の各部分区間$[x_i,x_{i+1}]$の上に関数の単調性を確保するために、区間の分割に工夫が必要です。
関数の単調性を調べるのは難しい場合、与えられる分割におけるリーマン和を計算して、リーマン和が収束しているかどうかを考察してください。
$$f_1(x)=\frac{1}{\sqrt{x}}$$
$$f_2(x)=\frac{1}{x}$$
$$f_3(x)=x\sin \frac{1}{x}$$
$$f_4(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)
# ここにコードを書いてください。