年末から続けている構造解析をF#で作成しようという話のメモを少し。主に参考書の紹介です。
仕事がら有限要素法を使って計算をしている…部分の修正などを行っているわけですが、有限要素法のコアな部分は触っていないんですよね。なので、専門家が話すテクニカルタームについていけないのが不甲斐ないので、再勉強がてらF#も同時に学習しようというねらいです。
なんで、F#かというと、手元のプログラムがFortranとC++の組み合わせでたまにC#/WPFが混じります。これに組み合わせるとなると、.NET系がよいわけで、ならば頭文字FつながりでF#がよいか、というノリで。いや、実のところは、有限要素法なコアなところを.NETのPCLで作っておけば、タブレットとかストアアプリとか使いやすいだろうという腹づもりです。更にXamarinと組み合わせればそのままiPad上で動くかもしれません。
ちなみに、有限要素法のソフトウェアとしては NASTRAN と ANSYS が2強らしく、これからデータコンバートをすると適当なメッシュデータを作れます。実は Femap の無償版があることを知ったので少ない節点ならばこれで試すのもありですよね。あと ADVENTUREプロジェクト というのがあって、ver.1 ならばメールアドレスのみでソースを見れます。
0から学ぶ…ってほどでもないのです。以下の本からスタートしています。
式を Fortran に直したり C++ に直すというよりも、根本的なところを学びたかったので、仕事上実践の部分と基本的なところと2冊用意しました。2年前に買ったのですが、ざっと読み下したままだたんですよね。なので、「実践 有限要素法~」の演習問題のところを正月に鉛筆で解いていました。
そんな中で行列が出てきたので、大学以来の線形代数の本もいくつか。
大学の教科書はもう手元にないので図書館で借りてきています。ざっと読み返して、行列と行列式と逆行列がわかればOKです。固有値はいるのかな?原子力学科のときは使ったのですが、構造解析で必要かどうかはわかりません。ただし、行列式とか逆行列とかは、数式で解くとは限りません。というか、計算機用のアルゴリズムが必要です。
線形代数自体をプログラムで解くときに、一番おもしろかったのがこれです。
行列を解いていくと、そのまま立体の回転とか、画像の変換とかにも使えることが分かります。多変量分析もそうですよね。このあたり、それぞれ別々にツールがあるわけですが、根っこは行列で解くところにあるので相互に別の分野のロジックを持ってくることも可能です。なので、線形代数の特徴を知っておくと応用範囲が広いかな…ってのを今頃知った次第です。
わき道にそれますが、行列の次元の話ついで、超弦理論の本を読みました。非常にわかりやすくて数式がほとんど(3箇所だけ?)出てきません。なぜ超弦理論が10次元(あるいは11次元)なのかが明快に説明されています。超弦(超ひも)論を知ったのは20年前なのですが、それ以降すごい発展を遂げていたんですね。
さて、ここにきてやって F# の本を買いました。ぽちぽちと Kindel で Programing F# 3.0 を読んでいたのですが、手元におくために日本語の本も一冊。
F# で必要な要素を絞り込んでいるので(配列の扱いとループぐらいか使わない)、WEBなどで大丈夫かと思ったのですが、やっぱり拾い読み用に手元に置きたいかなと。行列を扱う場合、2次元配列/Array2Dで扱うか、F# MathProvider にある matrix を使うかと迷うところです。実は、数独の問題を解いたときに知ったのですが、Array2D の場合は、Aij は、A.[j,i]となって x y が逆なんですよね。これは C 言語の二重配列と同じので当たり前といえば当たり前なのですが、数式からそのままプログラムコードに落とすときに間違いやすいところです。matrix のほうは、A.[i,j] のように x y の順になっているので、こっちのほうがいいです。
あと、数式の場合は 1 始まりなのですが、プログラムの場合は 0 始まりになります。ループを使うとき(maxのとき)に気を付ければいいのですが、その脳内変換が面倒ですね。なので、できるだけループを使わず、再帰を使うのが F# らしいかと思っています…が、matrix には Seq 等が使えない(Arrray2D にも使えない)ので、このあたり適当な拡張が必要かなと。
で、現在のところはこれです。
具体的に Visual Basic 2008 を使って有限要素法のソフトを作っていきます。元ネタは Fortran だそうで、それらしいコードなのですが、グラフィック部分が .NET なんですよね。全部実装すると、pre, solver, post の3種類が揃うのでワンセットでかなりのことができそうです。今後は、この VBのコードを F# にコンバートしていこうと思ってます。