Guass消元法和Guass列主元素消元法解线性方程组

来源:互联网 发布:unity3d ui 高科技 编辑:程序博客网 时间:2024/05/01 16:45
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define N 3
void Guass(double a[][N+1],double x[])
{
 double l[N];
 int i,j,k;
 l[0]=1.0;
 for(i=0;i<N-1;i++)
 {
  if(fabs(a[i][i])<0.000001)
  {
   printf("不能求解!/n");
   return;
  }
  for(j=i+1;j<N;j++)
   l[j]=a[j][i]/a[i][i];
  for(j=i+1;j<N;j++)
    for(k=i+1;k<N+1;k++)
     a[j][k]=a[j][k]-l[j]*a[i][k];
 }
 for(i=N-1;i>=0;i--)
 {
  x[i]=a[i][N];
  for(j=i+1;j<N;j++)x[i]=x[i]-a[i][j]*x[j];
  x[i]=x[i]/a[i][i];
 }
}
void main()
{
int i,j;
double x[N];
double s[N][N+1]={{ 0.101, 2.304, 3.555, 1.183},
                  {-1.347, 3.712, 4.623, 2.137},
                  {-2.835, 1.072, 5.643, 3.035}              
   };
for(i=0;i<N;i++)
 {
 for(j=0;j<=N;j++)printf("%5.3f  ",s[i][j]);
 printf("/n");
 }
Guass(s,x);
for(i=0;i<N;i++)printf("x[%d]=%5.6f/n",i+1,x[i]);
getch();
}
//////////////////////////////////////////////////////////
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define N 3
//Guass列主元素消元法
int Guassl(double **a,double *x,int n)
{
 int i,j,k,numl,*h,t;
    double *l,max;
 l=new double[n];
 h=new int[n];
 for(i=0;i<n;i++) h[i]=i;//行标
 for(i=1;i<n;i++)
 {
  max=fabs(a[h[i-1]][i-1]);
  numl=i-1;
  //列元的最大值
  for(j=i;j<n;j++)
  {
   if(fabs(a[h[j]][i-1])>max)
   {
    numl=h[j];
    max=fabs(a[h[j]][i-1]);
   }
  }
  if(max<0.00000000001) return 0;
  //交换行号
  if(numl>i-1)
  {
   t=h[i];
   h[i]=h[numl];
   h[numl]=t;
  }
  for(j=i;j<n;j++) l[j]=a[h[j]][i-1]/a[h[i-1]][i-1];
  for(j=i;j<n;j++)
            for(k=i;k<n+1;k++) a[h[j]][k]=a[h[j]][k]-l[j]*a[h[i-1]][k];
 }
 for(i=n-1;i>=0;i--)
 {
        x[h[i]]=a[h[i]][n];
        for(j=i+1;j<n;j++) x[h[i]]=x[h[i]]-a[h[i]][j]*x[h[j]];
        x[h[i]]=x[h[i]]/a[h[i]][i];
 }
 //还原x[i]的值
 for(i=0;i<n;i++) l[i]=x[h[i]];
 for(i=0;i<n;i++) x[i]=l[i];
 //删除临时数组变量
 delete []l;
 delete []h;
 return 1;
}
void main()
{
    int i,j;
    double x[N];
    double s[N][N+1]={{2, 8, 2, 14},
                   {1, 6, -1,13},
                   {2, -1, 2, 5}
                  };
 double **u;
 u=new double *[N];
 for(i=0;i<N;i++) u[i]=s[i];
    for(i=0;i<N;i++)
 {
        for(j=0;j<=N;j++)printf("%5.3f  ",s[i][j]);
        printf("/n");
 }
 Guassl(u,x,N);
 for(i=0;i<N;i++) printf("x[%d]=%5.6f/n",i+1,x[i]);
 delete []u;
 getch();
原创粉丝点击