Saturday, October 30, 2010

【Fortran】 Intel MKL Nonlinear Least Squares Problem with Bounded Linear Constraint

 非線形連立方程式を解くためにアルゴリズムを探している。

 いくつかあるだろうけど、ここではIntel Compilerに同梱されているMath Kernel Library (MKL)を使う方法を考える。

 MKLの中では、線形制約下の最小二乗法のルーチンを使うことになる。このルーチンはTrust Region Methodを使っている。Trust Region Methodについては、こちらのレジュメがわかりやすい。

(追記)
 この非線形最小二乗のアルゴリズムは使い物にならないかもしれない。というのも、内部でJacobianを求めるときに引数として用意すべき外部サブルーチンの形式への規制が強すぎるから。具体的には、外部サブルーチンが sub(M,N,X,F) (Mは連立方程式の数、Nは変数の数、Xは変数、Fは関数の値)の形でなければならず、連立方程式に登場するパラメータを引数として定義することができなくなっている。もちろん、サブルーチンの中でテキストファイルから読み込むというアプローチも考えられるけど、I/O時間が余計に掛かってしまって計算が遅くなると思われる。

(追記2)
 上記の(追記)は間違い。グローバル変数を使えば大丈夫。具体的には、moduleファイルを使う。

Sunday, October 10, 2010

【Rocks】ifortの-i_dynamic -mcmodel=mediumが使えない理由

静的に2GB以上のメモリ容量を必要とする配列宣言をする場合、ifortコンパイルオプションに次のように"-i_dynamic -mcmodel=medium"を加える必要がある。
ifort -i_dynamic -mcmodel=medium -o filename.out source.f90
MPICH2を用いる場合は、
mpif90 -f90=ifort -i_dynamic -mcmodel=medium -o filename.out source.f90
とする(簡単化のため、最適化オプションなどは書いていないことに注意)。

ただし、このようにしてコンパイルされた実行ファイルをMPICH2を使って実行しようとすると問題が生じる。
$ mpiexec -machinefile mf -n #processes ./filename.out
./filename.out: error while loading shared libraries: libifport.so.5: cannot open shared object file: No such file or directory

ifortのライブラリーである"libifport.so.5"がcompute nodeからアクセスすることができないというエラー。

原因は明白。ifortをインストールしたのはfront endの/opt以下のフォルダであり、compute nodeとは共有することができないから。

対策としては、ifortを/share/apps以下にインストールすればOK。

Saturday, October 2, 2010

多分これが原因

スプライン補間の近似すげーと思った。
元の離散的なデータから滑らかな曲線で近似できる。

でも、この「滑らか」という部分で勘違いをしてしまっていたようだ。
具体的には、移動平均みたいな、滑らかな「トレンド」を抽出してくれると勘違いしてしまっていた。なんともお恥ずかしい。でもまあ、スプライン近似の定義からありえないのだが(笑)

以下の図は元のデータがギザギザな部分を含む場合。

グリッドの数は400とまあまあ細かい。
これに対してspline.f90の中の3次スプライン補間法を適用。
するとどうだろう。まあ当たり前だけど、ギザギザの部分も見事に再現してくれた。
でも、自分としてはこのギザギザを削ぎ落とした滑らかな曲線がほしいわけだ。まあ考えられる方法はあるのでいいのだ。とりあえず問題発見はできた。これがプログラムの結果が上手くいかない1つの原因と思われる。

あと、もう1つは、外挿の精度の低さ。これも図の右端でわかる。これもプログラムが上手く結果を出さない1つの原因だと思われる。

さて、これからシャワー。今日はテニスだ!