MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第62回]
●最良近似式の求め方
前回までのところでは、グラフを使って、チェビシェフの近似式から最良近似式を求める過程を見ていただきました。
今回はいよいよその求め方についての説明に入ります。
実はその説明はすでに少し書いておりまして、[第56回]からの続きということになります。
しかしちょっと間が空いてしまいましたし、一部書き直したいところや書き足りないところなどもありますので、繰り返しになりますが、最初からもう一度書くことにします。
今求める関数f(x)の近似関数y(x)があって、
E(x)=f(x)−y(x) …(1)
としたときに、E(x)のグラフが0をはさんで+−に一定の範囲で振動するような形になるとき、y(x)がf(x)の最良近似式であるといえます。
ここにE(x)はf(x)に対するy(x)の誤差の関数です。
以下説明を簡単にするため、「数値計算」での説明にしたがって、2次式について考えることにします。
いま上記、(1)の近似式としてチェビシェフの2次の近似式
y(x)=c0+c1x+c2x2 …(2)
を得たとします。
これはまだ最良近似式ではありませんが、それに近い近似式です。
y(x)は2次式で、上のE(x)も2次式で考えますから、2点x1、x2で2つの極値β1、−β2を持ちます。
x1、x2を偏差点といいます。
このほかに区間の始点x0、終点x3も通常は極値を持つと考えられますが、必ずそうであるとは限りません。
たとえば前回までグラフで見ていただいたsin(x)の場合、その範囲をx0=0°、x3=90°(=π/2)とした場合、sin(x0)=0ですからその点での誤差E(x0)も0になってしまい、極値にはなりません。
[第56回]では「区間の両端は除外して考えます」と書きましたが、それでは連立方程式を解くのに式が足りなくなって解けないことがわかりました。
sin(x)の場合、区間の終端x3=90°(=π/2)ではsin(x3)=1になり、区間中の最大値を取りますから、その誤差E(x3)も最大値(=極値)を取ると考えられます。
そこで以下の最良近似式を求める計算では、区間の始点、または終点も極値を持つ(偏差点)として考えます。
前回までのsin(x)の誤差のグラフでは山と谷が合わせて5個あります。
それと終点90°のところも谷で終わっています。
求める最良近似式は9次式ですが、xの偶数次の項がなく、x,x3,x5,x7,x9の実質5次式なので、5個の極値があります。
それと終点を合わせて6個です。
その点(偏差点)を手がかりにして連立方程式を作ります。
(1)のE(x)の式はx0、x1、x2、x3を代入すると
f(x0)−(c0+c1x0+c2x02)=β0 …(3)
f(x1)−(c0+c1x1+c2x12)=−β1 …(4)
f(x2)−(c0+c1x2+c2x22)=β2 …(5)
f(x3)−(c0+c1x3+c2x32)=−β3 …(6)
と書けます。
β0、−β1、β2、−β3は偏差点x0、x1、x2、x3における極値です。
[注記]
以下の式を解くには偶数個の式が必要なようです。
ですのでここでは始点x0も加えて考えます。
なお上で説明しましたようにsin(x)の場合には始点は偏差点にはなりませんが、終点を加えると偏差点が偶数個になるので式を解くことができます。
さて、他方で求める最良近似式を
g(x)=d0+d1x+d2x2 …(7)
としたときg(x)でもy(x)と同じように書けますが、そのときの偏差点は厳密にはx1、x2とは異なります(始点x0と終点x3は一致すると考えてもよいでしょう)。
しかしy(x)もg(x)に十分近いと考えられますから、y(x)のときのx0、x1、x2、x3を仮に当てはめて、
f(x0)−(d0+d1x0+d2x02)=β …(8)
f(x1)−(d0+d1x1+d2x12)=−β …(9)
f(x2)−(d0+d1x2+d2x22)=β …(10)
f(x3)−(d0+d1x3+d2x32)=−β …(11)
とします。
最良近似式では正負誤差の最大値は絶対値が等しい値になります(と仮定します)から、上の式の右辺はβおよび−βになります。
上の各式は常識的な感覚で見ますとxが変数のように見えますが、x0、x1、x2、x3は既知の近似式
y(x)=c0+c1x+c2x2 …(2)
の偏差点ですから定数です。
またc0、c1、c2、β0、β1、β2、β3も定数です。
それに対して求めるべき最良近似式
g(x)=d0+d1x+d2x2 …(7)
のd0、d1、d2、βは未知数ですから変数になります。
つまりこの問題は上の(3)(4)(5)(6)(8)(9)(10)(11)式からd0、d1、d2、βを求める問題ということになります。
そこでその解法です。
まずd0、d1、d2はそれぞれc0、c1、c2に近い値だと考えて下の式を考えます。
d0=c0+e0 …(12)
d1=c1+e1 …(13)
d2=c2+e2 …(14)
ここでe0、e1、e2はそれぞれ小さな未知の値とします。
すると結局上の問題は未知数e0、e1、e2を求める問題になります。
最大誤差の値βも未知数ですが、問題の目的から考えると必ずしも求めなければならない値ではありません。
(8)(9)(10)(11)式に(12)(13)(14)式を代入して整理します。
f(x0)−(c0+c1x0+c2x02)−(e0+e1x0+e2x02)=β …(8)’
f(x1)−(c0+c1x1+c2x12)−(e0+e1x1+e2x12)=−β …(9)’
f(x2)−(c0+c1x2+c2x22)−(e0+e1x2+e2x22)=β …(10)’
f(x3)−(c0+c1x3+c2x32)−(e0+e1x3+e2x32)=−β …(11)’
ここにそれぞれ(3)(4)(5)(6)式を代入します。
β0−(e0+e1x0+e2x02)=β …(15)
−β1−(e0+e1x1+e2x12)=−β …(16)
β2−(e0+e1x2+e2x22)=β …(17)
−β3−(e0+e1x3+e2x32)=−β …(18)
これを整理すると下の式になります。
e0+e1x0+e2x02=β0−β …(15)’
e0+e1x1+e2x12=−β1+β …(16)’
e0+e1x2+e2x22=β2−β …(17)’
e0+e1x3+e2x32=−β3+β …(18)’
ここで各式の2式をそれぞれ加算して最終的に下の3式を得ます。
(15)’+(16)’ 2e0+e1x0+e1x1+e2x02+e2x12=β0−β1 …(19)
(16)’+(17)’ 2e0+e1x1+e1x2+e2x12+e2x22=−β1+β2 …(20)
(17)’+(18)’ 2e0+e1x2+e1x3+e2x22+e2x32=β2−β3 …(21)
(19)(20)(21)の連立方程式を解いてe0、e1、e2を求め、それを(12)(13)(14)に代入すれば、d0、d1、d2が求まり、近似式g(x)=d0+d1x+d2x2が求まります。
しかしこのようにして求めたg(x)は残念ながら最良近似式ではありません。
なぜならd0、d1、d2を求めるために利用したx1、x2、β0、β1、β2 、β3 は厳密にはg(x)の値ではなくて近似式y(x)の値なので、そこに無理があるからです。
もっともそのようにして求めた近似式g(x)=d0+d1x+d2x2はより最良近似式に近い近似式だといえます。
そこでそのようにして求めたg(x)=d0+d1x+d2x2から新たな偏差点x1、x2を求めて、上の計算の過程を繰り返し行なうことで次第に最良近似式に近づいていくことができます。
と、まあ、「数値計算」(赤坂隆著。コロナ社刊)に書かれている説明を、私なりに理解して分かりやすく書いたつもりですが、おわかりいただけましたでしょうか。
しかし。
上の説明はただのモデルでありまして、たかだか3元連立方程式ですから、電卓を使って手計算でもなんとか解けないことはありませんが、それでもその計算を数回繰り返すとなりますと、これはなかなか容易なことではありません。
さらにさらに。
前回までで説明をしてきましたsin(x)の近似式は
g(x)=d1x+d3x3+d5x5+d7x7+d9x9
というものですから、求める変数は5個、したがって5元連立方程式を解かなければなりません。
しかもxの値(1回の計算で6通り)はそれぞれ少なくとも小数点以下6〜7桁は覚悟しなければなりませんから、その3乗、5乗、7乗、9乗を求めて、それを当てはめた5元連立方程式を解くなんてことは、もう正気の沙汰ではありませんでしょう。
因みに「数値計算」(赤坂隆著。コロナ社刊)では、上記の連立方程式について、「これは容易に解けて」と書かれています。
どこが容易なんじゃあ、と思わず激高したくなります。
しかし、激高してみたって何の役にも立ちません。
とにかくなんとしても解かねばなりませぬ。
次回、5元連立方程式の解法にせまります。
[2014.11.6追記]
今朝になってから読み直しましたら説明に間違いがあることに気が付きましたので、全面的に書き改めました。
現在は更新後の説明になっています。
MYCPU80でCP/Mを![第62回]
2014.11.5upload
2014.11.6追記
前へ
次へ
ホームページトップへ戻る