Gauss- Jordan

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

Gauss- Jordan

#1

投稿記事 by 黄色い猫 » 14年前

C言語初心者のものです。
今行っているプログラムなんですが、内容は「連立一次方程式をGauss-Jordan法で解く」というものです。
作ってみたのですが、最後にエラーがでて何度やってもコンパイルできません。
よろしければアドバイスおねがいします。

コード:


/*---------------------------------------------------------------
 *Gauss-Jordan法で、行列・ベクトルで与えられた連立一次方程式を解く。
 *部分選択を使用して、ピボットを選択するが、選択できなかった場合に
 *は、ERROR(-1)を、正常時終了の場合には、NORMAL(0)を返す。
 */
/******************************宣言部分******************************/
#include<stdio.h>
#include<stdlib.h>

#define N		 4 								 //連立方程式の変数の数//
#define ERROR	-1								//エラーリターン値//
#define NORMAL	 0								//ノーマルリターン値//
#define mabs(x)	(((x) > 0 ) ? (x) : -(x) ) 		//絶対値を返すマクロ//
#define DBL_EPSILON 0.0000000001

int Gauss_J(int, double*, double*);				//Gauss Jordan法の関数//
int partial(int, int, double*, double*);		//二変数の値を交換する関数//
void mswap(double*, double*);

/******************************main関数******************************/
int main(void)
{
	int i;
	int k;

	double a [N][N];					//一次連立方程式の変数における係数//
	double b [N];						//一次連立方程式の定数//

	printf("連立一次方程式をGauss_Jordan法を用いて解く !\n");

	for( i=0; i<N; i++)
	{
		printf("\n%d行目の方程式の", i+1);
		for( k=0; k<N; k++)
		{
			printf("\nX%dの係数=", k+1);
			scanf("%lf",&a[i][k]);
		}
		printf("\n右辺の定数=");
		scanf("%lf", &b[i]);
	}

	printf("計算する連立一次方程式=\n");
	for( i=0; i<N; i++)
	{
		for( k=0; k<N; k++)
		{
			printf("%f X%d", a[i][k], k);
			if(k<N-1)
			{
			printf("+");
			}
		}
		printf("=%f\n\n", b[i]);
	}

	Gauss_J(N, (double *)a, (double *)b );			//Guass Jordan法で解く//
	printf("であり,その解は, \n");
	for( i=0; i<N; i++)
	{
		printf("X%d = %f \n", i+1, b[i]);
	}

	return 0;
}
/******************************GAUSS_J 関数******************************/
/* GJ法 : Gauss_J */
int Gauss_J(int n, double *a, double *b)
{
	int p, i, j, l;//カウンタ//
	double pivot, c ; //ピボット値//

	for ( p = 0; p < n; p++ )	//1行目からn行目まで繰り返す//
	{
		if((partial(n, p,(double *)a, (double *)b))==ERROR)
		{	//部分選択の結果エラーならERROR(-1)を返す//
			return( ERROR );
		}
		pivot = a[ p*n + p];		//ピボットを取得する//
		for (i = p ; i < n ; i++)	//p行目のp列目からn列目まで//

	   	{
	   		a[ p*n + i ] /= pivot;	//係数行列のp行をpivotで割る//
	   	}
	   	b[p] /= pivot;				//定数ベクトルのp行をpivotで割る//

	   	for (l = 0 ; l < n ; l++)	//1行目からn行目まで//
	   	{
	   		if(l !=p)				//p行を除いて//
	   		{
	   			c = a[ l*n + p];	//掃き出す//
	   			for( j=p; j<n ; j++)
	   			{
	   				a[ l*n + j] -= c * a[ p * n + j];
	   			}
	   			b[l] -= c * b[p];
	   		}
	   	}
	}
	return( NORMAL );
}
/******************************partial関数******************************/
/*
* 部分選択関数:partial
* 与えられた行列のp行目以降のp列部分選択する。
* 選択された要素がDBL_EPSILONより小さければ、
* ERROR (-1)を、そうでなければNORMAL (0)を返す。
*/
int partial( int n, int p, double *a, double *b)
{
int l, m, max ;					// l: カウンタ, max: 絶対値が最大の係数を持つ行//
			double pivot ;		//ピボット//

			for (l = max = p, pivot = a[ p*n + p] ; l<n ; l++)
			{		//n行目まででp列の絶対値が最大のものを選ぶ//
					if(mabs(pivot) < mabs(a[ l*n + p]))
					{
		max = l;
		pivot = a[ l*n + p];
	}
   if(mabs (pivot) < DBL_EPSILON )  //選ばれたピボットが小ならERROR(-1)を返す//
 {
	return(ERROR);
 }
if( p != max)					  //選ばれた行がp行でなければ、行の交換を行う//

 {
	for (m = 0 ; m < n ; m++)	 //係数行列のpとmaxを交換//
	{
		mswap( &a[ p*n + m], &a[ max*n + m]);
	}
	mswap( &b[ p ], &b[ max ]);	 //定数のp行とmax行を交換//
	}
}
return( NORMAL );
}

/******************************mswap関数******************************/
/*
	doubel型の値を交換する関数:mswap
	与えられた値の入れ替えを行う。
*/
void mswap(double *a, double *b)
{
	double temp;
										//aとbの値を変更する//
	temp = *a;
	*a = *b;
	*b = temp;
}

です。

エラーは、
******************************
エラー E2206 kadai13.c 122: 不正な文字 ' ' (0x8140)(関数 partial )
エラー E2206 kadai13.c 122: 不正な文字 ' ' (0x8140)(関数 partial )
*** 2 errors in Compile ***

とでます。
よろしくおねがいします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: Gauss- Jordan

#2

投稿記事 by h2so5 » 14年前

122行目に全角スペースが入っていますよ

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: Gauss- Jordan

#3

投稿記事 by bitter_fox » 14年前

if(mabs (pivot) < DBL_EPSILON )  //選ばれたピボットが小ならERROR(-1)を返す//

)と//の間に全角スペースが入っています。これがエラーの原因と思われます。
[hr]おっと、h2so5さんとダブってしまった。

黄色い猫

Re: Gauss- Jordan

#4

投稿記事 by 黄色い猫 » 14年前

無事、コンパイルできました。
とても初歩的なミスですね・・・。

h2so5さん、bitter_foxさんあと閲覧してくれた方々助かりました。

ありがとうございました。

閉鎖

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