Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
数式処理
研究の関係で、6元、ないし8元の連立方程式を解かなくちゃ行けなかったりしたんですよね。まぁその作業自体は研究の副次的な作業で、本質には余り関わってこないため、ここであまり時間は掛けたくない。

とはいえ、未知数6の連立方程式(まー1次式だからまだましっちゃーまし)なんて手計算で解いてられないんですよね。解けなくはないけれど、間違わずに素早く解くような自信はからっきしない。

おまけに、それを解いて終わりじゃなくて、その解をまた別の式に代入しなくちゃならないと来た。その式というのが分母分子がそれぞれ2次式の分数。ちなみに連立方程式を解いて出てくる解は分母分子がそれぞれ1次式の分数。分数の分母分子にこれまた分数があらわれるとかもう悪夢。

おまけにその式をプログラムに書き下す必要があるんですね。信号処理、しかもリアルタイム処理を目指す関係上、乗除算はあまり多くなって欲しくない。だから分数の分母分子に分数があるってのは頂けない。だから分母を払って整理してできるだけ簡単な形(演算量の少ない形)に変形しなくてはいけない・・・。

こんだけの作業を全部手計算でやるとかやってらんないので、連立方程式を解いてその解を別の式に代入するところまでを全部数式処理ソフトに吐かせました。いやぁ、多少なりとも数式処理ソフトの扱い方を知っていて良かった。こんなところで役に立つとは夢にも思っていなかったけれど(苦笑

ただ、それを使っても計算量が少なくなるような式の形への変形はさすがにやってくれませんから、手作業で整理します。まぁ分母を払うところまでやってくれてあるわけですから、作業としてはだいぶましなところまで進めてくれてますよね。しんどいですけど^^;

そいでまぁ整理してみたのですが、見にくい。ひっじょーに見にくい。なんせ数式がA4用紙横置きで軽くはみ出るんですから(ぁ
これは仮に学会へ提出したときに、査読委員が見る気なくすだろうということで式を行列で表現することに。

連立方程式はクラメルの公式を使えば行列式で表現できます。それを利用して表現だけはすっきりさせておきました(笑) 結局3x3の行列式を解かなくちゃ行けないので骨は骨なのだ。サラスの法則使うか、掃き出し法を使うか、まぁ汎用性を持たせるなら掃き出し法の方がいいかな? なんせそれで分母と分子の係数を求めなくちゃいけないけどさ。

で、今日のミーティングにて式の整理までできましたよと報告。いよいよプログラムでシミュレーションをしようとあいなりました。

まーまだクラスが全部完成はしてないんですよねぇ。とりあえずマルチチャネルシステム同定はある程度動いていそうだから収束条件に即した係数更新はおいとくとして(あの条件もう少し工夫はしたい。すげー抽象化しにくい^^;)、連立方程式法のクラスを作っていこうかな。マルチチャネルシステムのフィルタクラスは今日である程度形になったし、マルチチャネルシステム同定クラスはそれを継承させることでいいだろう、うん。

けど連立方程式法のクラスはメンバをどう持たせるかなぁ・・・。入出力ははっきりしてるけど公開メソッドをどうするかやなぁ・・・。まぁ見える分にはマルチチャネルのfirと係数更新メソッドくらいでいいか。後はパラメータを設定するプロパティ作っとくくらいやな。

まぁ明日クラス構成をもう少し練って紙に書き起こしておこう。こりゃ中々綺麗に書くのは難しそうだ^^;
[続きを読む...]
スポンサーサイト