数值作业:顺序消去法解线性方程组之C语言代码

来源:互联网 发布:上海知恩服饰怎么样 编辑:程序博客网 时间:2024/06/10 10:20

实际上后面的Guass列主选主元,全选主元,都是由顺序高斯消元法稍加改动变化而来的,但是顺序消元会出现一个问题,如果我们要保留的那个元的系数很小,那么在消元过程中,势必会用很大的数字乘以次方程后再加到别的方程上消去别的方程中的改元,这样就会造成其他元的系数超大,而且计算过程容易累积误差。为了避免此,就提出了列主元高斯消元法,即在每次选择保留的元时,选择那个元所对应的系数较大的所对应的方程,然后基于次方程来对其他方程消元,这样这个元所对应最大的系数不就是这元所对应的列中最大的系数,因而取名为列主元高斯消元法。
1,Guass列选主元消去法(题目就用实验上的,如果结果与列选主元相同则表面代码正确)

|2.5 2.3 -5.1| | x1 | |3.7|
|5.3 9.6 1.5 | | x2 | = |3.8|
|8.1 1.7 -4.3| | x3 | |5.5|
有了前面的基础,这个可以依葫芦画瓢了,一步一步解决就OK了:
1.输入方程组的维数n,矩阵A,右端项b,控制精度这里我们定义了一个宏常量eps(1e-6,代表10的负6次方)...talk is cheap,let’s show my code. 下面上自己的代码:

/*************************************************************************    > File Name: sequence.c    > Author:chendiyang    > School:WUST_CST_1501班    > Myblog:www.chendsir.com    > Mail:1441353519@qq.com     > Created Time: 2017年04月19日 星期三 19时09分31秒 ************************************************************************/#include <stdio.h>#include <math.h>#define MAX 20   //最大维数 #define eps 1e-10int main(){    int n;    int i,j,k;    int mi;    double mx,tmp,sum;    static double a[MAX][MAX],b[MAX],x[MAX];    printf("\n 输入方程组的维数:");//输入AX=b的维数    scanf("%d",&n);    if(n>MAX)    {        printf("输入的维数过大!");        return 1;     }      if(n<=0)     {        printf("输入的维数过小!");        return 1;     }     //输入矩阵的值     printf("\n请输入A矩阵的值:");      for(i=0;i<n;i++)       for(j=0;j<n;j++)          scanf("%lf",&a[i][j]);           //输入b矩阵       printf("\n请输入B矩阵的值:");            for(i=0;i<n;i++)      scanf("%lf",&b[i]);      //Guass消元         for(k=0;k<(n-1);k++)       {           for(i=(k+1);i<n;i++)           {              if(fabs(a[k][k])<eps)  //与我们定义的精度进行比较            {                 printf("\n主元素过小..\n");                 return 1;               }              tmp=a[i][k]/a[k][k];              for(j=(k+1);j<(n);j++)              {a[i][j]-=tmp*a[k][j];}//不同的是这里没有进行与列的交换,就造成了保留            b[i]-=tmp*b[k];     //系数比较小,从而造成误差大,列选主元解决了这个问题            a[i][k]=0;           }       }        x[n-1]=b[n-1]/a[n-1][n-1];       //回代        for(i=(n-2);i>=0;i--)            //解方程     {           x[i]=b[i];         for(j=(i+1);j<n;j++)           {             x[i]-=a[i][j]*x[j];//这些都和Guass列选主元消去法都一样         }           x[i]/=a[i][i];       }                    //输出运行结果           printf("solution is :\n");          for(i=0;i<n;i++)          printf("%lf\n",x[i]);          return 0;    }

   运算结果如图:
   这里写图片描述 
   可以看到图中运行的guass.c源文件(./guass代表运行这个程序,这是Linux上的gcc编译和运行命令),同时又运行了sequence.c源文件(./sequence代表运行这个程序)两个结果都是相同的,这表明,列选主元和顺序消去法的结果是一模一样,看了顺序消去法对于本题目并没有产生很大的误差..

1 0
原创粉丝点击