c语言实现高斯消元debug
各位大佬,我i写的高斯消元求方程组的程序计算三阶方阵时就没有算不对,计算二阶时能得出正确结果,请问除了什么问题?谢谢大家!代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#pragma warning(disable:4996)
void swap(double **row,double *b,int r,int t)//将矩阵A和向量b的第r行和第t行交换
{ double *m,n;
m=row;row=row;row=m;
n=b;b=b;b=n;
return;
}
void gauss(double **row,int n,double *b)//高斯消元
{ int i,j,flag,k;
for(j=0;j<n;j++)
{ flag=0;
for(i=j;i<n;i++)
{ if(row>0) flag=1;
if(flag==1&&row==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
if(flag==1&&row!=0&&i!=j)
{ for(k=j+1;k<n;k++)//消去i,j元素
{ row=row-row/row*row;
b=b-row/row*b;
}
row=0;
}
}
}
}
int main()
{ double **row,*b,*x;
int i,j,n;
printf("请输入矩阵阶数:");
scanf("%d",&n);
row=(double**)malloc(sizeof(double*)*n);
for(i=0;i<n;i++)
row=(double*)malloc(sizeof(double)*n);
b=(double*)malloc(sizeof(double)*n);
x=(double*)malloc(sizeof(double)*n);
printf("请输入矩阵A:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%lf",&row);
printf("请输入向量b:\n");
for(i=0;i<n;i++)
scanf("%lf",&b);
gauss(row,n,b);
if(fabs(row)<1e-8) printf("No Solution or Infinite solutions!\n");
else
{ for(i=n-1;i>=0;i--)
{ for(j=n-1;j>i;j--)
b=b-row*x;
x=b/row;
}
for(i=0;i<n;i++)
printf("x%d=%.2lf\n",i+1,x);
}
free(b);free(x);
for(i=n-1;i>=0;i--)
free(row);
free(row);
return 0;
} 给两个例子吧,关于向量的部分不懂 已经解决了 #include<stdio.h>
#include<stdlib.h>
#include<math.h>
#pragma warning(disable:4996)
void swap(double **row,double *b,int r,int t)//将矩阵A和向量b的第r行和第t行交换
{ double *m,n;
m=row;row=row;row=m;
n=b;b=b;b=n;
return;
}
void gauss(double **row,int n,double *b)//高斯消元
{ int i,j,flag,k;
for(j=0;j<n;j++)
{ flag=0;
for(i=j;i<n;i++)
{ if(row>0) flag=1;
if(flag==1&&row==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
if(flag==1&&row!=0&&i!=j)
{ for(k=j+1;k<n;k++)//消去i,j元素
row=row-row/row*row;
b=b-row/row*b;
row=0;
}
}
}
return;
}
int main()
{ double **row,*b,*x;
int i,j,n;
printf("请输入矩阵阶数:");
scanf("%d",&n);
row=(double**)malloc(sizeof(double*)*n);
for(i=0;i<n;i++)
row=(double*)malloc(sizeof(double)*n);
b=(double*)malloc(sizeof(double)*n);
x=(double*)malloc(sizeof(double)*n);
printf("请输入矩阵A:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%lf",&row);
printf("请输入向量b:\n");
for(i=0;i<n;i++)
scanf("%lf",&b);
gauss(row,n,b);
if(fabs(row)<1e-8) printf("No Solution or Infinite solutions!\n");
else
{ for(i=n-1;i>=0;i--)
{ for(j=n-1;j>i;j--)
b=b-row*x;
x=b/row;
}
for(i=0;i<n;i++)
printf("x%d=%.3lf\n",i+1,x);
}
free(b);free(x);
for(i=n-1;i>=0;i--)
free(row);
free(row);
return 0;
}
页:
[1]