非日常デコレーション

一般 web developer の雑記です

多元一次連立方程式をプログラムで解く

夏学期最後に残ったレポートが結局タイトルにあるような問題に帰着したので

数値解析など初学者の自分としてはかなり時間をかけたのでせっかくなので記録しておこうと思いました

(問題は移流拡散方程式を与えられた境界条件で数値解析するというもの)

 

取ろうとした手法

■行列計算ライブラリEigenを使ってC++で計算

⇨9*9行列はできたが、19*19行列でやるとエラー(メモリが確保できなかった?)

⇨大きい行列だが、疎行列なので~/Eigen/sparseを使ってメモリを節約しようと試みるも挫折

 

参考サイト

Eigenで連立方程式を解く(簡単な例) - 逃避メモ

http://mikaka.org/~kana/dl/pdf/pdf-eigennote.pdf

一応、コンパイルは通ったもののソルバによって解が変わったり、

そもそも数値があっていなかったりして諦めました(これでめちゃ時間食った…)

 

Matlab

⇨インストール時のライセンスうんぬんがめんどくさくてやめました。先輩がいるときに入れようと思います。数値計算に関してはかなり便利らしいので

 

■R

⇨やってみたら一番楽でした。こんな便利なものがあっていいのか・・・

 

ちなみに19*19行列を手で打つほど地味な作業は好きでないので、

Excelに数をプロットして「テキスト(タブ区切り)(*.txt)」で保存して、

> a<-read.delim("/*ファイルのディレクトリ*/.txt", header=FALSE)

とコマンドを打てば読み込んでくれます

* 下の画像の場合、" > a "とコマンドを打つだけで読み込んだファイルを確認できます

**"header=FALSE"は行列に勝手に名前をつけてくれます(この場合はV1,V2など)

f:id:mokotixfemilar:20150806023737p:plain

上の画像では係数行列aと非同次ベクトルb(こっちは手打ちですw)を読み込んで

> solve(a, b)

とコマンドを打つだけで解となるベクトルxを求めることができます

 

こんな簡単なら最初からRで計算すればよかったorz

「こういう計算したいんだけどどうプログラムに書けばいいんだ〜」って感じでずっと悩んでました

場合によってこれ使えばいいとかすぐわかればいいんですけどね

やっぱり優秀な先輩に聞くのが一番だと思いました

Rはいつか触ってみようかなと思ってたのでいい勉強になりました(大した勉強にはなっていないが)