2002年2月14日 htmlファイル作成
関谷トップページへ 数値計算2001s トップページへ   数値計算2001s No.18 実対称行列の固有値・固有ベクトル解法ページへ   作者へのメッセージ

数値計算2001s No.18 実対称行列の固有値・固有ベクトル解法 ヤコビ法プログラム

/* jacobipq.c   program for jacobiの実対称行列の固有値・固有ベクトル解法
   応用数値計算法入門 pp.80-89   1996.9.26 z.sekiya( k134084 関谷順太)
	1997.10.27 正方行列に限定して関数名の変更、p'ap の検算の追加
	1997.11.4	戸川の式(6.19,6.20)により、対角化の計算を行う。	*/

/* プログラム仕様
1. インプット
1) データのタイトル  半角で49文字まで、(例:"1.9.3項")
2) n:実対称行列の次数
3) 実対称行列のaの要素(n行数 × n列数個)
 			行列の添え字は、1からとし、実数データとする

2.処理
1) パラメータデータを読み込む
2) 実対称行列aを読み込み、その表示(チェックプリント)を行う
3) ヤコビ法で、固有値・固有ベクトルを解く。
4) 収束すれば、解,検算結果1)pap、2)逆行列piを出力する。
5) 収束しないときは収束しないと出力する。

3.アウトプット
1) ヤコビ法とデータのタイトル(学籍番号と氏名もつけること)
2) 入力した実対称行列a(行列の名前と、行番号をつける)
3) 計算過程(繰り返し数、 非対角要素(k,l)の絶対値最大値,sin,cos,tan,
				直交変換後の要素,繰り返し途中の行列a,p)
4) 収束すれば、解(固有値・固有ベクトル)、検算1)pap, 2)pi
5) 収束しないときは「収束しない」
*/

#define NM 20							/*  最大の行・列 */

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//											/*  関数のプロトタイプ宣言 */
void symInput(int, double [NM][NM]);		/*  実対称行列の入力関数 */
void sOutput(char [], int, double [NM][NM]);/* 正方行列の出力関数 */
void sOutput2(char [], int, double [][NM], double [][NM]);/* 2 行列/行 */
void jacobif(int, double [NM][NM], double [NM][NM], int*);
void sMatrixCopy(int, double [][NM], double [][NM]);
void sTranspose(char [], int, double [][NM], double [][NM]);
void sProduct(char [], int, double [][NM], double [][NM], double[][NM]);
void inverse(int, double [][NM], double [][NM], double[][NM], double*, int*);

void main(void)
{
	double 	a[NM][NM], p[NM][NM];		/* a:行列(戻りは対角に固有値)p:モード行列 */
	double 	ac[NM][NM], pta[NM][NM], ptap[NM][NM];	/* ac:ac=a, pa=pt*a, pap=pa*p */
	double 	pt[NM][NM], pi[NM][NM], work[NM][NM], det;	/* pt=p' */
	int  	n, i, j, cond;				/* cond: 0なら、収束した */
	char   	title[50];
	char    *pa;        /* *pa:日付用文字列(ポインタ変数)*/
	long nowtime;

	time(&nowtime);
	pa = ctime(&nowtime);
	*(pa+24)='\0';
	printf("<%s>\n", pa);	/* 実行年月日などをコマンドプロンプトに表示する。 */
	
	scanf("%s", title);					/*  データタイトルの入力 */
	printf("<<< ヤコビ法(実対称行列の固有値解法)戸川の式 %s by k134084 関谷順太 >>>\n",title); 						/* プログラム、データタイトル表示 */

	scanf("%d", &n);					/*  次数nの入力 */
	if(n>19) {
		printf("プログラムの制限を超えています。");
		exit(1);
	}
	symInput(n, a);						/*  実対称行列Aの入力 */
	sMatrixCopy(n, a, ac);
	jacobif(n, a, p, &cond);			/*  ヤコビ法関数を呼ぶ */
	
	if(cond == 0){						/*  結果の出力  */
		printf("解が求まりました\n  固有値     固有ベクトル\n");
		for(j=1; j<=n; j++){
			printf("%8.3f  ", a[j][j]);
										/* 固有ベクトルの表示 	*/
			for(i=1; i<=n; i++)
				printf(" %8.3f",p[i][j]);	 
			printf("\n");
		}
		sTranspose("転置行列pt", n, p, pt);
		sProduct("積p'*a", n, pt, ac, pta);
		sProduct("積p'ap", n, pta, p, ptap);
		inverse(n, p, pi, work, &det, &cond);
		if (cond == 0) 
			sOutput(" 逆行列pi ", n, pi);
	}else
	    printf("解が求まりません(収束しない)\n");
}

void jacobif(int n, double a[][NM],double p[][NM], int* cond)
{	/*  ヤコビ法(実対称行列の固有値・固有ベクトル計算)戸川のp.117-124) */
	/*  n: 実対称行列の次数  a:行列(結果として対角に固有値)p:モード行列  
	    cond: 0なら、収束した			*/

	int i, j, k, km, l, m, nm1, ip1;
	double eps, amax, akk, all,akl, wk, sd, t,c,s,pik, pil,aik, ail, s2,ss,cc;
	double 	akj, alj;
	eps = 1.0e-6;
		
	for(i=1;i<=n; i++)					/*  行列pの初期値をセット  */
		for(j=1;j<=n; j++)
			if(i!=j) p[i][j]=0.0;  else  p[i][j]=1.0;
			
	sOutput2("ヤコビ法、初期値a,p", n, a, p);
		
	nm1=n-1; m=100;							/*  m=(n*n-n)/2; m:繰り返し数   */
	for(km=1; km<=m; km++) {				/*  絶対値最大の非対角要素を探す */
		amax=0.0;
		for(i=1;i<=nm1; i++){
			ip1=i+1;
			for(j=ip1;j<=n; j++){
				wk=fabs(a[i][j]);
				if(wk<=amax) continue;
				else {						/*  最大値amax、行k、列lのセット */
					amax=wk;	k=i;	l=j;
				}
			}
		}
		if(amax<eps) {						/* 収束した */
			printf("(yacobi法で収束までの直交変換の繰り返し数: %d)\n", km-1);
			*cond=0; return;
		}
		printf("(繰り返し数: %d、 非対角要素の絶対値最大値:%f )", km-1,amax);
		printf(" その要素のk:%d   l:%d\n", k, l);	
		akk=a[k][k];	 all=a[l][l]; 	akl=a[k][l];	wk=akk-all;
		sd=sqrt(wk*wk+4.0*akl*akl);
		t=2.0*akl/(wk-sd);							/* (1.9.59) */
		c=1.0/sqrt(1.0+t*t);						/* (1.9.60)  */
		s=c*t;
											/* 直交変換  (戸川、p.119)  */
		for (j = 1; j <= n; j++) {			/* 左からのRtA乗算(6.19) */
			akj = a[k][j]; alj =a[l][j];
			???
		}
		for (i = 1; i <= n; i++) {			/* 右からの(RtA)R乗算(6.20)*/
			aik = a[i][k]; ail =a[i][l];
			???
		}
		for(i=1; i<=n; i++){				/* 固有ベクトル乗算(右から)*/			
			pik=p[i][k]; pil=p[i][l]; 
			???
		}
		sOutput2("  繰り返し途中のa,p", n, a, p);
	}
	*cond=1;
}

void symInput(int n, double x[][NM])	
{							/* 実対称行列の入力 関数
								n:次数、x:実対称行列		 */
	int i,j;
	for(i=1;i<=n; i++)
		for(j=1;j<=n; j++){
			scanf("%lf",&x[i][j]);			/*  行iの成分ijの入力 */
			if(i>j)							/*  実対称か否かのチェック */
				if(x[i][j] != x[j][i]){
					printf("行列が対称でない x[%d][%d]\n", i,j);
					exit(1);
				}
		}
	sOutput("実対称行列A", n, x);			/*  チェックプリント */
}

void sOutput(char matrixName[], int n, double x[][NM])
{									/* 正方行列の出力 関数 */
	int i,j;

	printf("\nMatrix: %s  \n", matrixName);	/*行列名の表示*/
	printf("行/列   ");
	for (j = 1; j <= n; j++)					/*   列番号のループ */
		printf(" %3d     ", j);				/*   見出し 列jの表示 */
	printf("\n");

	for(i=1;i<=n; i++){
		printf("%3d  ", i);					/*  行番号の表示 */
		for(j=1;j<=n; j++)
			printf(" %8.3f", x[i][j]);		/*  行iの成分ijの表示 */
		printf("\n");
	}
} 
void sMatrixCopy(int n, double a[][NM], double ac[][NM])
{					/* 行列のコピー関数 */
	int i,j;		/* n:元数 	a[n][n], ac[n][n]:行列 */ 
	for(i=1;i<=n; i++)						/* 行のループ  */ 
		for(j=1;j<=n; j++)					/*   列のループ  */
			ac[i][j] = a[i][j];				/*     成分ijの代入 */
}
/*  正方行列(n,n)の積の計算 関数, 結果の行列の表示も行う。cc = aa * bb */
void sProduct(char title[], int n, double aa[][NM],
		 double bb[][NM], double cc[][NM])
{
	int i,j,k; double x;
	
	for(i=1;i<=n;i++)
		for(k=1;k<=n;k++){
			cc[i][k]=x=0.0;
			for(j=1; j<=n; j++)
				x += aa[i][j] * bb[j][k];	/*  成分の積和  */
			cc[i][k]=x;
		}
	sOutput(title, n, cc);				/*  積の出力 */
}

/* 正方行列の転置関数, 結果の転置行列の表示も行う。
			入力行列 x[n][n]、xの転置行列xt[n][n] */
void sTranspose(char matrixName[], int n, double x[][NM], double xt[][NM])	
{
	int i,j;
	for (i = 1; i<=n; i++)
		for (j = 1; j <= n; j++) {
			xt[j][i] = x[i][j];				/*  転置行列の成分j,i */
		}
	sOutput(matrixName, n, xt);
}

/* 行列の出力 関数2  正方行列の名前 matrixName[], x[n][n],x2[n][n]*/
void sOutput2(char matrixName[], int n, double x[][NM], double x2[][NM])
{
	int i,j;
	printf("Matrix: %s  \n", matrixName);	/*行列名の表示*/
	printf("行/列   ");
	for (j = 1;j <= n; j++)					/*   列番号のループ for x */
		printf(" %3d     ", j);				/*   列jの表示 */
	printf("   ");
	for (j = 1; j <= n; j++)				/*   列番号のループ for x2 */
		printf(" %3d     ", j);				/*   列jの表示 */
	printf("\n");

	for (i = 1; i <= n; i++){
		printf("%3d  ", i);					/*  行番号の表示 */
		for (j = 1; j <= n; j++)			/*  列番号のループ for x */
			printf(" %8.5lf", x[i][j]);		/*  xの成分ijの表示 */
		printf("   ");
		for (j = 1; j <= n; j++)			/*  列番号のループ for x2 */
			printf(" %8.5lf", x2[i][j]);	/*  x2の成分ijの表示 */	
		printf("\n");
	}
} 

/*  逆行列, 行列式の値計算 関数(消去法による) */
void inverse(int n, double a[][NM], double b[][NM], double cc[][NM],
	 double* det, int* cond)
{
/*	n: 正方行列の次数、 
	a(input matrix),b(inversed matrix, a-1),cc(work):正方行列
	det: 行列式|a|の値、  	cond: 0なら逆行列がある。			*/

	int i,j,k,imax, kp1, m;
	double eps, amax, absaik, work, akk, aik;
	
	eps = 1.0e-5;
	*det = 1.0;
	m=0;									/*  行の交換回数 */
		
	for(i=1;i<=n;i++)						
		for(j=1;j<=n;j++){
			 cc[i][j]=a[i][j];				/*  行列aのccへの保存 */
			 if(i==j) b[i][j]=1.0;	else b[i][j]=0.0;/* bを単位行列にセット */
		}
	
	for(k=1; k<=n; k++) {					/*  行kの1からnまでの繰り返し */
		imax=k;								/*  枢軸( pivot )imaxの初期値k */
		amax= fabs(a[k][k]);				/*  amaxに a[k][k]の絶対値をセット */
		if(k != n){
			kp1=k+1;
			for(i=kp1; i<=n; i++){			/* 最大値の探索ループ */
				absaik=fabs(a[i][k]);		/* 列の要素をabsaikとする */
				if(absaik <= amax) continue;/* absaik <= amaxなら、ループ端へ */
				imax = i;	amax= absaik;	/* else、最大行imax=i,amax= absaik*/
			}
		}
		if(amax <= eps) {
			*cond=k;	return;				/* 逆行列が存在しない */
		}
		if(imax != k){						/* imaxとkが違うなら、行の入れ替え */
			m++; 
			for(j=1; j<=n; j++){
				work = a[imax][j];	a[imax][j] = a[k][j];	a[k][j] = work;
				work = b[imax][j];	b[imax][j] = b[k][j];	b[k][j] = work;
			}	
		}
		akk = a[k][k];						/* 主対角要素をakkとする */
		*det *= akk;						/* 行列式の計算 */	
		for(j=1; j<=n; j++){				/* 消去ステップ1 k行 */
			a[k][j] = a[k][j]/akk;	b[k][j] = b[k][j]/akk;
		}
		for(i=1; i<=n; i++){				/* 消去ステップ2 kでない行*/
			if(i==k) continue;
			aik = a[i][k];
			for(j=1; j<=n; j++){
				a[i][j] -= aik*a[k][j];	b[i][j] -= aik*b[k][j];
			}
		}
//	sOutput2("枢軸(pivot)行入替えによる消去途中の行列a,b ", n, n, a, b);	
	}
	*det *= pow(-1.0,(double)m);			/*  (1.7.8)行列式の符号 */ 
	*cond = 0;								/* 	逆行列があった */

	for(i=1;i<=n;i++)						/*  行列aをccを使い、元に戻す */
		for(j=1;j<=n;j++)
			 a[i][j]=cc[i][j];
}

/*
(1) 収束が早い例
<Wed Mar 13 15:28:16 2002>
<<< ヤコビ法(実対称行列の固有値解法)戸川の式 戸川p.121-124 by k134084 関谷順太 >>>

Matrix: 実対称行列A  
行/列      1        2        3        4     
  1      5.000    4.000    1.000    1.000
  2      4.000    5.000    1.000    1.000
  3      1.000    1.000    4.000    2.000
  4      1.000    1.000    2.000    4.000
Matrix: ヤコビ法、初期値a,p  
行/列      1        2        3        4           1        2        3        4     
  1    5.00000  4.00000  1.00000  1.00000     1.00000  0.00000  0.00000  0.00000
  2    4.00000  5.00000  1.00000  1.00000     0.00000  1.00000  0.00000  0.00000
  3    1.00000  1.00000  4.00000  2.00000     0.00000  0.00000  1.00000  0.00000
  4    1.00000  1.00000  2.00000  4.00000     0.00000  0.00000  0.00000  1.00000
(繰り返し数: 0、 非対角要素の絶対値最大値:4.000000 ) その要素のk:1   l:2
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    1.00000  0.00000  0.00000  0.00000     0.70711  0.70711  0.00000  0.00000
  2    0.00000  9.00000  1.41421  1.41421    -0.70711  0.70711  0.00000  0.00000
  3    0.00000  1.41421  4.00000  2.00000     0.00000  0.00000  1.00000  0.00000
  4    0.00000  1.41421  2.00000  4.00000     0.00000  0.00000  0.00000  1.00000
(繰り返し数: 1、 非対角要素の絶対値最大値:2.000000 ) その要素のk:3   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    1.00000  0.00000  0.00000  0.00000     0.70711  0.70711  0.00000  0.00000
  2    0.00000  9.00000  0.00000  2.00000    -0.70711  0.70711  0.00000  0.00000
  3    0.00000  0.00000  2.00000  0.00000     0.00000  0.00000  0.70711  0.70711
  4    0.00000  2.00000  0.00000  6.00000     0.00000  0.00000 -0.70711  0.70711
(繰り返し数: 2、 非対角要素の絶対値最大値:2.000000 ) その要素のk:2   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    1.00000  0.00000  0.00000  0.00000     0.70711  0.31623  0.00000  0.63246
  2    0.00000  5.00000  0.00000 -0.00000    -0.70711  0.31623  0.00000  0.63246
  3    0.00000  0.00000  2.00000  0.00000     0.00000 -0.63246  0.70711  0.31623
  4    0.00000 -0.00000  0.00000 10.00000     0.00000 -0.63246 -0.70711  0.31623
(yacobi法で収束までの直交変換の繰り返し数: 3)
解が求まりました
  固有値     固有ベクトル
   1.000      0.707   -0.707    0.000    0.000
   5.000      0.316    0.316   -0.632   -0.632
   2.000      0.000    0.000    0.707   -0.707
  10.000      0.632    0.632    0.316    0.316

Matrix: 転置行列pt  
行/列      1        2        3        4     
  1      0.707   -0.707    0.000    0.000
  2      0.316    0.316   -0.632   -0.632
  3      0.000    0.000    0.707   -0.707
  4      0.632    0.632    0.316    0.316

Matrix: 積p'*a  
行/列      1        2        3        4     
  1      0.707   -0.707    0.000    0.000
  2      1.581    1.581   -3.162   -3.162
  3      0.000    0.000    1.414   -1.414
  4      6.325    6.325    3.162    3.162

Matrix: 積p'ap  
行/列      1        2        3        4     
  1      1.000    0.000    0.000    0.000
  2      0.000    5.000    0.000   -0.000
  3      0.000    0.000    2.000    0.000
  4      0.000    0.000    0.000   10.000

Matrix:  逆行列pi   
行/列      1        2        3        4     
  1      0.707   -0.707   -0.000    0.000
  2      0.316    0.316   -0.632   -0.632
  3      0.000    0.000    0.707   -0.707
  4      0.632    0.632    0.316    0.316

(2) これは収束が遅い例である。
<<< ヤコビ法(実対称行列の固有値解法)戸川の式 多変量p.85 by k134084 関谷順太 >>>

Matrix: 実対称行列A  
行/列      1        2        3        4     
  1      1.000    0.863    0.732    0.920
  2      0.863    1.000    0.896    0.883
  3      0.732    0.896    1.000    0.783
  4      0.920    0.883    0.783    1.000
Matrix: ヤコビ法、初期値a,p  
行/列      1        2        3        4           1        2        3        4     
  1    1.00000  0.86320  0.73210  0.92050     1.00000  0.00000  0.00000  0.00000
  2    0.86320  1.00000  0.89650  0.88270     0.00000  1.00000  0.00000  0.00000
  3    0.73210  0.89650  1.00000  0.78290     0.00000  0.00000  1.00000  0.00000
  4    0.92050  0.88270  0.78290  1.00000     0.00000  0.00000  0.00000  1.00000
(繰り返し数: 0、 非対角要素の絶対値最大値:0.920500 ) その要素のk:1   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07950 -0.01379 -0.03592  0.00000     0.70711  0.00000  0.00000  0.70711
  2   -0.01379  1.00000  0.89650  1.23454     0.00000  1.00000  0.00000  0.00000
  3   -0.03592  0.89650  1.00000  1.07127     0.00000  0.00000  1.00000  0.00000
  4    0.00000  1.23454  1.07127  1.92050    -0.70711  0.00000  0.00000  0.70711
(繰り返し数: 1、 非対角要素の絶対値最大値:1.234538 ) その要素のk:2   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07950 -0.01133 -0.03592 -0.00786     0.70711 -0.40332  0.00000  0.58080
  2   -0.01133  0.14271  0.12533  0.00000     0.00000  0.82138  0.00000  0.57038
  3   -0.03592  0.12533  1.00000  1.39126     0.00000  0.00000  1.00000  0.00000
  4   -0.00786  0.00000  1.39126  2.77779    -0.70711 -0.40332  0.00000  0.58080
(繰り返し数: 2、 非対角要素の絶対値最大値:1.391264 ) その要素のk:3   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07950 -0.01133 -0.02773 -0.02415     0.70711 -0.40332 -0.27903  0.50939
  2   -0.01133  0.14271  0.10992  0.06021     0.00000  0.82138 -0.27402  0.50025
  3   -0.02773  0.10992  0.23791 -0.00000     0.00000  0.00000  0.87704  0.48041
  4   -0.02415  0.06021 -0.00000  3.53988    -0.70711 -0.40332 -0.27903  0.50939
(繰り返し数: 3、 非対角要素の絶対値最大値:0.109922 ) その要素のk:2   l:3
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07950  0.00575 -0.02939 -0.02415     0.70711 -0.18397 -0.45462  0.50939
  2    0.00575  0.07052  0.00000  0.05033     0.00000  0.83699  0.22182  0.50025
  3   -0.02939 -0.00000  0.31010  0.03305     0.00000 -0.48142  0.73310  0.48041
  4   -0.02415  0.05033  0.03305  3.53988    -0.70711 -0.18397 -0.45462  0.50939
(繰り返し数: 4、 非対角要素の絶対値最大値:0.050330 ) その要素のk:2   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07950  0.00610 -0.02939 -0.02407     0.70711 -0.19133 -0.45462  0.50667
  2    0.00610  0.06979 -0.00048 -0.00000     0.00000  0.82964  0.22182  0.51234
  3   -0.02939 -0.00048  0.31010  0.03305     0.00000 -0.48834  0.73310  0.47338
  4   -0.02407  0.00000  0.03305  3.54061    -0.70711 -0.19133 -0.45462  0.50667
(繰り返し数: 5、 非対角要素の絶対値最大値:0.033048 ) その要素のk:3   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07950  0.00610 -0.02914 -0.02437     0.70711 -0.19133 -0.45978  0.50199
  2    0.00610  0.06979 -0.00048 -0.00000     0.00000  0.82964  0.21657  0.51458
  3   -0.02914 -0.00048  0.30976  0.00000     0.00000 -0.48834  0.72822  0.48086
  4   -0.02437 -0.00000  0.00000  3.54095    -0.70711 -0.19133 -0.45978  0.50199
(繰り返し数: 6、 非対角要素の絶対値最大値:0.029145 ) その要素のk:1   l:3
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07587  0.00600  0.00000 -0.02418     0.64483 -0.19133 -0.54369  0.50199
  2    0.00600  0.06979 -0.00123 -0.00000     0.02678  0.82964  0.21491  0.51458
  3    0.00000 -0.00123  0.31339  0.00301     0.09005 -0.48834  0.72263  0.48086
  4   -0.02418 -0.00000  0.00301  3.54095    -0.75853 -0.19133 -0.36882  0.50199
(繰り返し数: 7、 非対角要素の絶対値最大値:0.024181 ) その要素のk:1   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.07570  0.00600  0.00002 -0.00000     0.64831 -0.19133 -0.54369  0.49748
  2    0.00600  0.06979 -0.00123 -0.00005     0.03037  0.82964  0.21491  0.51438
  3    0.00002 -0.00123  0.31339  0.00301     0.09340 -0.48834  0.72263  0.48022
  4    0.00000 -0.00005  0.00301  3.54112    -0.75501 -0.19133 -0.36882  0.50727
(繰り返し数: 8、 非対角要素の絶対値最大値:0.005996 ) その要素のk:1   l:2
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.06606 -0.00000  0.00106  0.00004     0.50495  0.44938 -0.54369  0.49748
  2    0.00000  0.07943 -0.00063 -0.00002    -0.68837  0.46408  0.21491  0.51438
  3    0.00106 -0.00063  0.31339  0.00301     0.46397 -0.17869  0.72263  0.48022
  4    0.00004 -0.00002  0.00301  3.54112    -0.23641 -0.74213 -0.36882  0.50727
(繰り返し数: 9、 非対角要素の絶対値最大値:0.003013 ) その要素のk:3   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.06606 -0.00000  0.00106  0.00004     0.50495  0.44938 -0.54415  0.49697
  2    0.00000  0.07943 -0.00063 -0.00003    -0.68837  0.46408  0.21443  0.51458
  3    0.00106 -0.00063  0.31339 -0.00000     0.46397 -0.17869  0.72218  0.48089
  4    0.00004 -0.00003  0.00000  3.54112    -0.23641 -0.74213 -0.36929  0.50693
(繰り返し数: 10、 非対角要素の絶対値最大値:0.001056 ) その要素のk:1   l:3
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.06606  0.00000 -0.00000  0.00004     0.50727  0.44938 -0.54199  0.49697
  2    0.00000  0.07943 -0.00063 -0.00003    -0.68928  0.46408  0.21149  0.51458
  3    0.00000 -0.00063  0.31339  0.00000     0.46089 -0.17869  0.72415  0.48089
  4    0.00004 -0.00003  0.00000  3.54112    -0.23484 -0.74213 -0.37030  0.50693
(繰り返し数: 11、 非対角要素の絶対値最大値:0.000632 ) その要素のk:2   l:3
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.06606  0.00000 -0.00000  0.00004     0.50727  0.44791 -0.54320  0.49697
  2    0.00000  0.07943  0.00000 -0.00003    -0.68928  0.46465  0.21023  0.51458
  3   -0.00000 -0.00000  0.31339  0.00000     0.46089 -0.17673  0.72463  0.48089
  4    0.00004 -0.00003  0.00000  3.54112    -0.23484 -0.74313 -0.36829  0.50693
(繰り返し数: 12、 非対角要素の絶対値最大値:0.000041 ) その要素のk:1   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.06606  0.00000 -0.00000 -0.00000     0.50727  0.44791 -0.54320  0.49698
  2    0.00000  0.07943  0.00000 -0.00003    -0.68929  0.46465  0.21023  0.51457
  3   -0.00000 -0.00000  0.31339  0.00000     0.46088 -0.17673  0.72463  0.48090
  4   -0.00000 -0.00003  0.00000  3.54112    -0.23484 -0.74313 -0.36829  0.50692
(繰り返し数: 13、 非対角要素の絶対値最大値:0.000025 ) その要素のk:2   l:4
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.06606  0.00000 -0.00000 -0.00000     0.50727  0.44792 -0.54320  0.49697
  2    0.00000  0.07943  0.00000 -0.00000    -0.68929  0.46465  0.21023  0.51457
  3   -0.00000  0.00000  0.31339  0.00000     0.46088 -0.17673  0.72463  0.48090
  4   -0.00000  0.00000  0.00000  3.54112    -0.23484 -0.74313 -0.36829  0.50693
(繰り返し数: 14、 非対角要素の絶対値最大値:0.000003 ) その要素のk:1   l:2
Matrix:   繰り返し途中のa,p  
行/列      1        2        3        4           1        2        3        4     
  1    0.06606 -0.00000 -0.00000 -0.00000     0.50718  0.44802 -0.54320  0.49697
  2    0.00000  0.07943  0.00000 -0.00000    -0.68938  0.46452  0.21023  0.51457

  3   -0.00000  0.00000  0.31339  0.00000     0.46092 -0.17663  0.72463  0.48090
  4   -0.00000 -0.00000  0.00000  3.54112    -0.23469 -0.74317 -0.36829  0.50693
(yacobi法で収束までの直交変換の繰り返し数: 15)
解が求まりました
  固有値     固有ベクトル
   0.066      0.507   -0.689    0.461   -0.235
   0.079      0.448    0.465   -0.177   -0.743
   0.313     -0.543    0.210    0.725   -0.368
   3.541      0.497    0.515    0.481    0.507

Matrix: 転置行列pt  
行/列      1        2        3        4     
  1      0.507   -0.689    0.461   -0.235
  2      0.448    0.465   -0.177   -0.743
  3     -0.543    0.210    0.725   -0.368
  4      0.497    0.515    0.481    0.507

Matrix: 積p'*a  
行/列      1        2        3        4     
  1      0.034   -0.046    0.030   -0.016
  2      0.036    0.037   -0.014   -0.059
  3     -0.170    0.066    0.227   -0.115
  4      1.760    1.822    1.703    1.795

Matrix: 積p'ap  
行/列      1        2        3        4     
  1      0.066    0.000   -0.000   -0.000
  2      0.000    0.079    0.000   -0.000
  3     -0.000    0.000    0.313    0.000
  4     -0.000   -0.000    0.000    3.541

Matrix:  逆行列pi   
行/列      1        2        3        4     
  1      0.507   -0.689    0.461   -0.235
  2      0.448    0.465   -0.177   -0.743
  3     -0.543    0.210    0.725   -0.368
  4      0.497    0.515    0.481    0.507
*/