客天恺_hqkcq 发表于 2019-4-13 16:21:35

C语言解N元方程组

给定n×n的矩阵 A=aij,和n×1的列向量B=bi,求列向量X=xi, 使得AX=B
保证方程有唯一解

输入描述

第一行一个数n,表示方程的个数和未知数的个数。

接下来n行,每行n+1个数(可能为小数)。前n个为x1...xn的参数,最后一个为bi

输出描述(保证有唯一解)

n行,每行一个数,表示xi

样例输入

3
1 2 3 4
1 3 4 5
1 2 4 233

样例输出

-227.000000
-228.000000
229.000000


Croper 发表于 2019-4-13 21:24:22

本帖最后由 Croper 于 2019-4-13 21:32 编辑

线代都忘光了。。{:9_220:}{:9_220:}

先拿初中的解法写一个吧。。一会复习线代去。。。
#include <stdio.h>

#ifndef _out_
#define _out_
#endif

int FormulaSolve(double** M,int N,double* _out_ ret){
        //当方程只有一个未知数,即方程的形式为ax=b时
        //printMatrix(M,N);
       
        if (N==1){
                double* f=M;            
                if (f==0. && f!=0.){            //ax=b的方程,当a==0,b!=0时,方程无解
                        return -1;
                }
               
                ret=0.;                              
                if (f!=0.) ret=f/f;   //ax=b的根为x=b/a;
                return 1;
        }
       
        //当方程的未知数数目大于1时,消元
        //寻找一个未知数的系数不为0的方程,用其他方程减去t倍的第一个方程,以消去其他方程的未知数
       
        //第一步,寻找一个未知数的系数不为0的方程,并把其他方程存入矩阵M2中;
        int i,j;
        double* f=NULL;
        double *M2;//这里大小为N是为了在方程无解时避免跳出溢出错误,方程一定有解时大小可设为N-1
        j=0;
        for (i=0;i<N;++i){
                if (f==NULL && M!=0.){
                        f=M;
                        continue;
                }
                M2=M;
        }
        if (f==NULL) return -1;

        //第二部,消去M2中的方程的未知数
        for (i=0;i<N-1;++i){
                double* fn=M2;
                double t=fn/f;

                for (j=1;j<N+1;++j){
                        fn-=t*f;
                }
                M2++;                      //去除第一个未知数的项
        }

        //第三步:计算M2的结果
        int hr= FormulaSolve(M2,N-1,ret+1);
        if (hr==-1) return -1;
       
        //第四步:通过M2的结果反推出未知数的值
        for (i=1;i<N;++i){
                f-=f*ret;
        };
        ret=f/f;
        return 1;
}


int main(){
        int N;
        scanf("%d",&N);
        double *M;
        int i,j;
        for (i=0;i<N;++i){
                M=(double*)malloc(sizeof(double)*(N+1));
                for (j=0;j<N+1;++j){
                        scanf("%lf",&(M));
                }
        }
       
        double ret;
        int hr=FormulaSolve(M,N,ret);
        if (hr==-1){
                printf("方程无解");
        }
        else{
                for (i=0;i<N;++i){
                        printf("%lf ",ret);
                }
        }       
}
页: [1]
查看完整版本: C语言解N元方程组