|
DGBSV/ZGBSV (CLAPACK) |
DGBSV/ZGBSV
一般帯行列[A]をもつ連立一次方程式[A]{X}={B}を解く。
<関数>
int dgbsv_(integer *n, integer *kl, integer *ku, integer *nrhs,
doublereal *ab, integer *ldab, integer *ipiv, doublereal *b,
integer *ldb, integer *info);
<引数>
long int n - (input) 連立一次方程式の式数。正方行列[A]の次数。(n≧0) ここで、行列[A]はn行n列である。
long int kl - (input) 行列[A]の帯内の対角下要素の個数。(kl≧0)
long int ku - (input) 行列[A]の帯内の対角上要素の個数。(ku≧0)
ku

kl n
long int nrhs - (input) 行列{B}の列数。(nrhs≧0) 通常Bはベクトルなので、通常の使用では1となる。
double ab - (input/output) 配列形式はa[ldab×n]。
(input)n行n列の係数行列[A]を行kl+1から行2*kl+ku+1に対格納形式で入れる。配列の1行〜kl行には値は入れなくても良い。
配列[AB]の第j列には次のように値を格納する。
max( 1, j-ku ) <= i <= min( N, j+kl ) に対して AB( kl+ku+1+i-j, j ) = A( i, j ) を行う。
(output)LU分解後の行列[L]と行列[U]の結果。
ただし、行列[U]は行1〜kl+ku+1にkl+ku個の対角上要素からなる上三角帯行列として格納。
また、行kl+ku+2から行2*kl+ku+1行にLU分解時に使用した乗数を格納。
long int ldab - (input) 行列ABの第一次元(のメモリ格納数)。(ldab≧2*kl+ku+1)。
通常はladb=2*kl+ku+1で良い。
long int ipiv - (output) 大きさnの配列。置換行列[P]を定義する軸選択用添え字。
double b - (input/output) 配列形式はb[ldb×nrhs]。二次元配列b[ldb][nrhs]の場合は、一次元配列bb[ldb×nrhs]に格納してポインタを渡す。
通常はnrhsが1なので、配列形式がb[ldb]となる。
(input) b[ldb×nrhs]の配列形式をした右辺行列{B}。
(output) info = 0 の場合に、b[ldb×nrhs]形式の解行列{X}。
long int ldb - (input) 配列bの第一次元。ldb≧max(1,n) つまり、1〜nの中で一番大きい数よりも、ldbが大きくなければならない。
通常はldb=nで良い。
long int info - (output)
info = 0: 正常終了
info < 0: info = -i ならば、i番目の引数の値が間違えていることを示す。
0 < info <N+1: 固有ベクトルは計算されていない。
info > N: LAPACK内で問題が生じたことを示す。
帯行列状態の行列[A]
a11 a12 * * * *
a21
a22 a23 * * *
a31 a32 a33
a34 * *
* a42 a43 a44 a45
*
* * a53 a54 a55 a56
*
* * a64 a65 a66
行列[A]から作成された帯格納行列[AB]
* * * +
+ +
* *
+ + +
+
* a12 a23 a34
a45 a56
a11 a22 a33 a44 a55 a66
a21
a32 a43 a54 a65 *
a31 a42 a53
a64 * *
計算後の行列[AB]
* * * u14
u25 u36
* * u13
u24 u35 u46
* u12 u23
u34 u45 u56
u11 u22 u33 u44
u55 u66
m21 m32 m43 m54 m65 *
m31
m42 m53 m64 * *
を解く。
|
#include <stdio.h> #define N 6 double AB[N*N]; double x[N]; int main(void) { static int i; static long int n=N,kl=2,ku=1,inc=1,ldab,info,piv[N]; ldab=2*kl+ku+1; AB[0]=0.;AB[1]=0.;AB[2]=0.;AB[3]=1.;AB[4]=3.;AB[5]=1.; AB[6]=0.;AB[7]=0.;AB[8]=2.;AB[9]=2.;AB[10]=1.;AB[11]=2.; AB[12]=0.;AB[13]=0.;AB[14]=1.;AB[15]=1.;AB[16]=1.;AB[17]=-1.; AB[18]=0.;AB[19]=0.;AB[20]=1.;AB[21]=2.;AB[22]=-1.;AB[23]=1.; AB[24]=0.;AB[25]=0.;AB[26]=-1.;AB[27]=2.;AB[28]=1.;AB[29]=0.; AB[30]=0.;AB[31]=0.;AB[32]=1.;AB[33]=1.;AB[34]=0.;AB[35]=0.; x[0]=5.;x[1]=10.;x[2]=10.;x[3]=10.;x[4]=9.;x[5]=15.; printf("N = %d\n",N); dgbsv_(&n,&kl,&ku,&inc,AB,&ldab,piv,x,&n,&info); for(i=0;i<N;++i) printf("%lf\n",x[i]); return 0; } |
Copyright (C) 2001 Keisuke ABE. All Rights Reserved.