C言語のプログラミングについての質問です。初めての投稿なのでお見苦しい点があると思います。
3×3の行列の解を求めるプログラムを作っているのですが、うまくいかず困っています。
ガウスの掃き出し法を使うのですが、枢軸を行の最大値がある列として掃きだします。
自分で作ってみたプログラムは下のようになりました。
c言語
1#include <stdio.h> 2#define nmax 3 3void hakidashi(double b[nmax][nmax+1], int jp[nmax]) 4{ 5 int i, j, k, l; 6 double bx[nmax]; /*各行の最大値*/ 7 for(i=0;i<nmax;i++){ 8 bx[i]=0.0; 9 for(j=0;j<nmax;j++){ 10 if(b[i][j]>bx[i]){ 11 jp[i]=j; 12 bx[i]=b[i][j]; 13 } 14 else{ 15 bx[i]=bx[i]; 16 } 17 } /*i行の最大値bx[i]を求める*/ 18 for(k=0;k<nmax+1;k++){ 19 b[i][k]=b[i][k]/bx[i]; 20 for(l=0;l<nmax;l++){ 21 if(l!=i){ 22 b[l][k]=b[l][k]-b[l][jp[i]]*b[i][k]; 23 } 24 } 25 } /*i行以外の行を掃き出し*/ 26 } 27} 28void irekae(double c[nmax][nmax+1], int jq[nmax]) 29{ 30 int n, o; 31 double temp; 32 for(n=0;n<nmax;n++){ 33 if(c[n][n]!=1.0){ 34 for(o=0;o<nmax+1;o++){ 35 temp=c[n][o]; 36 c[n][o]=c[jq[n]][o]; 37 c[jq[n]][o]=temp; 38 } 39 } 40 } /*単位行列になるように入れ替える*/ 41} 42int main(void) 43{ 44 FILE *fp; 45 int i1, j1; 46 int J[nmax]; 47 double a[nmax][nmax+1]; 48 for(i1=0;i1<nmax;i1++){ 49 J[i1]=0; 50 } 51 fp=fopen("gyouretsu.txt","r"); 52 for(i1=0;i1<nmax;i1++){ 53 fscanf(fp,"%lf%lf%lf%lf",&a[i1][0],&a[i1][1],&a[i1][2],&a[i1][3]); 54 } /*行列を読み込む*/ 55 hakidashi(a, J); 56 irekae(a, J); 57 for(i1=0;i1<nmax;i1++){ 58 printf("%lf %lf %lf %lf\n",a[i1][0],a[i1][1],a[i1][2],a[i1][3]); 59 } /*結果を出力*/ 60 fclose(fp); 61 return 0; 62}
また、読み込んだファイルは下のようになります。
58 86 53 1422
64 6 69 1052
65 82 21 1109
いくら考えても自分では手も足も出ず困っています。
お願いします。
何がうまくいっていないのでしょうか?
コンパイル付加? 実行時エラー? 結果が違う?
実行はできるのですが、結果がうまくいかず、infやnanが出てきてしまいます。情報不足で申し訳ないです<(_ _)>
コメントちゃんと書け。回答者にコードを"読み解く"ことを強いるでないよ。
fscanf(fp,"%d %d\n",&n1,&m1);でn1とm1を読みこんでますがこれは間違いですか?
>epistete様
コメントを付けました。申し訳ありませんでした。
>fu7mu4様
すいません。その部分は間違いです。
↑その行は"不要"ってことですか?
main関数に
fscanf(fp,"%lf%lf%lf%lf",&a[i1][0],&a[i1][1],&a[i1][2],&a[i1][3]);
とありますが、読み込みのは整数ですね。これは型が違いますよ。
正しいと思えるコードを再掲していただけますか?
すいません。コードを再掲しました。
なんで質問消すの? 回答寄せてくれた皆さんに失礼ちゃう?
回答4件
あなたの回答
tips
プレビュー