読者です 読者をやめる 読者になる 読者になる

31歳からの数学修士

なぜ再び数学するのか

一様連続と一様収束 〜 木を見て森も見る

解析学 数学

どうも、佐野です。GWはいかがお過ごしでしたか?僕はずっと図書館に籠って数学の勉強をしており、大変充実した時間を過ごすことができました。

今日は「一様連続と一様収束」について書いてみようと思います。大学で最初に学ぶ解析学の「三大訳わからん」を挙げるとすれば、

だと思います。微分積分は直観的に理解しやすいし、証明はすっ飛ばしても結果が使えれば分かった気にもなれます。でも上の三つは19世紀以降にできた「数学に対する新しい見方」そのものであって、ちゃんとインストールできてないとそれらに関する話は一つも理解できず、まるで全く言葉の通じない国へほっぽり出されたような気分になってしまいます。

僕自身学生時代にこれらが分かっていたかというと怪しいものがあり、十分に噛み砕かないまま色々な数式を詰め込んで後々苦労した記憶があります。今改めて勉強し直して「あぁ、こういう感じか」というのが納得できた気がするので、今回はそれを書いてみようと思います。

導入: 一様連続とは?

前に書いた記事 で「関数の連続性」を  \epsilon - \delta 式でどう定義するかを紹介しました:

 f(x) x=a で連続である  \Leftrightarrow
 \displaystyle 
\forall \varepsilon >0 \ \ \exists\delta>0 \ \ 
\forall x \in D \ \  |x-a| \lt \delta \ \Rightarrow \ |f(x)-f(a)| \lt \varepsilon


これは一点  x = a における  f の連続性です。これが定義域全体で成り立つとき、その関数はその定義域で連続であると言います。つまりこうです:

 f(x) D で連続である  \Leftrightarrow
 \displaystyle 
\forall a \in D \ \ \forall \varepsilon >0 \ \ \exists\delta>0 \ \ 
\forall x \in D \ \  |x-a| \lt \delta \ \Rightarrow \ |f(x)-f(a)| \lt \varepsilon


これはまぁ、定義域全体で「グラフが繋がってる」ことだと、とりあえず思っておきましょう。で、解析学の入門書では定積分を定義するあたりで「一様連続」というのが出てきます。

 f(x) D で一様連続である  \Leftrightarrow
 \displaystyle 
\forall \varepsilon >0 \ \ \exists\delta>0 \ \ \forall x, x' \in D \ \ 
|x-x'| \lt \delta \ \Rightarrow \ |f(x)-f(x')| \lt \varepsilon


これは一体何でしょう…上の「ただの連続」の式とよく似ているけど微妙に違うような。そもそも「一様」というのは「定義域全体で同じように」みたいな意味なのですが、「 f が一様連続」とは「 f のグラフが定義域全体で同じように繋がってる(?)」ということなのでしょうか?「ただの連続」と何が違うのかよく分かりません。

とりあえず「一様連続」というものを受け入れると、

  1. 「閉区間内で一様連続な関数は積分可能」
  2. 「普通の連続関数は閉区間内で一様連続」
  3. 「従って閉区間内で連続な関数は積分可能」

となって、めでたく高校でやっていたような積分計算は問題がなかったと安心できるようになるわけです。それにしてもいきなり出てきた「一様連続」はなんだったのか。

その後、しばらくすると「関数列の一様収束」というのが出てきて、これも「ただの収束」と式が微妙に違ってややこしいのですが、実は概念としてはこっちのほうが分かりやすい。そこでこの記事では先に「関数列の一様収束」を説明し、その上で「関数の一様連続」とは何かを見ていくことにしようと思います。

関数列とその極限

例えば自然数  n に対して定まる  f_n(x) = \sin(nx) / n という関数を考えます。これは振動数  n、振幅  1/n の波で、 n を大きくすれば振動は速くなりながらも振幅は小さくなっていくので、その「関数としての極限」は  f_\infty = 0 となるでしょう。

f:id:taketo1024:20150510211938p:plain

このように自然に極限の形が見えるものはいいのですが、例えば以下のような「坂がだんだん急になる関数」の場合は、それぞれの関数は連続であるにもかかわらず、極限の関数は不連続になってしまいます:

f:id:taketo1024:20150510214018p:plain

または以下のような「面積  1 の山がどんどん逃げていく関数列」の場合、

f:id:taketo1024:20150510214030p:plain

どんな  x をとっても  n が十分大きければ山はそこを通り過ぎているはずなので、極限関数は  f_\infty = 0 だというしかありませんが、定義域全体での積分は、

 \displaystyle \int f_n dx = 1 \ne \int f_\infty dx = 0


となり、極限においては定積分の値が変わってしまいます。

「こんな不自然な例を考えるから…」と思われるかもしれませんが、最初の例で  f_n微分してみると、 \displaystyle f_n'(x) = \cos(nx) となり、極限関数を微分した  f_\infty' = 0 と一致していません!

このように「関数列の極限」は「数列の極限」とは違って、極限関数で急に段差ができたりトゲが出てきたり、あるはずのものがなくなったり性質が変わったりと色々な豹変をしてしまうのです。そこで関数列に何らかの制約を加えて、こういうギョッとすることが起きないようにしたい。そこで出てくるのが「一様収束」です。

関数列の一様収束とは

関数列の一様収束を  \epsilon - \delta 式に書くとこうなります:

関数列  \{f_n\} f_\infty に一様収束する  \Leftrightarrow
 \displaystyle 
\forall \varepsilon >0 \ \ \exists N>0 \ \ \forall x \in D \ \ \forall n \ \ \ n \gt N \Rightarrow
|f_\infty(x)-f_n(x)| \lt \varepsilon


いやー、相変わらず  \epsilon - \delta 式はキツイですね。日本語に直訳すると:

「どんな小さな  \varepsilon > 0 に対しても、自然数  N > 0 を十分大きく取れば、定義域内のどんな  x に対しても、  n > N であれば、  f_n(x) f_\infty(x) の差は  \varepsilon より小さくできる 」


意訳すると、

「誤差  \varepsilon > 0 を定めると、十分大きな  n については全ての  \{ f_n \} が定義域全体でその範囲内におさまる」


ということです。

f:id:taketo1024:20150510214908p:plain

先の例で (1) は  |f_n(x)| \le 1/n より定義域全体でいくらでも小さくしていくことができるので一様収束です。一方で (2) は坂のところにどうしても差ができてしまいますし、(3) については定義域のどこかに必ず山があるので定義域全体で  0 に近づいていくことはないので一様収束ではありません。

「一様収束」とは「関数たちが定義域全体で足並みを揃えて極限に収束していくこと」と考えると分かりやすいと思います。

一様収束なら極限操作が交換できる!

まず  \{f_n\} f_\infty に一様収束するとき、 f_n たちの連続性は極限関数においても保たれます。それは「極限関数に十分近い  f_n」を架け橋にすることで、 |f_\infty(x) - f_\infty(a)| の値はいくらでも小さくできるからです(三角不等式):

f:id:taketo1024:20150510224626p:plain

また  f_n たちが積分可能のとき、関数値の差は区間全体でいくらでも小さくなるのだから:

 \displaystyle \left| \int_a^b f_n dx - \int_a^b f_\infty dx \right| 
\le \int_a^b |f_n - f_\infty| dx
\lt \varepsilon (b - a)


で、極限も積分可能でその差はいくらでも小さくできます(つまり極限の積分積分の極限)。

微分については注意が必要で、 (1) で見たとおり関数列が微分可能で一様収束していても極限の導関数とは一致していませんでしたが、「導関数の列  \{f_n'\}」が一様収束しているという条件があれば  f_n' \rightarrow f_\infty' となることが示されます(積分してまた微分すれば元に戻ることを使う)。

f:id:taketo1024:20150510220309p:plain

このように関数列が「一様収束する」という性質を持っていると、関数に対する(実数としての)極限操作と、関数列の(関数としての)極限操作が交換できるのです。「関数列がちゃんと一様収束するか」だけチェックすれば、安心してポンポンひっくり返していいということがわかりました!

改めて一様連続とは

一様連続の定義をもう一度見てみると:

 f(x) D で一様連続である  \Leftrightarrow
 \displaystyle 
\forall \varepsilon >0 \ \ \exists\delta>0 \ \ \forall x, x' \in D \ \ 
|x-x'| \lt \delta \ \Rightarrow \ |f(x)-f(x')| \lt \varepsilon


これは日本語にすると、

「どんな小さな  \varepsilon > 0 に対しても、 \delta > 0 をうまく取れば、定義域内のどんな  x, x' に対してもその距離が  \delta 未満であれば、  f(x) f(x') の差は  \varepsilon より小さくできる 」


ということです。「ただの連続」は  \delta \varepsilon a に応じて変えて良かったのに対して、「一様連続」の場合は  \delta \varepsilon にしか依ってはいけないということから、「一様連続」は「ただの連続」よりも強い条件になっていることが分かります。

f:id:taketo1024:20150510223157p:plain

あるいはこう見ることもできます。「点  a において連続」のときは、グラフ上の点  (a, f(a)) を左右に  \pm \delta だけ揺らしても、周辺の点の上下  \pm \varepsilon の中に収まる。一方で「 f が一様連続」のときは、グラフ全体を左右に  \pm \delta だけ揺らしても上下  \pm \varepsilon に収まる。

(「連続 = グラフが繋がっている」と思わないほうが「一様連続」を掴みやすいと思います。)

さて、このような一様連続な関数  f に関しては定積分が問題なく定まるということが言いたいのですが、よく考えてみると当たり前のことだと分かります。

積分の定義は区間を有限個に分割してその間で定値となる近似関数  f_\Delta を作るところから始まります。 f が一様連続であれば、区間の幅を小さくすれば誤差は一様に小さくなっていくので、近似関数の列  \{ f_{\Delta_n} \}  f一様収束します。一様収束する関数列については「極限の積分積分の極限」だったので、近似関数の極限として一様連続な関数の定積分は定まるのです!

f:id:taketo1024:20150510224144p:plain

以上の流れを整理すると:

  • 一様収束する積分可能な関数列は極限も積分可能
  • 一様連続な関数は階段関数で一様に近似できる
  • 階段関数列は元の関数に一様収束するので定積分が定まる

となります。「一様性」を考えることで、ややこしい定積分の条件も鮮やかに通り抜けることができるのでした。

関数空間 〜 関数を「点」と見る

一様収束をより広い視点で捉え直してみます。定義における「どんな  x に対しても、  f_n(x) f_\infty(x) の差は  \varepsilon 未満」というのは、言い換えれば「  f_n(x) f_\infty(x) の差は最大でも  \varepsilon 未満」ということになるので、

 \displaystyle ||f|| = \sup_{x \in D} |f(x)|


と書くと( \sup \max みたいなものです)、一様収束の定義は、

関数列  \{f_n\} f_\infty に一様収束する  \Leftrightarrow
 \displaystyle 
\forall \varepsilon >0 \ \ \exists N>0 \ \ \forall n \ \ \ n \gt N \Rightarrow
||f_\infty - f_n || \lt \varepsilon


と書けます。この式を「普通の数列の収束」と並べてみると、そっくりな形をしていることが分かります:

数列  \{a_n\} \alpha に収束する  \Leftrightarrow
 \displaystyle 
\forall \varepsilon >0 \ \ \exists N>0 \ \ \forall n \ \ \ n \gt N \Rightarrow
|\alpha - a_n | \lt \varepsilon


これまで「関数とは数に数を対応させる働き」だと教わっていたものを、見方を全く変えて、関数自体を一つの「点(またはベクトル)」と考えます 関数型プログラミングやってる人なら馴染みやすいはず)。すると上の  || \cdot || は「ベクトルの大きさ」を表す量だと考えることができ、  || f - g || によって 2点  f g の「距離」が定まります。

こうして関数を全て集めた「空間」を考えると、「関数列の一様収束」とは「関数空間における点列の収束」だと言えることが分かります。  || \cdot || が「関数の大きさ」を表す量として自然だと思えるなら、「収束」もこう定めるのが自然ですよね!

(この空間でみると先ほどの「山が逃げていく関数列」は大きさが常に  1 となるので、 0 に収束する訳がないのです)

一様性の概念が難しく感じるのは、 \varepsilon, \delta の記号だけ追っていても何やってるのかさっぱり分からないし、それまでは関数を  x, y 変数間の関係性と見ていたものをグッとズームアウトして関数を一つの対象と見なければならないところにあると思います。関数のグラフがあるユークリッド空間と、その関数自体を点として含む関数空間の間で自由にズームイン・アウトができるようになると、「訳わからん」の曇りも晴れてくるんじゃないかと思います。

最後に

今月も「第3回プログラマのための数学勉強会」開催します!開催日時は 5/22(金) 19:00〜、募集開始は 5/11(月) 8:30〜 です。興味のある方は是非ご応募ください!

maths4pg.connpass.com

それでは、最後までお読み頂きありがとうございました。