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

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

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

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

Q&A

解決済

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

kisara11235
kisara11235

総合スコア18

C

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

1回答

0グッド

0クリップ

265閲覧

投稿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

試したこと

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

回答1

0

ベストアンサー

c

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

投稿2022/10/17 06:02

ozwk

総合スコア13079

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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