ガウスの消去法のプログラミングがわかりません
Posted: 2011年6月19日(日) 15:23
プログラミング初心者です。
数値計算法(c++)のガウスの消去法のプログラミングで行き詰ってしまいました
分かるかたお教えください お願いします。
#include <stdio.h>
#include <math.h>
#define N 14 //未知数の数
/*計算結果を表示する際に、三角行列になったか
確認したいときは1を、解のみ表示した場合は0にしておく*/
#define CHECK 1
void gauss(double a[N][N+1])
{
int i,j,k,l,pivot;
double x[N];
double p,q,m,b[1][N+1];
for(i=0;i<N;i++) {
m=0;
pivot=i;
for(l=i;l<N;l++) {
/*i列の中で一番値が大きい行を選ぶ*/
if(fabs(a[l])>m) {
m=fabs(a[l]);
pivot=l;
}
}
/*pivotがiと違えば、行の入れ替え*/
if(pivot!=i) {
for(j=0;j<N+1;j++) {
b[0][j]=a[j];
a[j]=a[pivot][j];
a[pivot][j]=b[0][j];
}
}
}
for(k=0;k<N;k++) {
p=a[k][k]; //対角要素を保存
/*対角要素は1になることがわかっているので直接代入*/
a[k][k]=1;
for(j=k+1;j<N+1;j++) {
a[k][j]/=p;
}
for(i=k+1;i<N;i++) {
q=a[k];
for(j=k+1;j<N+1;j++) {
a[j]-=q*a[k][j];
}
/*0となることがわかっているので直接代入*/
a[k]=0;
}
}
/*解の計算*/
for(i=N-1;i>=0;i--) {
x=a[N];
for(j=N-1;j>i;j--) {
x-=a[i][j]*x[j];
}
}
/*行列が最後どうなったか見たいときに実行*/
#if CHECK==1
for(i=0;i<N;i++) {
for(j=0;j<N+1;j++) {
printf("%10.3f",a[i][j]);
}
printf("\n");
}
#endif
printf("解は\n");
for(i=0;i<N;i++) {
printf("%f\n",x[i]);
}
}
int main(void)
{
double t1,t2,t3,t4,y1,y2,y3,y4,a10,a11,a12,a13,a14,a20,a21,a22,a23,a30,a31,a32,a33,a34;
printf("t1 = ");
scanf("%d",&t1);
printf("t2 = ");
scanf("%d",&t2);
printf("t3 = ");
scanf("%d",&t3);
printf("t4 = ");
scanf("%d",&t4);
printf("y1 = ");
scanf("%d",&y1);
printf("y2 = ");
scanf("%d",&y2);
printf("y3 = ");
scanf("%d",&y3);
printf("y4 = ");
scanf("%d",&y4);
double a[N][N+1]={{1,t1,t1*t1,t1*t1*t1,t1*t1*t1*t1,0,0,0,0,0,0,0,0,0,y1},
{0,1,2*t1,3*t1*t1,4*t1*t1*t1,0,0,0,0,0,0,0,0,0,0},
{0,0,2,6*t1,12*t1*t1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,t2,t2*t2,t2*t2*t2,0,0,0,0,0,y2},
{1,t2,t2*t2,t2*t2*t2,t2*t2*t2*t2,-1,-t2,-t2*t2,-t2*t2*t2,0,0,0,0,0,0},
{0,1,2*t2,3*t2*t2,4*t2*t2*t2,0,-1,-2*t2,-3*t2*t2,0,0,0,0,0,0},
{0,0,2,6*t2,12*t2*t2,0,0,-2,-6*t2,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,t3,t3*t3,t3*t3*t3,t3*t3*t3*t3,y3},
{0,0,0,0,0,1,t3,t3*t3,t3*t3*t3,-1,-t3,-t3*t3,-t3*t3*t3,-t3*t3*t3*t3,0},
{0,0,0,0,0,0,1,2*t3,3*t3*t3,0,-1,-2*t3,-3*t3*t3,-4*t3*t3*t3,0},
{0,0,0,0,0,0,0,2,6*t3,0,0,-2,-6*t3-12*t3*t3*t3,0},
{0,0,0,0,0,0,0,0,0,1,t4,t4*t4,t4*t4*t4,t4*t4*t4*t4,y4},
{0,0,0,0,0,0,0,0,0,0,1,2*t4,3*t4*t4,4*t4*t4*t4,0},
{0,0,0,0,0,0,0,0,0,0,0,2,6*t4,12*t4*t4,0}};
/*解きたい連立方程式から行列をつくり配列a[N][N+1]に入れ、
関数gaussに渡す*/
gauss(a);
return 0;
}
コンパイル結果
c(103) error c2143:構文エラー;' ;'が'型'の前にありません。
c(121) error c2065:'a':定義されていない識別子です。
c(121) warning c4047:'関数':間接参照のレベルが'double(*)[15]'と'int'で異なっています。
c(121):warning c4024:'gauss'の型が1の仮引数および実数と異なります。
数値計算法(c++)のガウスの消去法のプログラミングで行き詰ってしまいました
分かるかたお教えください お願いします。
#include <stdio.h>
#include <math.h>
#define N 14 //未知数の数
/*計算結果を表示する際に、三角行列になったか
確認したいときは1を、解のみ表示した場合は0にしておく*/
#define CHECK 1
void gauss(double a[N][N+1])
{
int i,j,k,l,pivot;
double x[N];
double p,q,m,b[1][N+1];
for(i=0;i<N;i++) {
m=0;
pivot=i;
for(l=i;l<N;l++) {
/*i列の中で一番値が大きい行を選ぶ*/
if(fabs(a[l])>m) {
m=fabs(a[l]);
pivot=l;
}
}
/*pivotがiと違えば、行の入れ替え*/
if(pivot!=i) {
for(j=0;j<N+1;j++) {
b[0][j]=a[j];
a[j]=a[pivot][j];
a[pivot][j]=b[0][j];
}
}
}
for(k=0;k<N;k++) {
p=a[k][k]; //対角要素を保存
/*対角要素は1になることがわかっているので直接代入*/
a[k][k]=1;
for(j=k+1;j<N+1;j++) {
a[k][j]/=p;
}
for(i=k+1;i<N;i++) {
q=a[k];
for(j=k+1;j<N+1;j++) {
a[j]-=q*a[k][j];
}
/*0となることがわかっているので直接代入*/
a[k]=0;
}
}
/*解の計算*/
for(i=N-1;i>=0;i--) {
x=a[N];
for(j=N-1;j>i;j--) {
x-=a[i][j]*x[j];
}
}
/*行列が最後どうなったか見たいときに実行*/
#if CHECK==1
for(i=0;i<N;i++) {
for(j=0;j<N+1;j++) {
printf("%10.3f",a[i][j]);
}
printf("\n");
}
#endif
printf("解は\n");
for(i=0;i<N;i++) {
printf("%f\n",x[i]);
}
}
int main(void)
{
double t1,t2,t3,t4,y1,y2,y3,y4,a10,a11,a12,a13,a14,a20,a21,a22,a23,a30,a31,a32,a33,a34;
printf("t1 = ");
scanf("%d",&t1);
printf("t2 = ");
scanf("%d",&t2);
printf("t3 = ");
scanf("%d",&t3);
printf("t4 = ");
scanf("%d",&t4);
printf("y1 = ");
scanf("%d",&y1);
printf("y2 = ");
scanf("%d",&y2);
printf("y3 = ");
scanf("%d",&y3);
printf("y4 = ");
scanf("%d",&y4);
double a[N][N+1]={{1,t1,t1*t1,t1*t1*t1,t1*t1*t1*t1,0,0,0,0,0,0,0,0,0,y1},
{0,1,2*t1,3*t1*t1,4*t1*t1*t1,0,0,0,0,0,0,0,0,0,0},
{0,0,2,6*t1,12*t1*t1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,t2,t2*t2,t2*t2*t2,0,0,0,0,0,y2},
{1,t2,t2*t2,t2*t2*t2,t2*t2*t2*t2,-1,-t2,-t2*t2,-t2*t2*t2,0,0,0,0,0,0},
{0,1,2*t2,3*t2*t2,4*t2*t2*t2,0,-1,-2*t2,-3*t2*t2,0,0,0,0,0,0},
{0,0,2,6*t2,12*t2*t2,0,0,-2,-6*t2,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,t3,t3*t3,t3*t3*t3,t3*t3*t3*t3,y3},
{0,0,0,0,0,1,t3,t3*t3,t3*t3*t3,-1,-t3,-t3*t3,-t3*t3*t3,-t3*t3*t3*t3,0},
{0,0,0,0,0,0,1,2*t3,3*t3*t3,0,-1,-2*t3,-3*t3*t3,-4*t3*t3*t3,0},
{0,0,0,0,0,0,0,2,6*t3,0,0,-2,-6*t3-12*t3*t3*t3,0},
{0,0,0,0,0,0,0,0,0,1,t4,t4*t4,t4*t4*t4,t4*t4*t4*t4,y4},
{0,0,0,0,0,0,0,0,0,0,1,2*t4,3*t4*t4,4*t4*t4*t4,0},
{0,0,0,0,0,0,0,0,0,0,0,2,6*t4,12*t4*t4,0}};
/*解きたい連立方程式から行列をつくり配列a[N][N+1]に入れ、
関数gaussに渡す*/
gauss(a);
return 0;
}
コンパイル結果
c(103) error c2143:構文エラー;' ;'が'型'の前にありません。
c(121) error c2065:'a':定義されていない識別子です。
c(121) warning c4047:'関数':間接参照のレベルが'double(*)[15]'と'int'で異なっています。
c(121):warning c4024:'gauss'の型が1の仮引数および実数と異なります。