2014.11.13

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

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


[第66回]


●連立方程式をEXCELで解く

また何日か間が空いてしまいました。
このところやっと少し時間が取れるようになったものですから、少し前からMYCPU80にZB3BASICを移植する作業を再開しました。

7月の終わりごろからちょいと大変なMYCPU80の修理作業にかかってからというもの、ずっとZB3BASICの移植作業は棚上げになってしまっていました。
その後はこのところずっと書いております通り、最良近似式にはまってしまいました。
かれこれ3ヶ月以上も移植作業が宙に浮いていたことになります。

その作業をやっと再開しまして、ここ数日その作業に没頭しておりました。
単細胞ですので、何かに没頭してしまいますと、ほかの事に気が回らなくなってしまいます。
それでホームページの更新ができませんでした。
能力不足の故でありますから、どうかお許しを。

一口に移植作業と言うものの、これはなかなかに大変な作業です。
Z80CPUのために書いたマシン語にして24KBもある大変なプログラムをMYCPU80に移植するという作業なのですけれど、問題はMYCPU80は8080だというところにあります。
8080のために書いたプログラムはそのままZ80で実行可能です。
しかしその逆は大変です。

Z80は8080の倍以上のレジスタを持っています。
A,B,C,D,E,H,Lのほかにそれらの裏レジスタとしてA’,B’,C’,D’,E’,H’,L’があって、さらにインデックスレジスタIX、IYなんてものまであります。
命令だってハンパじゃありません。
LD (nn),BC
LD BC,(nn)
LD (nn),DE
LD DE,(nn)
なんて命令は便利ですので結構多用しているのですが、8080にはありません。
もちろんLDIRとかLDDRなんてのもありませんし、とにかくZ80にあって8080にはない命令のほうが、ある命令よりも多いのですから、もう泣いてしまいます。
なんでこんなことをせなあかんのや、とわが身をのろいながら、ひとつひとつ8080の命令に置き換えていく作業は途方もなく根気な作業です。
その挙句、当然のことのようにお決まりのバグのオンパレードと相成ります。
たったひとつのBASICの命令のバグを取るためにたっぷり1日かかってしまうこともしばしばです。
それでもここ数日気合を入れて取り組んだ結果、かなり進捗いたしました。
いずれ近い内に皆様にその成果をご報告できると思います。

その前に。
とにかく書きかけの連立方程式のけりをつけてしまわなくてはなりません。
前回は逆行列を使った連立方程式の解法について説明をしました。
逆行列さえあれば、方程式を解くのは簡単ですが、肝心の逆行列を求めるのにえらく手間がかかってしまいます。
私などは出来が悪いせいなのでしょうか、そんなむつかしいことをやるよりも、中学で習った方法のほうがよほど楽に思えてしまいます。
ま、しかし、とにかく逆行列さえなんとかできてしまえばよろしいのですけれど。

ところが。
私は不勉強で全然知らなかったのですけれど、なんですか、EXCELには逆行列も、そしてそれを使って連立方程式を解く機能もあるのだそうですね。
そういう便利なものがあるのでしたら、ぜひ使ってみたい、ということでさっそく使ってみました。

あ。
お話の流れでついこんな書き方になってしまいましたけれど、もちろんEXCELのその機能に気が付いたのは昨日今日のことではありません。
以前にお見せしました最良近似式を求める過程のグラフは全部EXCELのその機能を利用した結果なのです。

なにはともあれ、さっそくやってみましょう。
まずは今までの復習から。

下の連立方程式を考えます。
2x+3y+4z=6
3x+5y+2z=5
4x+3y+30z=32

上記の式を行列を用いて表します。



ここで

と書くことにします。

そしてAの逆行列A−1を用いて

という式を考えます。
これを計算するとx,y,zの値が求まります。

その計算をEXCELで解いてみます。
なお以下の方法につきましては
「EXCELの行列計算による連立方程式の解き方」(http://yosshy.sansu.org/Excel_matrix.htm
を参考にさせていただきました(というか、まんまです)。
同サイトの管理者様に厚く御礼申し上げます。


まずは方程式の左辺と右辺を行列の通りの配列で適当なセル範囲に書き込みます。
ここではA1〜C3、E1〜E3に書き込みました。
左辺と右辺の間に1列空けていますが見やすくする以外の意味はありません。
次に逆行列を置くためのセル範囲をマウスを使って選択します(範囲の左上のセルにマウスを置いて左ボタンを押したまま右下のセルまでドラッグします)。
ここではA5〜C7の範囲を選択しました。
そのままの状態で上の数式を記入する窓に =minverse(a1:c3) と記入しますが、まだ[Enter]は押しません。
記入したら[Shift]と[Ctrl]を同時に押しながら[Enter]を押します。

すると。

わお!
なんと、一瞬にして逆行列が求まってしまいました!
すごい!
Oh!Marvelous!

興奮しながら、いよいよ方程式の解を求めます。

方程式の解(逆行列と式の右辺の行列の積)を置くセル範囲をマウスで選択します。
これもどこでもよいのですが、E5〜E7を選択しました。
そのままの状態で =mmult(a5:c7,e1:e3) と入力しますが、まだ[Enter]は押しません。
入力したら[Shift]と[Ctrl]を同時に押しながら[Enter]を押します。

すると!

わおうぅ!
なんと!
一瞬にして、解が求まってしまいました!
Marvelous!!!

MYCPU80でCP/Mを![第66回]
2014.11.13upload

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