西京学院数学软件实验任务书
课程名称
数学软件实验
班级
***
学号
***
姓名
***
实验课题
线性方程组高斯消去法,高斯列主元消去法,高斯全主元消去法
实验目的
熟悉线性代数方程组高斯消去法,高斯列主元消去法,高斯全主元消去法
实验要求
运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成
实验内容
线性方程组高斯消去法
线性方程组高斯列主元消去法
线性方程组高斯全主元消去法
成绩
教师
1.  实验目的
掌握高斯消去的基本思路和迭代步骤;
熟悉线性代数方程组高斯消去法,高斯列主元消去法,高斯   
全主元消去法;
    培养编程与上机调试能力。
2. 算法描述 注:本实验以3行4列的增广矩阵为例
  1. 高斯消去法基本思路
    设有方程组A*x=b,设是可逆矩阵。高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增广矩阵,将其中的A变换成一个上三角矩阵,然后求解这个三角形方程组。
2. 高斯顺序消去计算步骤
    将方程组用增广矩阵B={A:b}表示。
1. 消元过程
(1) a[0][0]!=0.
(2)如果a[0][0]=0,则矩阵奇异,程序结束。
(3)消元 每一行都先与第一行消元 通式为:
a[i][j]=a[i][j]+a[k][j]*-a[i][k]/a[k][k]
2. 回代过程
    (1) a[k][k]=0,则矩阵奇异,方程组解不唯一,程序结束;
(2) 从下往上一步步回代 通式为:
a[i][3]=a[i][3]-a[i][j]*x[j]
x[i]=a[i][3]/a[i][i]
3.高斯列主元消去法计算步骤
将方程组用增广矩阵B={A:b}表示
1.i次选出i列中最大的行 与第i行交换 循环同时进行顺序消元过程
2.回代过程与顺序法相同
4.高斯全主元消去法计算步骤
将方程组用增广矩阵B={A:b}表示
printf输出格式matlab
1.出所有未知量系数的最大元素 记下最大元素所在的行与列
2.将最大元素所在的行换到第i
3.将最大元素所在的列换到第i
4.记下列的变换
5.回代过程与顺序法相同
6.将列变换交换回来
7.输出结果
3  实验内容
解方程组
x1+x2+x3=6
x2-x3=5
2x1-2x2+x3
4  实验步骤
  C语言代码
1.高斯顺序消元法:
#include"stdio.h"
void main()
{
    int i,j,k,s,x[3],a[3][4];
//input matrix
    printf("请注意输入的增广矩阵A34\n");
    for(i=0;i<3;i++)
    {
       
        printf("%d\n",i+1);
        for(j=0;j<4;j++)
        {
        //    printf("%d :",j+1);
            scanf("%d",&a[i][j]);
        }
    //    printf("\n");
    }
//output
printf("\n线性方程组的增广矩阵A为:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
            printf("%-5d",a[i][j]);
        printf("\n");
    }
// gs
    for(k=0;k<2;k++)
    {
        for(i=k+1;i<3;i++)
        {   
            s=-a[i][k]/a[k][k];
            for(j=k;j<4;j++)
            {
                a[i][j]=a[i][j]+a[k][j]*s;
               
            }
        }
    }
    printf("\n");
   
//out
    printf("\n线性方程组的增广矩阵经过高斯消元得到的矩阵为:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
            printf("%-5d",a[i][j]);
        printf("\n");
    }
    //solution
        printf("\n线性方程组的解为:\n");
    x[2]=a[2][3]/a[2][2];
    for(i=3-2;i>=0;i--)
    {
        if(a[i][i]!=0)
        {for(j=i+1;j<3;j++)
            {
                a[i][3]=a[i][3]-a[i][j]*x[j];
            }
        x[i]=a[i][3]/a[i][i];
        }
        else printf("\n方程组解不唯一");
    }
    for(i=1;i<=3;i++)
    {
        printf("x%d=%-5d",i,x[i-1]);
    }
    printf("\n");
}
  2.高斯列主元消去法:
#include"stdio.h"
void main()
{
    int i,j,k,s,p,l,m,x[3],a[3][4];
//input matrix
    printf("请注意输入的增广矩阵A34\n");
    for(i=0;i<3;i++)
    {
       
        printf("%d\n",i+1);
        for(j=0;j<4;j++)
        {
        //    printf("%d :",j+1);
            scanf("%d",&a[i][j]);
        }
    //    printf("\n");
    }
//output
printf("\n线性方程组的增广矩阵A为:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
            printf("%-5d",a[i][j]);
        printf("\n");
    }
// gs
    for(k=0;k<2;k++)
    {
        for(l=k+1;l<3;l++)
        if(a[k][k]<a[l][k])
        for(m=k;m<4;m++)
        {
            p=a[k][m];a[k][m]=a[l][m];a[l][m]=a[k][m];
        }
       
       
        for(i=k+1;i<3;i++)
        {   
            s=-a[i][k]/a[k][k];
            for(j=k;j<4;j++)
            {
                a[i][j]=a[i][j]+a[k][j]*s;
               
            }
        }
    }
    printf("\n");
   
//out
    printf("\n线性方程组的增广矩阵经过高斯消元得到的矩阵为:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
            printf("%-5d",a[i][j]);
        printf("\n");
    }
    //solution
        printf("\n线性方程组的解为:\n");
    x[2]=a[2][3]/a[2][2];
    for(i=3-2;i>=0;i--)
    {
        if(a[i][i]!=0)
        {for(j=i+1;j<3;j++)
            {
                a[i][3]=a[i][3]-a[i][j]*x[j];
            }
        x[i]=a[i][3]/a[i][i];
        }
        else printf("\n方程组解不唯一");
    }
    for(i=1;i<=3;i++)
    {
        printf("x%d=%-5d",i,x[i-1]);
    }
    printf("\n");
}
3.高斯全主元消去法:
#include"stdio.h"
#include"math.h"
void main()
{
    int i,j,i1,j1,k,q,l,m,p[3]={0,1,2};
    float s,x[3],a[3][4],max;
    printf("请注意输入的增广矩阵A34\n");
    for(i=0;i<3;i++)
    {
       
        printf("%d\n",i+1);
        for(j=0;j<4;j++)
        {
            scanf("%f",&a[i][j]);
        }
    }
    printf("\n");
    for(k=0;k<2;k++)
    {
        max=abs(a[k][k]);
        for(i=k;i<3;i++)
        {
            for(j=k;j<3;j++)
            {
                if(abs(a[i][j])>max)
                {
                    max=a[i][j];
                    i1=i;
                    j1=j;
                }
            }
        }
        for(m=k;m<4;m++)
        {
            q=a[k][m];
            a[k][m]=a[i1][m];
            a[i1][m]=q;
        }
        for(l=k;l<3;l++)
        {
            q=a[l][k];
            a[l][k]=a[l][j1];
            a[l][j1]=q;
        }
        printf("\n");
        q=p[k];
        p[k]=p[j1];
        p[j1]=q;
        for(i=k+1;i<3;i++)
        {   
            s=-a[i][k]/a[k][k];
            for(j=k;j<4;j++)
            {
                a[i][j]=a[i][j]+a[k][j]*s;
               
            }
        }
    }
    printf("\n");
    printf("\n线性方程组的增广矩阵经过高斯全主元消元得到的矩阵为:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
            printf("%-10f",a[i][j]);
        printf("\n");
    }
        printf("\n线性方程组的解为:\n");
    x[2]=a[2][3]/a[2][2];
    for(i=3-2;i>=0;i--)
    {
        if(a[i][i]!=0)
        {for(j=i+1;j<3;j++)
            {
                a[i][3]=a[i][3]-a[i][j]*x[j];
            }
        x[i]=a[i][3]/a[i][i];
        }
        else printf("\n方程组解不唯一");
    }
   
    for(i=0;i<3;i++)
    {
        printf("x%d=%-10f",p[i]+1,x[i]);
    }
    printf("\n");
}
2.实验结果:
1.高斯顺序消元法:
2.高斯列主元消去法:
3.高斯全主元消去法:
5.实验总结:
通过本次实验再次熟悉了高斯主元消元法的思想,加深了对C语言的理解,简洁明了,学会
C语言编写的函数通用实用。