スツルム列とスツルムの定理

/ Math Numerical

スツルムの方法とは区間\([a,b]\)内に方程式\(f(x)=0\)の解がいくつあるかを求める方法で、スツルム列やスツルムの定理はその過程で用いる関数列とそれに関する定理。スツルムってどんだけ連呼するねん。

とりあえずスツルム列の定義から。区間\([a,b]\)で定義されたある連続関数の列\(f_0(x),f_1(x),f_2(x),\cdots,f_n(x)\)が次の条件を満たしているときこの関数列はスツルム列であるという。

  1. 隣接する2つの関数は区間\([a,b]\)において同時にゼロにならない
  2. ある\(x_0\in[a,b]\)\(f_k(x_0)=0\)のとき\(f_{k-1}(x_0)\)\(f_{k+1}(x_0)\)は異符号
  3. 区間\([a,b]\)で一番最後の関数\(f_n(x)\)の符号は変化しない
  4. ある\(x_0\in[a,b]\)\(f_0(x_0)=0\)のとき\(f_0(x)\)\(x_0\)付近で増加関数なら\(f_1(x_0)>0\)、減少関数ならば\(f_1(x_0)<0\)

次に\(N(x)\)を、\(x\)を固定したときに\(f_0,f_1,f_2,\cdots,f_n\)の符号が変化する回数とする。例えば\(f_k(x)<0\)\(f_{k+1}(x)>0\)ならば1回符号が変化したとカウントする。

ある\(x_0\in[a,b]\)で関数列の両端以外の関数(つまり\(0\lt k\lt n\))が\(f_k(x_0)=0\)になったとする。このとき条件2よりこの\(x_0\)のもとで前後の関数は異符号なので考えられるパターンは次の2パターンになる。(引数の\(x_0\)は省略した)

\[ f_{k-1}\lt 0,\quad f_k=0,\quad f_{k+1}\gt 0\\ f_{k-1}\gt 0,\quad f_k=0,\quad f_{k+1}\lt 0\]

このような場合は\(N(x)\)として符号の変化が1回と数えられるものとする。ここで\(x_0\)を少しだけ変化させた場合を考えると\(f_k(x)\)\(f_k\lt 0\)\(f_k\gt 0\)のどちらかになる。関数列の前後と合わせてこの場合に考えられるパターンは次の4パターンになる。

\[ f_{k-1}\lt 0,\quad f_k\lt 0,\quad f_{k+1}\gt 0\\ f_{k-1}\gt 0,\quad f_k\lt 0,\quad f_{k+1}\lt 0\\ f_{k-1}\lt 0,\quad f_k\gt 0,\quad f_{k+1}\gt 0\\ f_{k-1}\gt 0,\quad f_k\gt 0,\quad f_{k+1}\lt 0\]

いずれの場合も\(N(x)\)として符号の変化が1回と数えられることに変わりはない。\(x_0\)を少しだけ変化させれば関数列の前後の関数の符号が変わると思うかも知れないが今考えている関数が連続なので「少し」ずらすだけなら問題ない。

以上の議論により両端以外の関数が\(f_k(x_0)=0\)を満たしたとしても\(N(x)\)の値を変えないことが分かった。よって\(N(x)\)の値が変化するとすれば両端の関数の符号が変わったときに限られる、が、条件(3)より一番最後の関数\(f_n(x)\)は区間\([a,b]\)において符号が変化しないといっているから\(N(x)\)の値が変わるとすれば\(f_0(x)\)の符号が変わったときだけになる。連続関数の符号が変わるというのは言い換えれば零になる点を踏んだということになる。

条件(4)によって\(x\)が小さいほうから大きいほうへと変化していったとき\(N(x)\)は必ず減っていく。これは少し考えればわかる。増加関数なら零になる点を踏んだあと\(f_0(x)\)の符号はプラス、\(f_1(x)\)はプラスなのだから符号の変化が1回減少する。この性質を使うと、区間\([a,b]\)ないで関数\(f_0(x)\)\(f_0(x)=0\)を満たす点の個数は

\[ N_r=N(a)-N(b)\]

で表せる。これがスツルムの定理。どのように関数列を持って来るかどうかは別として、スツルムの定理を使えばどんなに広い区間内に含まれる根の数でも区間の両端の値で各関数の値を求めて関数列の符号の変化をカウントするだけで求められる。

とても概念的でそんな条件を満たしている都合のいい関数列あるんかということになるが使える場面はある。具体的には三重対角行列の固有値を求める場合などまさにスツルム列が構成できる。