リーマン積分の定義

区間$I=[a,b]$上の有界関数$f$について、分割$I$に対して、上積分と下積分の定義を考えます。

まず、分割$I_h$を以下のような区間の族によって表現します。

$$ I=I_1 \cup I_2 \cup \cdots I_n $$

$h$は分割のサイズを表します。

$$ h = \max_i |I_i| \quad \quad (|I_i|: \mbox{区間}I_i\mbox{の幅}) $$

上積分と下積分は以下のように定義されます。 $$ \mbox{上積分} =\sum_{i=1}^n I_i\mbox{における $f$ の最大値} \times |I_i| $$

$$ \mbox{下積分} =\sum_{i=1}^n I_i\mbox{における $f$ の最小値} \times |I_i| $$

リーマン積分の定義

【定義】以下の式が成り立つとき、上積分と下積分の極限は$f$のリーマン積分と呼びます。($f$はリーマン積分の定義で可積分)

$$ \lim_{h\to 0} \mbox{上積分} = \lim_{h\to 0} \mbox{下積分} $$

演習1

区間$I=[0,1]$とします。以下の関数はリーマン積分の定義で可積分ですか?適当な分割を選んで、上積分と下積分を計算してください。

  • $f(x)=sin(x)$
  • $f(x)=1/\sqrt{x}$
  • 【オプション】$f(x)=x \sin(1/x)$

有界関数のリーマン可積分性の特徴づけ (https://ja.wikipedia.org/wiki/リーマン積分 ):

定理(ルベーグ) ― $\mathbb{R}$ の有界閉区間 $I$上の有界関数 $f: I → \mathbb{R}$ に対し、$f$ が $I$上リーマン可積分であることと、$f$ がほとんど至るところ連続である(すなわち $f$の不連続点全体の集合が零集合である)ことは同値である。

$\Rightarrow$ 有界閉区間上の有界函数は不連続点が高々可算個ならリーマン可積分である。

・$\sin{x}$は$[0,1]$上で有界$(\sin{x} \leq 1 \ \forall x \in [0,1])$なので上の定理により、リーマン可積分。

・$1\sqrt{x}$は $[0,1]$ 上で非有界なので、上の定理によればリーマン可積分ではない。

・$f(x)=x \sin(1/x)$の$[0,1]$上で有界$(x \sin{1/x} \leq 1 \ \forall x \in [0,1])$なので、上の定理により、リーマン可積分。

・$f(x) = \sin{x}$の場合

$\sin(x)$は$[0,1]$上、リーマン可積分であるので、以下の積分を考えることができる。

$$ S = \int_{0}^{1} \sin{x} \ dx $$

被積分関数$f(x) = \sin{x}$は原始関数$F(x) = -\cos{x} $をもち積分の厳密な値は

$$ \int_{0}^{1} \sin{x} \ dx = [-\cos{x}]_{0}^{1} = 1-\cos{1} \approx 0.45969769413 $$

となる。以下では$h = 1,1/10,1/20,1/30,\cdots 1/100$とする等分割の場合の上積分と下積分の値を計算したコードを以下に示す。 なお、$\sin{x}$は$[0,1]$上で単調増加なので授業で紹介された方法を、そのまま使うことができる。

In [50]:
function value = f(x)
    value = sin(x);
end 


%積分の実行
for i = 0:10:100
    if i == 0 
        h = 1;%0除算回避のため
    else 
        h = 1./i;
    end
    
    printf("--------------------刻み幅:h = %0.5f-------------------\n", h)
    x=0:h:1;  n=length(x);
    S1=0;
    S2=0;
    for j=1:(n-1)
        x1 = x(j);   y1 = f(x1); 
        x2 = x(j+1); y2 = f(x2);
        S1 = S1 + y1 * h ;%下界(単調増加であることが[0,1]上でわかっている。)
        S2 = S2 + y2 * h; %上界 (単調増加であることが[0,1]上でわかっている。)
    end

    %表示
    printf("下界: %10.5f\n", S1)
    printf("上界: %10.5f\n", S2)
    printf("厳密値: %10.11f\n\n", 0.45969769413)
end
--------------------刻み幅:h = 1.00000-------------------
下界:    0.00000
上界:    0.84147
厳密値: 0.45969769413

--------------------刻み幅:h = 0.10000-------------------
下界:    0.41724
上界:    0.50139
厳密値: 0.45969769413

--------------------刻み幅:h = 0.05000-------------------
下界:    0.43857
上界:    0.48064
厳密値: 0.45969769413

--------------------刻み幅:h = 0.03333-------------------
下界:    0.44563
上界:    0.47368
厳密値: 0.45969769413

--------------------刻み幅:h = 0.02500-------------------
下界:    0.44916
上界:    0.47019
厳密値: 0.45969769413

--------------------刻み幅:h = 0.02000-------------------
下界:    0.45127
上界:    0.46810
厳密値: 0.45969769413

--------------------刻み幅:h = 0.01667-------------------
下界:    0.45267
上界:    0.46670
厳密値: 0.45969769413

--------------------刻み幅:h = 0.01429-------------------
下界:    0.45368
上界:    0.46570
厳密値: 0.45969769413

--------------------刻み幅:h = 0.01250-------------------
下界:    0.45443
上界:    0.46495
厳密値: 0.45969769413

--------------------刻み幅:h = 0.01111-------------------
下界:    0.45502
上界:    0.46437
厳密値: 0.45969769413

--------------------刻み幅:h = 0.01000-------------------
下界:    0.45549
上界:    0.46390
厳密値: 0.45969769413

この計算によって$h \rightarrow 0$では上積分、下積分ともに厳密な積分の値に収束する傾向が見られる。

・$f(x) = \frac{1}{\sqrt{x}}$の場合

$\frac{1}{\sqrt{x}}$は$[0,1]$上、リーマン可積分ではないので、上積分と下積分の値が$h \rightarrow 0$で一致しないか、発散するものと考えれられる。

以下では$h = 1,1/10,1/20,1/30,\cdots 1/100$とする等分割の場合の上積分と下積分の値を計算したコードを以下に示す。 なお、$\frac{1}{\sqrt{x}}$は$[0,1]$上で($f(0)$は定義されないが、便宜的に考えることにより)単調減少なので、分割した小区間の左端で$f(x)$は最大値、右端で$f(x)$は最小値をとることに注意する。

In [5]:
function value = f(x)
    value = 1./sqrt(x);
end 


%積分の実行
for i = 0:10:100
    if i == 0 
        h = 1;%0除算回避のため
    else 
        h = 1./i;
    end
    
    printf("--------------------刻み幅:h = %0.5f-------------------\n", h)
    x=0:h:1;  n=length(x);
    S1=0;
    S2=0;
    for j=1:(n-1)
        x1 = x(j);   y1 = f(x1); 
        x2 = x(j+1); y2 = f(x2);
        S1 = S1 + y1 * h ;%下界(単調増加であることが[0,1]上でわかっている。)
        S2 = S2 + y2 * h; %上界 (単調増加であることが[0,1]上でわかっている。)
    end

    %表示
    printf("下界: %10.5f\n", S1)
    printf("上界: %10.5f\n", S2)
    printf("厳密値: %10.11f\n\n", 2)
end
--------------------刻み幅:h = 1.00000-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.00000
厳密値: 2.00000000000

--------------------刻み幅:h = 0.10000-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.58778
厳密値: 2.00000000000

--------------------刻み幅:h = 0.05000-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.69835
厳密値: 2.00000000000

--------------------刻み幅:h = 0.03333-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.75000
厳密値: 2.00000000000

--------------------刻み幅:h = 0.02500-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.78157
厳密値: 2.00000000000

--------------------刻み幅:h = 0.02000-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.80346
厳密値: 2.00000000000

--------------------刻み幅:h = 0.01667-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.81979
厳密値: 2.00000000000

--------------------刻み幅:h = 0.01429-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.83259
厳密値: 2.00000000000

--------------------刻み幅:h = 0.01250-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.84297
厳密値: 2.00000000000

--------------------刻み幅:h = 0.01111-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.85162
厳密値: 2.00000000000

--------------------刻み幅:h = 0.01000-------------------
warning: division by zero
warning: called from
    f at line 2 column 11
下界:        Inf
上界:    1.85896
厳密値: 2.00000000000

上積分の計算では$0$による除算が発生して、うまく計算できないことがわかる。

・$f(x) = x\sin{\left (\frac{1}{x} \right )} $の場合

$x\sin{(\frac{1}{x})}$は$[0,1]$上、リーマン可積分であるので、以下の積分を考えることができる。積分の厳密な値は以下の通り。

$$ S = \int_{0}^{1} x\sin{\left (\frac{1}{x} \right )} \ dx \approx 0.37853 $$

以下では特別な分割について上積分と下積分の値を計算したコードを以下に示す。 $x\sin{\left (\frac{1}{x} \right )}$は$[0,1]$上での単調性は分からないので授業の方法をそのまま使うことはできない。 実際にグラフを描くと以下の図のようになる。

In [7]:
%関数の定義
function y = f(x)
    y =  x.*sin(1./x);
end


x=0:0.001:1;
y=f(x);
plot(x,y,'r-');
hold on
grid on
plot(0,0) %原点を描く

$x\sin{(\frac{1}{x})}$は$[0,\frac{1}{\pi}]$で振動する関数であることがわかる。また、原点に近いほど激しく振動する。 授業での方法を適用するために、正の整数$n \in \{0,1,2,\cdots,N \}$に対して、以下の小区間を考える。

$x\sin(1/x)$が単調増加になる小区間$I_n $:

$$ I_0 := \left [ 0 ,\frac{2}{5 \pi} \right ] \\ I_n := \left [ \frac{2}{(4n-1) \pi} ,\frac{2}{(4n+1) \pi} \right ] \ (n = 1,2,\cdots,N) $$

$x\sin(1/x)$が単調減少になる小区間$J_n $:

$$ J_n := \left [ \frac{2}{(4n+3) \pi} ,\frac{2}{(4n+1) \pi} \right ] $$

これらの小区間をさらに細分することで上積分と下積分を計算する。 なお、この小区間によって区間$[0,1]$は

$$ [0,1] = \left ( \bigcup_{n=1}^{\infty} (I_n \cup J_n) \right ) \cup \left [ \frac{1}{\pi},1\right ] $$

と表されるので、$N$は十分に大きくとる必要がある。(この考え方は演習2にも通じている。) 以下に上積分と下積分の値を計算するコードを示す。

In [8]:
for i = 0:10:100
    %極値の集合
    N =i; %実質的に[1/(Nπ),1]を考えることになる。
    if i == 0 
        N = 1;%0除算回避のため
    end
    
    m =  N:-1:1;
    m = (2/pi)*1./(2*m - 1);

    %積分に必要なパラメータ
    M = 10; %単調増加または減少する各区間をM等分
    h = 1./((N+1)*N*2*M); %半周期の半分以下になるようにとる
    S_upper = 0; S_lower = 0;
    
    
    printf("--------------------刻み幅:h = %0.5f-------------------\n", h)
    
    %積分の実行
    for j = 1:N
       if j == N 
           x= m(N):h:1;
       else
           x = m(j):h:m(j+1); 
       end
       n = length(x);

       for k = 1:(n-1);
            x1 = x(k);        y1 = f(x1);
            x2 = x(k+1);   y2 = f(x2);
            S_upper = S_upper + h * max(y1,y2);
            S_lower = S_lower + h * min(y1,y2);
       end
    end

    printf("下積分: %10.5f\n", S_lower)
    printf("上積分: %10.5f\n", S_upper)
    printf("厳密値: %10.5f\n\n", 0.37853)
end
--------------------刻み幅:h = 0.02500-------------------
下積分:    0.26213
上積分:    0.26715
厳密値:    0.37853

--------------------刻み幅:h = 0.00045-------------------
下積分:    0.37774
上積分:    0.37877
厳密値:    0.37853

--------------------刻み幅:h = 0.00012-------------------
下積分:    0.37833
上積分:    0.37865
厳密値:    0.37853

--------------------刻み幅:h = 0.00005-------------------
下積分:    0.37842
上積分:    0.37858
厳密値:    0.37853

--------------------刻み幅:h = 0.00003-------------------
下積分:    0.37845
上積分:    0.37854
厳密値:    0.37853

--------------------刻み幅:h = 0.00002-------------------
下積分:    0.37849
上積分:    0.37856
厳密値:    0.37853

--------------------刻み幅:h = 0.00001-------------------
下積分:    0.37850
上積分:    0.37855
厳密値:    0.37853

--------------------刻み幅:h = 0.00001-------------------
下積分:    0.37850
上積分:    0.37854
厳密値:    0.37853

--------------------刻み幅:h = 0.00001-------------------
下積分:    0.37851
上積分:    0.37854
厳密値:    0.37853

--------------------刻み幅:h = 0.00001-------------------
下積分:    0.37851
上積分:    0.37853
厳密値:    0.37853

--------------------刻み幅:h = 0.00000-------------------
下積分:    0.37852
上積分:    0.37853
厳密値:    0.37853

この計算によって$h \rightarrow 0$では上積分、下積分ともに厳密な積分の値に収束する傾向が見られる。

広義積分

標準的なリーマン積分は一部の関数に対応できないので、広義積分を考える場合があります。

【定義】以下の極限が存在するとき、この極限を$f$の$[a,b]$における広義積分と呼ぶ。

$$ \lim_{\epsilon \to 0+} \int_{a+\epsilon}^b f(x)~ dx $$

演習 2

演習1の関数は広義リーマン積分で可積分ですか?適当な分割を選んで、上積分と下積分を計算して検討してください。

演習1では$\sin{x},x\sin{\left ( \frac{1}{x}\right)}$が$[0,1]$上で有界かつ連続であるため、リーマン可積分である。 また$0 < \varepsilon <1$を満たす$\varepsilon$によって区間$[\varepsilon,1]$を考える。すると$[0,1]$上有界かつ連続な関数$f(x)$に対して

$$ \max_{x \in [\varepsilon,1]} f(x) \leq \max_{x \in [0,1]} f(x) < \infty $$

となり、$f(x)$は区間$[\varepsilon,1]$を有界であることがわかるので、$[0,1]$上有界かつ連続な関数$f(x)$は区間$[\varepsilon,1]$でも有界かつ連続となるのでリーマン可積分である。 従って$\varepsilon \rightarrow +0$とすれば広義リーマン積分可能であることがわかる。

以上のことにより$f(x) = \frac{1}{\sqrt{x}}$の場合のみを考える。

$$ S(x) = \int \frac{1}{\sqrt{x}} \ dx $$

被積分関数$f(x) = \frac{1}{\sqrt{x}}$は原始関数$F(x) = 2\sqrt{x}$をもつ。そこで次の極限を考える。

$$ S = \lim_{\varepsilon \rightarrow +0} \int_{\varepsilon}^{1} \frac{1}{\sqrt{x}} \ dx $$

この極限は積分の厳密な値$2$に近づくことが分かる。(原始関数$F(x)$が存在して$x =0$で片側連続であるため) 以下に広義リーマン積分の考え方に基づいて積分の値の上下界を計算したコードを示す。なお$\varepsilon,h$は$\varepsilon,h = 0.01,0.001,0.0001$としている。

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

%積分の実行
for i = 1:3
    h=10^(-i-1) ;
    printf("-----------------h: %0.5f---------------\n", h)
    for j = 1:2500:10000
        eps = (1./j)*1e-3;
        x=eps: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 + min([y1,y2])*h; %下界
          S2 = S2 + max([y1,y2])*h; %上界 
        end

        %表示
        printf("ε: %0.10f\n", eps)
        printf("下界: %10.5f\n", S1)
        printf("上界: %10.5f\n", S2)
        printf("厳密値: %10.5f\n\n", 2)
    end
end
-----------------h: 0.01000---------------
ε: 0.0010000000
下界:    1.83737
上界:    2.14355
厳密値:    2.00000

ε: 0.0000003998
下界:    1.84896
上界:   17.65346
厳密値:    2.00000

ε: 0.0000002000
下界:    1.84896
上界:   24.20182
厳密値:    2.00000

ε: 0.0000001333
下界:    1.84896
上界:   29.22686
厳密値:    2.00000

-----------------h: 0.00100---------------
ε: 0.0010000000
下界:    1.92270
上界:    1.95332
厳密値:    2.00000

ε: 0.0000003998
下界:    1.95330
上界:    3.53376
厳密値:    2.00000

ε: 0.0000002000
下界:    1.95331
上界:    4.18860
厳密値:    2.00000

ε: 0.0000001333
下界:    1.95331
上界:    4.69111
厳密値:    2.00000

-----------------h: 0.00010---------------
ε: 0.0010000000
下界:    1.93524
上界:    1.93830
厳密値:    2.00000

ε: 0.0000003998
下界:    1.98529
上界:    2.14334
厳密値:    2.00000

ε: 0.0000002000
下界:    1.98532
上界:    2.20885
厳密値:    2.00000

ε: 0.0000001333
下界:    1.98533
上界:    2.25911
厳密値:    2.00000

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

%積分の実行
for j = 2:5;
    eps = 10^(-j);
    
    printf("=========================  eps = %e  =================== \n", eps)

    for i = 2:(j+1)
        h=10^(-i) ;
        printf("-----------------h: %e ---------------\n", h)
        x=0:h:1;  n=length(x); x(1) = eps;

        x_list_lower_bound = x(2:n);
        S1 = sum(f(x_list_lower_bound))*h;
        x_list_upper_bound = x(1:n-1);
        S2 = sum(f(x_list_upper_bound))*h;

        %表示

        printf("下界: %10.5f\n", S1)
        printf("上界: %10.5f\n", S2)
        printf("厳密値: %10.5f\n\n", 2)
    end
end
=========================  eps = 1.000000e-02  =================== 
-----------------h: 0.01000---------------
下界:    1.85896
上界:    1.94896
厳密値:    2.00000

-----------------h: 0.00100---------------
下界:    1.95432
上界:    1.96332
厳密値:    2.00000

=========================  eps = 1.000000e-03  =================== 
-----------------h: 0.01000---------------
下界:    1.85896
上界:    2.16519
厳密値:    2.00000

-----------------h: 0.00100---------------
下界:    1.95432
上界:    1.98494
厳密値:    2.00000

-----------------h: 0.00010---------------
下界:    1.98545
上界:    1.98851
厳密値:    2.00000

=========================  eps = 1.000000e-04  =================== 
-----------------h: 0.01000---------------
下界:    1.85896
上界:    2.84896
厳密値:    2.00000

-----------------h: 0.00100---------------
下界:    1.95432
上界:    2.05332
厳密値:    2.00000

-----------------h: 0.00010---------------
下界:    1.98545
上界:    1.99535
厳密値:    2.00000

-----------------h: 0.00001---------------
下界:    1.99539
上界:    1.99638
厳密値:    2.00000

=========================  eps = 1.000000e-05  =================== 
-----------------h: 0.01000---------------
下界:    1.85896
上界:    5.01124
厳密値:    2.00000

-----------------h: 0.00100---------------
下界:    1.95432
上界:    2.26955
厳密値:    2.00000

-----------------h: 0.00010---------------
下界:    1.98545
上界:    2.01697
厳密値:    2.00000

-----------------h: 0.00001---------------
下界:    1.99539
上界:    1.99854
厳密値:    2.00000

-----------------h: 0.00000---------------
下界:    1.99854
上界:    1.99886
厳密値:    2.00000

In [ ]: