数值分析实验报告--列主元高斯消去

2、用列主元高斯消去法解线性方程组.

=

=

分别输出,解向量,(1)中A的条件数。分析比较(1)(2)的计算结果。

程序1(列主元高斯消去解线性方程组):

#include<stdio.h>

#include<math.h>

#define n 3

void LZYGSXQ(double a[n][n],double b[n]){

       double x[3],L,max,det=1;

       int r,t,i,j,k;

       for(k=0;k<n-1;k++)        //选组员

       {

              {

                     max=fabs(a[k][k]);

                     r=k;

              }

              for(i=k+1;i<n;i++)

              {

                     if(fabs(a[i][k])>max)

                            r=i;

                     for(t=k;t<n;t++)

                     {

                            L=a[k][t];

                            a[k][t]=a[r][t];

                            a[r][t]=L;

                     }

                     L=b[k];

                     b[k]=b[r];

                     b[r]=L;

                     det=-det;

              }

              for(i=k+1;i<n;i++)      //高斯消去

              {

                     L=a[i][k]/a[k][k];

                     for(j=k;j<n;j++){

                            a[i][j]=a[i][j]-L*a[k][j];

                     }

                     b[i]=b[i]-L*b[k];   

              }

              det=a[k][k]*det;

       }

       det=a[k][k]*det;

       printf("高斯消去后的方程系数\n");     //输出高斯消去后的系数矩阵

       for(i=0;i<n;i++)

       {

              for(j=0;j<n;j++)

              {

                     printf("%f  ",a[i][j]);  

              }

              printf("%f  ",b[i]);

              printf("\n");

       }

       printf("\n");

       printf("行列式的值det=%f\n",det);

       x[n-1]=b[n-1]/a[n-1][n-1];

       for(i=n-2;i>=0;i--){        //回代求解x

                     for(j=i+1;j<n;j++)

                            b[i]=b[i]-a[i][j]*x[j];

                     x[i]=b[i]/a[i][i];

       }

       printf("方程的解向量=(");

       for(i=0;i<=n-1;i++)

              printf("%f  ",x[i]);

       printf(")\n");

}

void main(){

       double a1[3][3]={{3.01,6.03,1.99},{1.27,4.16,-1.23},{0.987,-4.81,9.34}},b1[3]={1,1,1};

       double a2[3][3]={{3.00,6.03,1.99},{1.27,4.16,-1.23},{0.987,-4.81,9.34}},b2[3]={1,1,1};

       LZYGSXQ(a1,b1);

       printf("\n\n\n");

       LZYGSXQ(a2,b2);

}

计算结果:方程组(1)的解向量为,方程组(2)的解向量为

观察两方程组的系数矩阵可知:方程组(2)是由方程组(1)的系数矩阵发生微小变化得到。但此微小变化却引发线性方程组的解的巨大变化,所以方程组(1)为“病态”方程组,对应的系数矩阵为“病态”矩阵。

程序2(求矩阵的条件数):

#include "stdio.h"

#include "math.h"

#define n 3

#define m 6

void main()

{

       double a[n][m]={{3.01,6.03,1.99,1,0,0},{1.27,4.16,-1.23,0,1,0},{0.987,-4.81,9.34,0,0,1}},L,t=0,b,limfanshu1,limfanshu2,tiaojianshu;

       int i,j,k;

       for(i=0;i<n;i++){             //求系数矩阵的无穷范数

              b=0.0;

              for(j=0;j<n;j++)

                     b=b+fabs(a[i][j]);

              if(b>t)

                     t=b;

       }

       limfanshu1=t;

       for(k=0;k<n-1;k++)        //初等行变换求系数矩阵的逆矩阵

       {

              for(i=k+1;i<n;i++)

              {

                     L=a[i][k]/a[k][k];

                     for(j=k;j<m;j++)

                            a[i][j]=a[i][j]-L*a[k][j];

              }

       }

       for(i=0;i<n;i++)

       {

              L=a[i][i];

              for(j=i;j<m;j++)

                     a[i][j]=a[i][j]/L;

       }

       for(k=n-1;k>0;k--)

       {

      

              for(i=0;i<k;i++)

              {

                     L=a[i][k];

                     for(j=k;j<m;j++){

                            a[i][j]=a[i][j]-L*a[k][j];

                     }

              }

       }

       printf("方程系数矩阵的逆矩阵为\n\n");

       for(i=0;i<n;i++)

       {

              for(j=3;j<m;j++)

              {

                     printf("%f  ",a[i][j]);

              }

              printf("\n");

       }

       printf("\n\n");

       t=0;               //求逆矩阵的无穷范数

       for(i=0;i<n;i++){

              b=0.0;

              for(j=3;j<m;j++)

                     b=b+fabs(a[i][j]);

              if(b>t)

                     t=b;

       }

       limfanshu2=t;

       tiaojianshu=limfanshu1*limfanshu2;

       printf("条件数=%f\n",tiaojianshu);

}

由计算所得的系数矩阵的无穷条件数。所以方程组(1)为“病态”方程组,对应的系数矩阵为“病态”矩阵。与计算方程的解时得到的结论相同。

 

第二篇:数值分析试验高斯列主元素消去法

数值分析实验报告

实验1  高斯列主元素消去法

1.1  实验目的

    掌握高斯消去法的基本思路和迭代步骤;

    培养编程与上机调试能力。

1.2  算法描述

1.2.1  高斯消去法基本思路

    设有方程组,设是可逆矩阵。高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增广矩阵,将其中的变换成一个上三角矩阵,然后求解这个三角形方程组。

1.2.2  列主元高斯消去法计算步骤

    将方程组用增广矩阵表示。

1. 消元过程

    对

    (1) 选主元,找使得

    (2) 如果,则矩阵奇异,程序结束;否则执行(3)。

    (3) 如果,则交换第行与第行对应元素位置,

    (4) 消元,对,计算,计算

2. 回代过程

    (1) 若则矩阵奇异,程序结束;否则执行(2)。

    (2)

    对,计算

1.3  实验内容

    解方程组

1.4  实验步骤

1:在Mathematica中,编写消元所需的代码

2:在Mathematica中,编写回代所需代码

3:利用Mathematica 进行运算         

1.4.1  代码

A={{0.101,2.304,3.555,1.183},{-1.347,3.712,4.623,2.137},{-2.835,1.072,5.643,3.035}};

n=Length[A[[All,1]]];

eps=10^(-5);

ext=0;

For[k=1,k<n,k++,i0=k;

  For[i=k+1,i£n,i++,If[Abs[A[[i,k]]]>Abs[A[[i0,k]]],i0=i]];

  If[Abs[A[[i0,k]]]<eps,ext=1;Break];

  If[i0¹k,For[j=k,j£n+1,j++,t=A[[k,j]];

      A[[k,j]]=A[[i0,j]];

      A[[i0,j]]=t]];

  For[i=k+1,i£n,i++,A[[i,k]]=A[[i,k]]/A[[k,k]];

    For[j=k+1,j£n+1,j++,A[[i,j]]=A[[i,j]]-A[[i,k]]*A[[k,j]]]];

  Print[MatrixForm[A]];]

If[Abs[A[[n,n]]]£eps,ext=1,A[[n,n+1]]=A[[n,n+1]]/A[[n,n]];

  For[k=n-1,k³1,k--,w=0;

    For[j=k+1,j£n,j++,w=w+A[[k,j]]*A[[j,n+1]]];

    A[[k,n+1]]=A[[k,n+1]]-w;

    A[[k,n+1]]=A[[k,n+1]]/A[[k,k]]]]

If[ext?1,Print["无解"],MatrixForm[A[[All,n+1]]]]

1.4.2  实验结果

          

1.5  实验体会

   对这次实验的体会:把自己编写的代码输入到Mathematica中,得到运行解出了方程组的解,让我加深了对高斯列主元素消去法的认识与了解,学到了更多的知识。   

相关推荐