余白の書きなぐり

aueweのブログ

数値計算

C言語からLAPACKのzheevを呼んでエルミート行列を対角化

昔書いた記事のコメントでzheevの使い方を書けと言われた。 なので書いた。僕は優しいなあ。 こういうのは他人が書いた記事を鵜呑みにするより、zheev.fでググってヒットする一次情報を見るほうがいいと思うよ。 Fortranが分からなくても普通に読めると思う…

C言語からLAPACKを呼んで逆行列を求める(LU分解する)

数値解析の授業で逆行列は求めちゃダメって言われたけど、気にしない気にしない。 実行列の逆行列を求める Fortranの DGETRF でLU分解した後、 DGETRI で逆行列を求める。 /* * hoge.c * SIZE*SIZE型の実行列の逆行列を計算 * 元の行列は * (2 3 ) * (1 0.5)…

OpenMPIで乱数を使う

普通の(並列計算でない)プログラムで乱数を使用する際に、 プログラムを実行するたびに異なる系列で擬似乱数を発生させるには seed に現在時刻を使用するのが一般的だ。 要するに srand((unsigned) time(NULL)); とすればよい。詳細は以下のページにまとまっ…

高速フーリエ変換ライブラリ fftw のインストールと使用法

インストール Linux(Ubuntu)への導入 インストール $ sudo apt-get install libfftw3-3 libfftw3-dev libfftw3-doc コンパイル方法 $ gcc hoge.c -lm -lfftw3 Windowsへの導入 fftwのwindows版インストーラのページから 32-bit version: fftw-3.3.3-dll32.zi…

Maximaで一般相対論

フリーな数式処理ソフト Maxima を使用して ロバートソン・ウォーカー計量 からアインシュタインテンソルを計算したメモ。 腕力で式変形するのは大変すぎる。 まず最初に ctensor を load して csetup() し、計量を作る。 (%i1) load(ctensor); (%o1) C:/PRO…

C言語からLAPACKのzgeevを呼んで複素行列を対角化

/* * SIZE*SIZE型の複素行列の固有値と固有ベクトルを計算 * (1 2i) * (i 1+i) */ #define SIZE 2 // 2*2型の行列 #include <stdio.h> #include <complex.h> int main(void) { char jobvl = 'N' ;// 左固有ベクトルは計算しない char jobvr = 'V' ;// 右固有ベクトルは計算する i</complex.h></stdio.h>…

LAPACKを導入してC言語からコンパイル (Linux, Windows)

Fortran には LAPACK と呼ばれる密行列用の線形演算パッケージが存在する。 行列の固有値を求めたり連立方程式を解いたりしてくれる。便利。 疎行列にはARPACKを使ったほうがいいらしい。 今回は LAPACK を導入して C言語から呼び出す方法を書くよ。 Linux L…