前へ 上へ 次へ
前へ 上へ 次へ
5 数値計算ライブラリを利用する
ここまでは数値計算プログラムを自作することについて説明しましたが、本セクションでは専門家が作成した数値計算ライブラリを利用することについて説明します。
数値計算プログラムで重要なのは、計算結果が正しいかどうかという点ですが、 その上でパフォーマンス面(計算スピード、メモリ効率等)も、重要となります。 これらの2つの条件を満足させるプログラムの作成には、誤差についての知識、アルゴリズムの理解、コンピュータハードウエアアーキテクチャへの精通、 特定のプログラミング言語の熟知等が必要となります。
幸いな事に良く利用される各種数値計算ルーチンは、このような知識や経験を持つ専門家により作成され、数値計算ライブラリとしてまとめ上げられたものが存在します。 もし自分が行いたいと思っている計算が、このような数値計算ライブラリに含まれているのであれば、(自作ルーチンを使わなければならない特段の理由がない限り)ライブラリを利用することが推奨されます。
本セクションではフリーで利用可能な代表的なライブラリ LAPACK を利用する例を説明します。 LAPACK(エルエーパックと発音される)は Linear Algebra PACKage の略で netlib.org よりダウンロードして無償で利用可能な数値計算ライブラリです。
LAPACKは主に以下の機能を提供しています。
- 連立一次方程式
- 最小二乗問題
- 固有値問題
5.1 数値計算ライブラリの一般的な利用方法
一般的に数値計算ライブラリを利用する手順は以下の3つのステップです。- 環境準備(ライブラリのインストール、初回のみ)
-
プログラムにライブラリルーチンを呼び出す記述を行う
例) call dgesv(n,.....,info) ! dgesvは連立一次方程式を解くLAPACKルーチン名
-
プログラムのコンパイル・リンク時にそのライブラリをリンク(結合)する旨を指定する事。
例) nagfor myprog.f90 -llapack ! lapackをリンクする指定例(環境によって異なります)
5.2 LAPACKに含まれる計算ルーチンを用いて連立方程式を解く
ガウスの消去法で取り扱った同じ問題を、LAPACKで提供されるサブルーチンを用いて解く例を以下に示します。連立方程式を解くライブラリルーチン dgesv の仕様に合わせて引数を用意し、call文を用いて呼び出しを行っています。 方程式を解く処理はすべてライブラリルーチン内で行われるので、プログラム本体は簡潔なものとなっています。
program call_lapack implicit none integer n, i, j, info double precision, allocatable :: a(:,:), b(:), ipiv(:) ! データを読み込む&配列の領域確保 read *, n allocate (a(n,n)) allocate (b(n)) allocate (ipiv(n)) read *, ((a(i,j),j=1,n),i=1,n), (b(i),i=1,n) ! ライブラリルーチンの呼び出し call dgesv(n,1,a,n,ipiv,b,n,info) ! 結果を出力 print * print *, "Solution" print "((f9.4))", b end program call_lapack[ call-lapack.f90 ] - LAPACKライブラリルーチンを呼び出すプログラム例
実行例: 3 33 16 72 -24 -10 -57 -8 -4 -17 -359 281 85 Solution 1.0000 -2.0000 -5.0000
前へ 上へ 次へ