求解方程Ax=b的通用程序

原创 2015年11月20日 16:58:43
在cpp所在的文件夹中创建一个txt文件,并且将条件这个输入:%矩阵行数9%矩阵列数9%矩阵元素31 -13 0 0 0 -10 0 0 0-13 35 -9 0 -11 0 0 0 00 -9 31 -10 0 0 0 0 00 0 -10 79 -30 0 0 0 -90 0 0 -30 57 -7 0 -5 00 0 0 0 -7 47 -30 0 00 0 0 0 0 -30 41 0 00 0 0 0 0 -5 0 0 27 -20 0 0 -9 0 0 0 -2 29 %对应的右侧的元素:-15 27 -23 0 -20 12 -7 7 10 #include#include#include#define R 50#define C 50using namespace std;float Mar[R][C];int InputToTxt(float a,float b);int sort(float a[],int n);void getGauss(float bk[],float num);float jidu(float a);int exchangeMar(int m,int curpos);int chude(int num,int curpos);float sum(float xx[],float yy[],int num);void solve(int curpos);float row,col;int main(void){FILE *stream;char msg[40]; float bb[R];stream=fopen("data.txt","r"); fseek(stream,0,SEEK_SET);fgets(msg,20,stream);printf("%s",msg);float a,b;fscanf(stream,"%f",&a);cout<<a<<endl;fseek(stream,2,1); fgets(msg,20,stream);printf("%s",msg);fscanf(stream,"%f",&b);cout<<b<<endl;row=a;col=b+1;fseek(stream,2,1); fgets(msg,20,stream); printf("%s",msg); for(int i=0;i<a;i++){for(int j=0;j<b;j++){fscanf(stream,"%f",&Mar[i][j]);cout<<Mar[i][j]<<" ";}cout<<endl;}fseek(stream,4,1);fgets(msg,40,stream);printf("%s",msg);for(int k=0;k<a;k++){ fscanf(stream,"%f",&bb[k]); cout<<bb[k]<<" ";};cout<<endl;//得到增广矩阵,并且将增广矩阵放到文件中去for(int ii=0;ii<a;ii++){Mar[ii][int(b)]=bb[ii];}fclose(stream);int curpos1=InputToTxt(a,b+1); //现在我要将里面的值进行交换 int curpos2=exchangeMar(0,curpos1); int curpos4=curpos2; //现在我要用第二行去消去第三行 for(int i5=1;i5<a-1;i5++){ curpos4=chude(i5,curpos4);} //现在要做的是解方程 solve(curpos4); return 0;}//将增广矩阵输入到文件中 int InputToTxt(float a,float b) {FILE *stream=fopen("data.txt","a+");char str[]="%增广矩阵:"; fprintf(stream,"%s",str); fprintf(stream,"\n");int curpos=ftell(stream);for(int i=0;i<a;i++){for(int j=0;j<b;j++){fprintf(stream,"%f",Mar[i][j]);fprintf(stream,"%c"," ");} fprintf(stream,"\n"); }fclose(stream);return curpos; } //从矩阵中获取一列的元素int sort(float a[],int n){float max=a[0];int k=0;for(int i=1;i<n;i++){ if(max<a[i]){max=a[i];k=i;}}//此时返回的是数组对应的元素的下标return k;}//这个函数是得到一个gauss变换的矩阵并且将这个矩阵在写文件上int exchangeMar(int m,int curpos){float G1[50][50];char ch; FILE *stream;stream=fopen("data.txt","r");fseek(stream,curpos,0);cout<<"增广矩阵"<<endl;cout<<"-----------------------------------------------------------"<<endl; for(int i=0;i<row;i++){for(int j=0;j<col;j++){ fscanf(stream,"%f",&G1[i][j]); fscanf(stream,"%c",&ch); cout<<G1[i][j]<<" ";}cout<<endl;}cout<<"-----------------------------------------------------------"<<endl;//我要第一列进行Gauss消去float ga=-G1[1][0]*1.0/G1[0][0]; for(int i1=0;i1<col;i1++){ if(G1[0][i1]!=0){ G1[1][i1]=G1[1][i1]+G1[0][i1]*ga;}}for(int i4=1;i4<row;i4++){if(G1[i4][0]!=0){ga=-G1[i4][0]*1.0/G1[0][0]; for(int j4=0;j4<col;j4++){ G1[i4][j4]=G1[i4][j4]+G1[0][j4]*ga;}}}cout<<"第一次初等行变换之后:"<<endl; cout<<"-------------------------------------------------------------"<<endl; for(int i2=0;i2<row;i2++){for(int j2=0;j2<col;j2++){ if(jidu(G1[i2][j2])<0.0001) { G1[i2][j2]=0; } cout<<G1[i2][j2]<<" ";}cout<<endl;}cout<<"--------------------------------------------------------------"<<endl;fclose(stream);//现在要将这个矩阵写入到文件中 stream=fopen("data.txt","a+");char msg[]="第一次初等行变换之后:";fprintf(stream,"%s",msg);fprintf(stream,"\n");int curpos1=ftell(stream);for(int i3=0;i3<row;i3++){for(int j3=0;j3<col;j3++){fprintf(stream,"%f",G1[i3][j3]);fprintf(stream,"%c"," ");}fprintf(stream,"\n");}fclose(stream);return curpos1;}float jidu(float a){if(a<0)return -a;elsereturn a;}int chude(int num,int curpos){//获取上一次的矩阵 float bk[50][50];char ch;FILE *stream=fopen("data.txt","r");fseek(stream,curpos,0);//获取第一次行变换之后的矩阵for(int i=0;i<row;i++){for(int j=0;j<col;j++){fscanf(stream,"%f",&bk[i][j]);fscanf(stream,"%c",&ch);}}fclose(stream);//用第二行去消去第三行float aa=-bk[num+1][num]*1.0/bk[num][num];for(int i1=0;i1<col;i1++){ if(bk[num][i1]!=0){ bk[num+1][i1]=bk[num+1][i1]+bk[num][i1]*aa;}} for(int i4=num+1;i4<row;i4++){if(bk[i4][num]!=0){aa=-bk[i4][num]*1.0/bk[num][num]; for(int j4=0;j4<col;j4++){ bk[i4][j4]=bk[i4][j4]+bk[num][j4]*aa;}}}cout<<"第"<<num+1<<"初等行变换之后的矩阵:"<<endl;cout<<"-----------------------------------------------"<<endl;for(int i2=0;i2<row;i2++){for(int j2=0;j2<col;j2++){if(jidu(bk[i2][j2])<0.0001){ bk[i2][j2]=0;}cout<<bk[i2][j2]<<" ";}cout<<endl;}cout<<"------------------------------------------------"<<endl;//现在要做的是将这个矩阵写到文件中去 stream=fopen("data.txt","a+"); char msg[]="然后再初等变换之后的矩阵:"; fprintf(stream,"%s",msg); fprintf(stream,"\n"); curpos=ftell(stream); for(int i3=0;i3<row;i3++) { for(int j3=0;j3<col;j3++) { fprintf(stream,"%f",bk[i3][j3]); fprintf(stream,"%c"," "); } fprintf(stream,"\n"); } fclose(stream); return curpos;}void solve(int curpos){//首先是从文件中获取到这个矩阵FILE *stream=fopen("data.txt","r");float xx[50];float bk[50][50];char ch;fseek(stream,curpos,0);for(int i=0;i<row;i++){for(int j=0;j<col;j++){fscanf(stream,"%f",&bk[i][j]);fscanf(stream,"%c",&ch);}}cout<<"方程组Ax=b的解:"<<endl; cout<<"--------------------------------------------"<=0;i1--){ xx[i1]=(bk[i1][9]-sum(xx,bk[i1],i1))/bk[i1][i1];}for(int i2=0;i2<row;i2++){cout<<"X"<<i2+1<<"= "<<xx[i2]<<endl;} }float sum(float xx[],float yy[],int num){float summ=0.0;for(int i=1;i<row-num;i++){summ+=yy[num+i]*xx[num+i];}return summ;}

线性代数导论8——求解Ax=b:可解性和解的结构

本文是Gilbert Strang的线性代数导论课程笔记。课程地址:http://v.163.com/special/opencourse/daishu.html   第八课时:求解Ax=b:可解性...
  • suqier1314520
  • suqier1314520
  • 2013年08月29日 23:16
  • 10033

漫步线性代数九——求Ax=0和Ax=b

前面的文章关注的是方阵的逆矩阵,Ax=bAx=b有一个解的话它就是x=A−1bx=A^{-1}b,它可以通过消元法得到。一个长方形矩阵带来的新的可能性——UU可能没有所有的主元,本文我们就将UU 化为...
  • u010182633
  • u010182633
  • 2016年08月25日 18:33
  • 888

基于C++的n阶线性方程组Ax=b求解

基于C++的n阶线性方程组Ax=b求解: bool CUtil::Solve(double** A, double* b, double* x, int n) { double** M = ...
  • u013354805
  • u013354805
  • 2015年08月13日 14:09
  • 1371

关于使用SVD分解方法求解AX=0方程的一点说明

研究生这么多年,遇到AX=0的求解问题,从来都是使用SVD分解直接取 V矩阵的最后一列作为方程的解,但是始终没有弄明白其中的原理,最近找到几篇文章,讲解了这个问题,感觉一下子清晰了很多。 核心部分:...
  • zhyh1435589631
  • zhyh1435589631
  • 2017年03月15日 11:54
  • 1139

同余方程 ax≡1(mod b) & POJ 1061 青蛙的约会

同余方程 ax≡1(mod b)的两种解法。 POJ 1061 青蛙的约会
  • Kanosword
  • Kanosword
  • 2016年09月13日 14:26
  • 1023

线性代数导论7——求解Ax=0:主变量、特解

本文是Gilbert Strang的线性代数导论课程笔记。课程地址:http://v.163.com/special/opencourse/daishu.html   第七课时:求解Ax=0:主变量、...
  • suqier1314520
  • suqier1314520
  • 2013年08月25日 16:49
  • 8060

AX=B型方程思考

AX=B型方程思考@(线性代数)关于这种右边不是一个向量型的问题,解法是一样的,本质是,如果A可逆,那么X=BA−1X = BA^{-1}这里的X不是Ax=bAx = b中的小号x,X或者x是与B或者...
  • u011240016
  • u011240016
  • 2016年11月30日 19:26
  • 352

算法训练 一元三次方程求解 蓝桥杯

问题描述   有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间)...
  • sinat_35637319
  • sinat_35637319
  • 2017年02月25日 13:04
  • 643

求解Ax=b:可解性和解的结构

对于Ax=b,我们都已经知道如何用消元法去求它的解,假设现有系数矩阵A和常量项b,则方程求解过程为 前面我们已经讨论过b需要满足什么样的条件才能使方程有解?即当b属于A的列空间C(A)时方程是可...
  • xdfyoga1
  • xdfyoga1
  • 2014年07月02日 20:01
  • 2679

求解线性方程组(SVD,QR,Gauss,LU)

曲线拟合过程中,需要求解线性方程组,下面谈谈线性方程组的求解方法: 1)svd求解 对于齐次线性方程 A*X =0; 当A的行数大于列数时,就需要求解最小二乘解,在||X||=1的约束下,其最小二乘解...
  • ningyaliuhebei
  • ningyaliuhebei
  • 2015年04月15日 13:56
  • 3453
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求解方程Ax=b的通用程序
举报原因:
原因补充:

(最多只允许输入30个字)