Tom学编程 发表于 2020-12-31 11:43:35

c语言实现高斯消元debug

各位大佬,我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;row=row;row=m;
        n=b;b=b;b=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>0) flag=1;
                        if(flag==1&&row==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
                        if(flag==1&&row!=0&&i!=j)
                        {   for(k=j+1;k<n;k++)//消去i,j元素
                                {   row=row-row/row*row;
                                        b=b-row/row*b;
                                }
                                row=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=(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);
        printf("请输入向量b:\n");
        for(i=0;i<n;i++)
                scanf("%lf",&b);
        gauss(row,n,b);
        if(fabs(row)<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=b-row*x;
                        x=b/row;
                }
                for(i=0;i<n;i++)
                        printf("x%d=%.2lf\n",i+1,x);
        }
        free(b);free(x);
        for(i=n-1;i>=0;i--)
                free(row);
        free(row);
        return 0;
}

wp231957 发表于 2020-12-31 12:57:34

给两个例子吧,关于向量的部分不懂

Tom学编程 发表于 2020-12-31 15:50:15

已经解决了

Tom学编程 发表于 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;row=row;row=m;
        n=b;b=b;b=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>0) flag=1;
                        if(flag==1&&row==0&&i!=j) swap(row,b,j,i);//如果第j行第j列为0,通过交换使其不为0
                        if(flag==1&&row!=0&&i!=j)
                        {   for(k=j+1;k<n;k++)//消去i,j元素
                                  row=row-row/row*row;
                                b=b-row/row*b;
                                row=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=(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);
        printf("请输入向量b:\n");
        for(i=0;i<n;i++)
                scanf("%lf",&b);
        gauss(row,n,b);
        if(fabs(row)<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=b-row*x;
                        x=b/row;
                }
                for(i=0;i<n;i++)
                        printf("x%d=%.3lf\n",i+1,x);
        }
        free(b);free(x);
        for(i=n-1;i>=0;i--)
                free(row);
        free(row);
        return 0;
}
页: [1]
查看完整版本: c语言实现高斯消元debug