今行っているプログラムなんですが、内容は「連立一次方程式を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 ***
とでます。
よろしくおねがいします。