C语言 数值模拟 LU分解法,求答疑

我用这一段C语言代码做LU分解法,请问当x2为什么等于一个这么小的数,而不是直接为0。有什么办法解决么?

//作品:多元一次方程组的计算
//作者:与你看日出
//日期:2009年4月25日 星期六
//说明:输出值只能是小数(最多六位),如x=1.876546
//Han: 初始设的最多未知数的个数,运行程序后只能比它的个数小
//hang:计算中途中自己改变的未知数的个数
//JUZHEN:初始的示例矩阵
#include <stdio.h>
#include <math.h>
#define Han 200//(可自设)多元一次方程组有n行n+1列(多的一列是等号右边的值),给出行数就能确定矩阵,
#define JUZHEN {1,1,1,1,5},{1,2,-1,4,-2},{2,-3,-1,-5,-2},{3,1,2,11,0}//示例一个
main(){
    int i,j,k,m,n,t,cf,hang=4;
    float temp;
    float AA[Han][Han+1]={JUZHEN};//定义所要计算的数组
    do  {//判断是否重试

        for(i=0;i<hang;i++)//输出所定义的数组
        {
            printf("\n");
            for(j=0;j<hang+1;j++)
            {
                printf("%g\t",AA[i][j]);
            }
        }
        printf("\n");

        printf("是否自己输入?是:1;否:0\n");
        scanf("%d",&t);
        if(t==1)//判断是否自己输入数组
        {
            printf("输入未知数(行数,其中列数=行数+1)的个数");
            scanf("%d",&hang);
            for(i=0;i<hang;i++)//输入所定义的数组
            {
                for(j=0;j<hang+1;j++)
                {
                    printf("第%d行第%d列的数为:",i+1,j+1);
                    scanf("%f",&AA[i][j]);
                }
            }
        }
        for(k=0;k<hang;k++)//这个大循环将数组的左下角转化为0
        {
            while(AA[k][k]==0)//如果第K行K列的那个数为0,则加和重组一行。
            {
                for(m=k+1;m<hang;m++)
                for(n=k;n<hang+1;n++)
                {
                    AA[k][n]+=AA[m][n];
                }
            }
            for(i=k;i<hang;i++)//将第K列下面变为1
            {
                temp=AA[i][k];
                for(j=k;j<hang+1;j++)//将每列变为1
                {
                    AA[i][j]/=temp;
                }
            }
            for(i=k+1;i<hang;i++)//将下面的数列与上面的数列相减使其下面为0
            {
                for(j=0;j<hang+1;j++)
                {
                    AA[i][j]-=AA[k][j];
                }
            }
        }
        for(k=hang-2;k>=0;k--)//这个大循环将数组的右上角转化为0
        {
            for(i=k+1;i<hang+1-1;i++)//将第i列上面变为0
            {
                AA[k][hang+1-1]-=AA[k][i]*AA[i][hang+1-1];
                AA[k][i]=0;
            }
        }
        for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
        {
            printf("\n");
            for(j=0;j<hang+1;j++)
            {
                printf("%g\t",AA[i][j]);![图片说明](https://img-ask.csdn.net/upload/202003/29/1585452095_251252.jpg)

            }
        }
        printf("\n未知数的值为:\n");
        for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
        {
            printf("x(%d)=\t%g\n",i+1,AA[i][hang+1-1]);
        }
        printf("\n");
        printf("是否再试一次?是:1;否:0\n");
        scanf("%d",&cf);
    }
    while(cf==1);//判断是否重试
}

图片说明这是运行结果

图片说明这是手算精确解

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐