/* power2.c 数値解析(C) 累乗法による固有値の計算 gcc power2.c -lm */ #include"sqmatrix.h" // sqmatrix.h を同じディレクトリに download せよ // 最大固有値 lambda と、lambda に対する固有ベクトル v の計算 void findmaxeigen(MATRIX a, double *lambda, VECTOR *v) { VECTOR v0,v1,w; double n,e1,e2,err=1.0e-10; // ランダムな単位ベクトル v1 (初期値)の生成 v1=randomvec(1.0); n=vecnorm(v1); v1=vecscmul(1.0/n,v1); /* 新 v <- ( Av 方向の単位ベクトル ) の反復 */ do{ v0=v1; // 直前の v1 を v0 として保存 v1=matvecmul(a,v0); // 新v1 = A 旧v n=vecnorm(v1); // v1 の長さを測って v1=vecscmul(1.0/n,v1); // v1 を長さ 1 に正規化 e1=vecnorm(vecsub(v1,v0)); // v1 と v0 の差を測定 e2=vecnorm(vecadd(v1,v0)); // v1 と -v0 の差を測定 }while(e1>err && e2>err); // 方向が安定したら終了 *v = v1; /* 固有値の計算 */ w=matvecmul(a,v1); *lambda=innerprod(w,v1)/innerprod(v1,v1); return; } main() { MATRIX a,a0; VECTOR u,v; int k; double lambda,x; RANDOMIZE(); // 乱数の初期化 SIZE=6; // 行列のサイズの設定 /* // ランダムな対称行列 A の生成 a=randommat(5.0); a=matadd(a,transmat(a)); */ /* // ランダムな整数係数対称行列 A の生成 a=randomintmat(5); a=matadd(a,transmat(a)); */ // 課題の行列の生成 ////////// ここを埋めよ ////////// // 行列 A の表示 printf("A :\n"); matprint(a); printf("\n"); // 検算のために A を A0 として保存 a0=a; for(k=0;k