ホーム > 数値計算ソフトウェア > ライブラリ > LAPACK > CLAPACK > ルーチンの仕様 >

 DSYEV/ZHEEV (CLAPACK)

DSYEV/ZHEEV

実対称/エルミートな行列の全固有値とオプションとして固有ベクトルを計算する。

<関数>

int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda,

           doublereal *w, doublereal *work, integer *lwork, integer *info);

<引数>

char jobz - (input) 固有値だけしか計算しないか、固有値・固有ベクトルを計算するかのフラグ

                 ='N' 行列[A]の固有値だけを計算。

                 ='V' 行列[A]の固有値・固有ベクトル共に計算する。

char uplo - (input) 配列Aに上三角行列を格納するか、下三角行列を格納するかを指定するフラグ。規定値は以下の通りである。

                 ='U' 行列[A]の上三角部分を格納する。

                 ='L' 行列[A]の下三角部分を格納する。

long int n - (input) 正方行列[A]の次数。(n≧0) ここで、行列Aはn行n列である。

double a - (input/output) 配列形式はa[lda×n]。

               (input) 対称行列[A]の上三角行列もしくは下三角マトリクスを格納する。

                   uplo = 'U'のときは、行列Aの上三角部分を、n行n列配列の上三角部分に格納する。

                   uplo = 'L'のときは、行列Aの下三角部分を、n行n列配列の下三角部分に格納する。

               (output) jobz='V' かつ info = 0 ならば、配列Aには正規直行固有ベクトルが格納される。

                           jobz='N'の場合でも、配列Aは対角要素を含めて入力時に格納した値は破壊される。

long int lda - (input) 行列Aの第一次元(のメモリ格納数)。lda≧max(1,n) つまり、1〜nの中で一番大きい数よりも、ldaが大きくなければならない。

                  通常はlda=nで良い。

double w - (output) 次元数nの配列。計算された固有値が昇順で格納される(←info=0のとき)。

double work - (output) 次元数lworkの配列。info = 0のとき、work[0]は最適なlworkが格納される。

long int lwork - (input) 配列workの大きさを表す。

                     (DSYEVでは)基本的にはlwork≧max(1,3*n-1)で、効率的にするには、lwork≧(nb+2)*nとする。

                     ここで、nbはilaenv_によって返されるdsytrd_のためのブロックサイズである。

                     いずれにしろ、計算性能を向上させるにはlworkを大きくとればよい。といってみるテスト。

double rwork - (workspace) <zheevのみ> 次元数max(1,3*n-2)の配列。つまり、1〜3*n-2の中で一番大きい数をとる。

                     通常はrwork = 3*n-2で良い。

long int info - (output)

             info = 0: 正常終了

             info < 0: info = -i ならば、i番目の引数の値が間違えていることを示す。

             info > 0: このアルゴリズムは収束しなかった。中間体である三重対角形のi個の非対角要素はゼロに収束しなかった。

の固有値、固有ベクトルを求める。

#include <stdio.h>

#define N 3

double A[N*N];

double w[N];

double work[3*N];

int main(void)

{

  long int i;

  char jobz = 'V';

  char uplo ='U';

  long int n=N,lda=N,lwork=3*N,info;

  A[0]=9.;A[1]=999.;A[2]=999.; /* 999が入っている配列の値は利用されない */

  A[3]=1.;A[4]=9.;A[5]=999.;

  A[6]=1.;A[7]=1.;A[8]=9.;

  dsyev_(&jobz, &uplo, &n, A, &lda, w, work, &lwork, &info);

  for(i=0;i<N;++i) printf("%lf : vector=[ %lf %lf %lf ]\n",w[i] ,A[i*N], A[i*N+1], A[i*N+2]);

  return 0;

}


Copyright (C) 2001 Keisuke ABE. All Rights Reserved.