質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

464閲覧

固有値計算がよくできていない

kisara11235

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/10/17 05:36

前提

固有値計算を行うプログラムの起動がおかしいです。

実現したいこと

固有値、固有ベクトル計算

発生している問題・エラーメッセージ

エラーは出ていないが、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

試したこと

教科書を見直してコードに不備がないか確かめました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PondVillege

2022/10/17 05:39

2次元配列uは単位行列だと思うんですけど,初期化の際に対角を1にせず0にしてしまってないですか? for(i=0;i<N;i++) u[i][i]=0.0; のところです
kisara11235

2022/10/17 05:45

ありがとうございます。その通りでした。 しかし、今度は固有値ベクトルが何度も表示されています。どうすればいいでしょうか。。。
guest

回答1

0

ベストアンサー

c

1 printf("固有ベクトル\n"); 2 for(i=0;i<N;j++){ // j++ ?

投稿2022/10/17 06:02

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisara11235

2022/10/17 06:15

解決いたしました。ありがとうございます。 また、結局自分の確認不足でした。申し訳ございません。
ozwk

2022/10/17 06:23

一応ポイントとしては 固有値が延々と画面に出てくるということはその部分のコードが何度も実行されているということで、 となるとそうなるように書かれてしまっているんだろうなというように 起きている事実を受け入れてコードを読みなおしてください (とはいえ思い込みがあるとなかなか難しいのですが) あと変数は関数の冒頭部分ではなく、使う直前、 特にループ変数はfor文の初期化文で定義しましょう。 (古いC言語コンパイラではそう書けませんが) これで今回のミスは予めコンパイルエラーで検出できます。 つまり int i for(i=0;i<N;i++) ではなく、 for(int i=0;i<N;i++) のようにです
jimbe

2022/10/17 06:27

>(とはいえ思い込みがあるとなかなか難しいのですが) 実際これが一番厄介ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問