2014.9.30

前へ
次へ
ホームページトップへ戻る

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第44回]


●チェビシェフの多項式

またまた間が空いてしまいました。
いろいろ仕上げなければいけない仕事に追われていたことも事実でしたが、自分が十分に理解できていないことを書くことへの抵抗が、つい気持ちを鈍らせてしまいます。

BASICには三角関数や対数などの初等関数機能が組み込まれているのが一般的で、オリジナルのBASICを作ろうとすれば、そこは避けては通れない機能です。
FOR〜NEXTやGOTO、GOSUBといった普通のBASICの機能や、浮動小数点演算というような処理機能でも、それなりのアルゴリズムを理解すれば、それらを実装することは根気さえあればそれほど困難なことではありません。
しかし初等関数をBASIC機能として組み込むためには、単にアルゴリズムだけでは解決できない、より高度な知識が必要になります。

もう20年以上も前に無謀にもオリジナルのBASICの作成に挑戦し、おおよそのところはなんとか作り上げたものの、どうにも歯が立たなかったのが一連の初等関数の解法でした。
あれこれ試行錯誤の末にやっとたどり着いたのが前回紹介しました「数値計算」だったようです(そこに至る経緯はもうすっかり忘れてしまいました)。
当時のノートと再び入手した「数値計算」の記述とを照らし合わせてみますと、結局そこに書いてあります解法を理解することはとても無理とあきらめて、幸い表形式で記載されていた各初等関数の最良近似式をそのままいただいてしまったようです。

たまたまMYCPU80の修理作業のなかでSIN関数のプログラムをご紹介することになって、その解法に向き合わなければならないはめになってしまいました。
いえ、まあ、そこは素直に「解法については「数値計算」からいただいてしまいました。実のところ私には分かりませぬ。おしまい」と書いて終ってしまえばよいのですけれど。

面白くない、のでありますね。
自分が理解できていないものが、そこにそのまま残っているということが。

実は先日来、「数値計算」を思い出すまでの過程で、わからないままにあれこれネットを検索しまして、近似式について多少は理解を進めてきておりました。
そんな中で出会いましたのが、「チェビシェフの多項式」とそれを用いた近似式の計算でありました。

なんでもテイラー展開に比べるとより誤差が少ないのだそうで。
おお。これだ、これだ、と喜んだのもつかの間、それは第一近似式にすぎない、いわば最良近似式を算出するための踏み台に過ぎない、ということが後にわかってがっかりいたしました。

しかし、「数値計算」を再び入手して、近似式の解法というあたりを読んでみましたら、そこでもやはりテイラー展開→チェビシェフの近似式→最良近似式、という順に解法を進めているらしいことがわかり、ともかくはチェビシェフの近似式なるものを理解することは、無駄ではない、と知りました。

実は現在に至るも恥ずかしながら、最良近似式には到達しておりません。
そこにいきたい気持ちは山々なのでありますが、なにしろ早くMYCPU80用のCP/M互換DOSを作り上げなくてはいけません。
このところずっとその作業は止まったままになっております。
そういうことですので、残念ながら最良近似式の解法につきましては、しばらくおあずけ、ということになってしまいそうです。

せめて、なんとか理解できました(と思います)チェビシェフの近似式について、いつものごとく、備忘録を兼ねて整理してみることにいたします。

チェビシェフの多項式についてはネットを検索しますと解説がみつかります。
むつかしいことはわかりませんが、とにかく関数のテイラー近似式をもとにして、チェビシェフの多項式なるものを使うとそれよりも一次低い多項式で精度のよい近似式を導き出すことができるとあります。

チェビシェフの多項式というものも一通りではないようでありますが、ここで近似式の解法に用いるチェビシェフの多項式は次のものをいいます。
一般式は
n+1(x)=2xT(x)−Tn−1(x)  …(式a)
で、
(x)=1 …(式b)
(x)=x …(式c)
です。
これだけじゃあ雲をつかんでいるようなものですが、ともかく近似式を導き出すためにはこれが要るのです。

因みにSIN(x)をテイラーの多項式でxの項までで示してみますと
SIN(x)=x−(1/3!)x+(1/5!)x …(式d)
と表せます。
この式をもとにして、チェビシェフの多項式を用いてより精度の高い近似式を算出するためには、同じ次数までのチェビシェフの多項式が必要になります。
(式d)はx、x、xからなる多項式ですから、この場合はT(x)、T(x)、T(x)が必要になります。

(x)は(式c)ですから、そのまま
(x)=x です。
(x)、T(x)を求めるには、途中のT(x)、T(x)も求める必要があります。

(式a)から
(x)=2xT(x)−T(x) と書けます。
上式に T(x)=x、 T(x)=1を代入すると
(x)=2x−1
が求まります。

同様にして、
(x)=2xT(x)−T(x)=4x−2x−x=4x−3x
(x)=2xT(x)−T(x)=8x−6x−2x+1=8x−8x+1
(x)=2xT(x)−T(x)=16x−16x+2x−4x+3x=16x−20x+5x
が順次求まります。

[2014.10.1誤記訂正]
(x)の式に誤記がありましたので訂正いたしました。上の式は訂正済みのものです。

説明の途中ですが本日は時間がなくなってしまいました。
この続きは次回にいたします。

MYCPU80でCP/Mを![第44回]
2014.9.30upload
2014.10.1誤記訂正

前へ
次へ
ホームページトップへ戻る