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: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]