関数の積分

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

復習

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}}+1 ~ dx = F(1) - F(0) = \frac{5}{3}$$

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

2. 面積の近似計算

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

2.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 -->

In [1]:
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)#ピンク色で積分に対応するエリアを塗りつぶします
In [2]:
#新しく作ったdraw_fという関数を呼び出して、グラフを描きます。
draw_f()

2.2 準備:色で塗りつぶす

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() -->

In [3]:
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()

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

  • draw_f_upper(x1,x2) : 区間[x1, x2]における$f(x)=\sqrt{x}+1$をカーバーしているブロックを描く。
  • draw_f_lower(x1,x2) : 区間[x1, x2]における$f(x)=\sqrt{x}+1$に囲まれるブロックを描く。
In [4]:
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]に分けて、ブロックを描きます。

In [5]:
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)

2.3 面積の計算法

ブロックの面積によって、積分値の上界と下界を算出することができます。

[0,1]の分割点x=0,0.5,1におけるブロックの面積を検討してみます。このとき、各小区間の幅は$h=0.5$です。

  • 青色のブロックの面積は積分値の下界を与えます。$S1$と書きます。 $$ S1 = h\cdot [ \, f(0) + f(0.5)\, ] $$
  • 緑色のブロックの面積は積分値の上界を与えます。$S2$と書きます。 $$ S2 = h\cdot [ \, f(0.5) + f(1)\, ] $$

演習1

分割点がx=0,0.5,1の場合、 青色のブロックの面積S1と緑色のブロックの面積S2を計算しなさい。

In [6]:
#演習1の計算過程を書いてください。

演習2

[0,1]の10等分割を考えます。積分領域をカーバーする緑のブロックと、積分領域に囲まれる青色のブロックを描いてみます。

In [7]:
#演習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)

描いた緑色のブロックの面積と青色の面積を計算しなさい。それぞれは積分値の上界と下界となります。

In [8]:
#ここに計算の過程を書いてください。
#ヒントとして、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)
S1 is: 1.6105093417068177

演習3 (オプション)

積分値の上界(S2)と下界(S1)の差を0.01以下に抑えるように、[0,1]の分割点を調整して、S1,S2を計算してください。即ち、計算されるS1,S2については,S2-S1<0.01を満たすことが要求されています。

In [9]:
#演習3

3. 一般的な関数の積分

演習5 (オプション)

この授業で紹介した方法を利用して、以下の関数が$[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

In [10]:
# ここにコードを書いてください。

参考

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

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