ガウスの消去法(連立方程式)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
n]o

ガウスの消去法(連立方程式)

#1

投稿記事 by n]o » 10年前

こんばんは
ガウスの消去法を使って、下の連立方程式を解くプログラムを書いているのですが、うまくできません。
間違っているところを教えていただきたいです

x + y + z + w = 33
x + y - w = 5
3x+5y+7z+10w = 218

コード:

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>

void swap(double *a,double *b){
	double t;
	t=*a;
	*a=*b;
	*b=t;
}


int main(){
	FILE *fp;
	double a[100][100],c[100][100],t,max,x[5],r,y,z,w;
	int i,j,k,l,n,maxline,o;

	if((fp = fopen("a.csv","r"))==NULL){
		printf("Can't open <<a.csv>>!!\n");
		exit(1);
	}

	n=4;
	for(i=1;i<=n-1;i++){
		fscanf(fp,"%lf,%lf,%lf,%lf,%lf",&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
		printf("%lf,%lf,%lf,%lf\n",a[i][1],a[i][2],a[i][3],a[i][4]);
	}
	


	for(i=1;i<=n-1;i++){
		c[i][1] = a[i][1];
		c[i][2] = a[i][2];
		c[i][3] = a[i][3];
		c[i][4] = a[i][4];
	}

	printf("\n\n");

	for(o=0;o<=33;o++){
		
		r=(double)o;
		
		for(i=1;i<=n-1;i++){
		a[i][1] = c[i][1];
		a[i][2] = c[i][2];
		a[i][3] = c[i][3];
 		a[i][4] = c[i][4];
		}

	a[1][4] = a[1][4]-r;
	a[2][4] = a[2][4]-r;
	a[3][4] = a[3][4]-3*r;

	for(i=1;i<=n-1;i++){

		if(a[i][i]=0){
		max=a[i+1][i];
		maxline=i+1;
			for(l=i+2;l<=n;l++){
				if(abs(a[l][i])>max){
				max=abs(a[l][i]);
				maxline=l;
				}
			}

			for(k=i;k<=n;k++){
				swap(&a[i][k],&a[maxline][k]);
			}
		}

		for(j=i+1;j<=n;j++){
			t=a[j][i]/a[i][i];

			for(k=i;k<=n+1;k++){
				a[j][k]=a[j][k] - t*a[i][k];
			}
		}
	}


	for(i=1;i<=n-1;i++){
		x[i]=0;
	}

	for(i=n-1;i>0;i--){
		x[i]=a[i][n];
		for(j=i+1;j<=n-1;j++){
			x[i]=x[i]-a[i][j]*x[j];
		}
		x[i]=x[i]/a[i][i];
	}

	y=fmod(x[1],1);
	z=fmod(x[2],1);
	w=fmod(x[3],1);

}

	if(y==0){
		if(z==0){
			if(w==0){
				if(x[1]>=0){
					if(x[2]>=0){
						if(x[3]>=0){

							printf("x = %lf\n",r);
							printf("y = %lf\n",x[1]);
							printf("z = %lf\n",x[2]);
						printf("w = %lf\n",x[3]);
							printf("\n");
						}
					}
				}
			}
		}
	}

	fclose(fp);
	getch();
	return 0;
}


a.csvのファイルは
1 0 -1 5
1 1 1 33
5 7 10 218
になっています


よろしくお願いします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ガウスの消去法(連立方程式)

#2

投稿記事 by みけCAT » 10年前

・49行目に全角スペースがあります。
・26行目のfscanfで%lfが5個書かれているのに、後ろにデータを格納するポインタが4個しか渡されていません。
・58行目のif文内で0を代入しており、条件が常に偽になっています。
・26行目のfscanfの書式文字列内に無駄なコンマが有り、入力ファイルの形式に合っていません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: ガウスの消去法(連立方程式)

#3

投稿記事 by box » 10年前

n]o さんが書きました: x + y + z + w = 33
x + y - w = 5
3x+5y+7z+10w = 218
そもそも、手計算で解けますか?
未知数が4個、方程式が3個。
解けないような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

n]o

Re: ガウスの消去法(連立方程式)

#4

投稿記事 by n]o » 10年前

みけCATさん、boxさん
返信ありがとうございます

みけCATさんからご指摘していただいた箇所は修正しました

boxさん
x,y,z,wの変数には整数という条件があるので、今回はxをプログラム上で変数oとおいて、oを変化させて他の未知数を解いています


実行結果は
1.000000,1.000000,1.000000,33.000000
1.000000,0.000000,-1.000000,5.000000
5.000000,7.000000,10.000000,218.000000



になりました


閉鎖

“C言語何でも質問掲示板” へ戻る