鱼C论坛

 找回密码
 立即注册
查看: 2046|回复: 3

c语言实现高斯消元debug

[复制链接]
发表于 2020-12-31 11:43:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬,我i写的高斯消元求方程组的程序计算三阶方阵时就没有算不对,计算二阶时能得出正确结果,请问除了什么问题?谢谢大家!
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#pragma warning(disable:4996)

void swap(double **row,double *b,int r,int t)//将矩阵A和向量b的第r行和第t行交换
{   double *m,n;
        m=row[r];row[r]=row[t];row[t]=m;
        n=b[r];b[r]=b[t];b[t]=n;
        return;
}

void gauss(double **row,int n,double *b)//高斯消元
{   int i,j,flag,k;
        for(j=0;j<n;j++)
        {   flag=0;
                for(i=j;i<n;i++)
                {   if(row[i][j]>0) flag=1;
                        if(flag==1&&row[j][j]==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
                        if(flag==1&&row[i][j]!=0&&i!=j)
                        {   for(k=j+1;k<n;k++)//消去i,j元素
                                {   row[i][k]=row[i][k]-row[i][j]/row[j][j]*row[j][k];
                                        b[i]=b[i]-row[i][j]/row[j][j]*b[j];
                                }
                                row[i][j]=0;
                        }
                }
        }
}

int main()
{   double **row,*b,*x;
        int i,j,n;
        printf("请输入矩阵阶数:");
        scanf("%d",&n);
        row=(double**)malloc(sizeof(double*)*n);
        for(i=0;i<n;i++)
                row[i]=(double*)malloc(sizeof(double)*n);
        b=(double*)malloc(sizeof(double)*n);
        x=(double*)malloc(sizeof(double)*n);
        printf("请输入矩阵A:\n");
        for(i=0;i<n;i++)
                for(j=0;j<n;j++)
                        scanf("%lf",&row[i][j]);
        printf("请输入向量b:\n");
        for(i=0;i<n;i++)
                scanf("%lf",&b[i]);
        gauss(row,n,b);
        if(fabs(row[n-1][n-1])<1e-8) printf("No Solution or Infinite solutions!\n");
        else
        {   for(i=n-1;i>=0;i--)
                {   for(j=n-1;j>i;j--)
                                b[i]=b[i]-row[i][j]*x[j];
                        x[i]=b[i]/row[i][i];
                }
                for(i=0;i<n;i++)
                        printf("x%d=%.2lf\n",i+1,x[i]);
        }
        free(b);free(x);
        for(i=n-1;i>=0;i--)
                free(row[i]);
        free(row);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 12:57:34 | 显示全部楼层
给两个例子吧,关于向量的部分  不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-31 15:50:15 | 显示全部楼层
已经解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-31 15:50:44 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#pragma warning(disable:4996)

void swap(double **row,double *b,int r,int t)//将矩阵A和向量b的第r行和第t行交换
{   double *m,n;
        m=row[r];row[r]=row[t];row[t]=m;
        n=b[r];b[r]=b[t];b[t]=n;
        return;
}

void gauss(double **row,int n,double *b)//高斯消元
{   int i,j,flag,k;
        for(j=0;j<n;j++)
        {   flag=0;
                for(i=j;i<n;i++)
                {   if(row[i][j]>0) flag=1;
                        if(flag==1&&row[j][j]==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
                        if(flag==1&&row[i][j]!=0&&i!=j)
                        {   for(k=j+1;k<n;k++)//消去i,j元素
                                    row[i][k]=row[i][k]-row[i][j]/row[j][j]*row[j][k];
                                b[i]=b[i]-row[i][j]/row[j][j]*b[j];
                                row[i][j]=0;
                        }
                }
        }
        return;
}

int main()
{   double **row,*b,*x;
        int i,j,n;
        printf("请输入矩阵阶数:");
        scanf("%d",&n);
        row=(double**)malloc(sizeof(double*)*n);
        for(i=0;i<n;i++)
                row[i]=(double*)malloc(sizeof(double)*n);
        b=(double*)malloc(sizeof(double)*n);
        x=(double*)malloc(sizeof(double)*n);
        printf("请输入矩阵A:\n");
        for(i=0;i<n;i++)
                for(j=0;j<n;j++)
                        scanf("%lf",&row[i][j]);
        printf("请输入向量b:\n");
        for(i=0;i<n;i++)
                scanf("%lf",&b[i]);
        gauss(row,n,b);
        if(fabs(row[n-1][n-1])<1e-8) printf("No Solution or Infinite solutions!\n");
        else
        {   for(i=n-1;i>=0;i--)
                {   for(j=n-1;j>i;j--)
                                b[i]=b[i]-row[i][j]*x[j];
                        x[i]=b[i]/row[i][i];
                }
                for(i=0;i<n;i++)
                        printf("x%d=%.3lf\n",i+1,x[i]);
        }
        free(b);free(x);
        for(i=n-1;i>=0;i--)
                free(row[i]);
        free(row);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表