数值分析-顺序高斯消去法C语言代码

Gauss消去法

高斯消去法:高斯消去法由消元和回代两个过程组成,前者是对增广矩阵进行初等行变换(交换两行位置;用一个数乘某一行加到另一行上面),使其系数矩阵变为上三角矩阵。可以分为顺序高斯消去法和列主元素高斯消去法。

顺序高斯消去法

在高斯消去法的消元过程中只对方程的增广矩阵做“用一个数乘某一行加到令一行上面”的初等行变换。

定理:顺序高斯消去法前n-1个主元素均不为0的充要条件是系数矩阵的前n-1个顺序主子式均不为0。

  1. 只有当系数矩阵不为奇异矩阵且前n-1个顺序主子式不为0时才可以使用高斯顺序消去法。
  2. 即使第k个主元素不为0,但要是比较小会使m较大,造成舍入误差累积增大,因此高斯消去法没有稳定性保证。
#include <stdio.h>
#include <stdlib.h>
#define MAX 10 //最大为10阶方程组

double A[MAX][MAX];
double b[MAX];
double X[MAX];
int NUM;

void Input_Matrix()//输入矩阵
{
    int i,j;
    printf("系数矩阵A的阶数:\n");
    scanf("%d",&NUM);
    for(i=1; i<=NUM; i++)
    {
        printf("系数矩阵A的第%d行元素:\n",i);
        for(j=1; j<=NUM; j++)
            scanf("%lf",&A[i-1][j-1]);
    }
    printf("右端项b:\n");
    for(i=1; i<=NUM; i++)
    {
        scanf("%lf",&b[i-1]);
    }
    printf("输入的系数矩阵A:\n");
    for(i=0; i<NUM; i++)
    {
        for(j=0; j<NUM; j++)
            printf("%.4lf\t",A[i][j]);//\t表示加上之前的内容总共空8个字符
        printf("\n");
    }
    printf("输入的右端项b:\n");
    for(i=0; i<NUM; i++)
        printf("%.4lf\n",b[i]);
}


int main()
{
    int i,j,k;
    float mik;//消元过程所用变量
    float S;//回代过程所用变量
    Input_Matrix();
    //消元
    for(k=0; k<NUM-1; k++)
    {
        if(!A[k][k]) //A[k][k]=0时算法失效
            return -1;
        for(i=k+1; i<NUM; i++)
        {
            mik=A[i][k]/A[k][k];
            for(j=k; j<NUM; j++)
            {
                A[i][j]=A[i][j]-mik*A[k][j];
            }
            b[i]=b[i]-mik*b[k];
        }
    }
    printf("消元后的矩阵A:\n\n");
    for(i=0; i<NUM; i++)
    {
        for(j=0; j<NUM; j++)
            printf("%.4lf\t",A[i][j]);
        printf("\n");
    }
    printf("消元后的右端项b:\n\n");
    for(i=0; i<NUM; i++)
        printf("%.4lf\n",b[i]);
    //回代
    X[NUM-1]=b[NUM-1]/A[NUM-1][NUM-1];
    for(k=NUM-2; k>=0; k--)
    {
        S=b[k];
        for(j=k+1; j<NM; j++)
        {
            S=S-A[k][j]*X[j];
        }
        X[k]=S/A[k][k];
    }
    printf("结果X=\n\n");
    for(i=0;i<NUM;i++)
        printf("%.4lf\n",X[i]);
    return 0;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值