前提
固有値計算を行うプログラムの起動がおかしいです。
実現したいこと
固有値、固有ベクトル計算
発生している問題・エラーメッセージ
エラーは出ていないが、00000が繰り返し表示される
該当のソースコード
C
1//ヤコビ法による固有値と固有ベクトル計算// 2 3#include <stdio.h> 4#include <math.h> 5 6#define N 3 //次数設定 7#define EPS 0.0001 //収束範囲 8 9int main( int argc, char **argv) { 10 double a[N][N]={ 11 { 5.0000, -1.4142 , 0.0000}, 12 { -1.4142 , 1.5000 , -0.4082}, 13 { 0.0000, -0.4083, 0.3333} }; //係数行列 14 double u[N][N]; //単位行列 15 double alpha, beta, gamma; 16 double s,c,w; 17 double wa,wb,wc; 18 double max; 19 int i, j, p, q, x, y; 20 21 for(y=0;y<N;y++) 22 for(x=0;x<N;x++) 23 u[y][x]=0.0; 24 25 for(i=0;i<N;i++) 26 u[i][i]=0.0; 27 28 while(1){ 29 //最大要素の行と列を検索 30 max=0.0; 31 for(i=0;i<N-1;i++) 32 for(j=i+1;j<N;j++) 33 if(fabs(a[i][j])>max){ 34 p=i; 35 q=j; 36 max=fabs(a[i][j]); 37 } 38 //収束したら解答打ち出し 39 if(max<EPS) break; 40 41 //sin, cos 計算 42 wa=a[p][p]; 43 wb=a[p][q]; 44 wc=a[q][q]; 45 alpha=-wb; 46 beta=0.5*(wa-wc); 47 gamma=fabs(beta)/sqrt(alpha * alpha + beta * beta); 48 s=sqrt(0.5*(1.0-gamma)); 49 if(alpha*beta<0) s=-s; 50 c=sqrt(1.0-s*s); 51 //直行変換 52 for(j=0;j<N;j++){ 53 w=a[p][j]*c-a[q][j]*s; 54 a[q][j]=a[p][j]*s+a[q][j]*c; 55 a[p][j]=w; 56 } 57 58 for(j=0;j<N;j++){ 59 a[j][p]=a[p][j]; 60 a[j][q]=a[q][j]; 61 62 63 } 64 65 w=2.0*wb*s*c; 66 a[p][p]=wa*c*c+wc*s*s-w; 67 a[q][q]=wa*s*s+wc*c*c+w; 68 a[p][q]=0; 69 a[q][p]=0; 70 71 //漸化式計算 72 for(i=0;i<N;i++){ 73 w=u[i][p]*c-u[i][q]*s; 74 u[i][q]=u[i][p]*s+u[i][q]*c; 75 u[i][p]=w; 76 } 77 } 78 79 printf("固有値\n"); 80 for(i=0;i<N;i++) 81 printf("%7.4lf", a[i][i]); //対角成分 こいつが固有値 82 printf("\n\n"); 83 printf("固有ベクトル\n"); 84 for(i=0;i<N;j++){ 85 for(j=0;j<N;j++) 86 printf( "%7.4lf", u[i][j]); //固有ベクトル 87 printf("\n"); 88 } 89 return 0; 90} 91 92 93
試したこと
教科書を見直してコードに不備がないか確かめました。
回答1件
あなたの回答
tips
プレビュー