1、解方程组的通用VC程序本文中通过,直接解方程和迭代解方程两种方法实现了对方程组的求解,实现了对唯一解合最小二乘解的求法,并通过了实例验证。给出了程序源码。最终实现函数:Void WeiYiJie()/唯一解的实例/方程形式:ax1+bx2+cx3=d, a、b、c、d为向量 int i = 0; double HEADL34= 1.0000000, 3.0000000, 4.0000000, 6.0000000, 2.0000000, 1.0000000, 4.0000000, 3.0000000, 5.0000000, 6.0000000, 2.0000000, 1.0000000; CMa
2、trixMethod sloveR; int m=3,n=3; double a10=0; int nn=0; double e20=0; for(i=0;i10;i+) ai=1; /hhhe SolveResultDieDai(&HEADL00,a,m,n,nn,e); TRACE(Ln); for(i=0;in;i+) TRACE(L%0.8fn,ai); TRACE(Ln);运行结果:直接解:-1.296296300.851851851.18518519迭代解:-1.296296300.851851851.18518519Void WeiYiJie()/超定方程的最小二乘解实例/方程形
3、式:ax1+bx2 =c, a、b、c为向量int i = 0;double HEADL1123= 0.0000000, 0.0000000, 0.0000000, 1.2505800, 62.466469, 49.950000, 2.4917458, 248.97524, 99.920000, 3.7416651, 561.06268, 149.95000, 4.9912442, 997.74971, 199.90000, 6.2235389, 1555.0134, 249.86000, 11.159454, 5016.8443, 449.56000, 12.390666, 6190.376
4、5, 499.60000, 13.622296, 7486.1327, 549.55000, 14.847737, 8901.9607, 599.55000, 16.074345, 10440.126, 649.49000, 17.285916, 12090.807, 699.46000;CMatrixMethod sloveR; m=12,n=2; memset(a,0,sizeof(a); for(i=0;i10;i+) ai=1; /hhhe SolveResultDieDai(&HEADL100,a,m,n,nn,e); TRACE(Ln); for(i=0;in;i+) TRACE(
5、L%0.10fn,ai); TRACE(Ln);直接解:39.95857180810.0007080380迭代解:39.95857180810.0007080380/函数SolveResult:解方程/pRelativeCMatrix:方程系数增广矩阵例如:对于方程组a1*x1+a2*x2+a3*x3 = c 则pRelative=a1,a2,a3,c/pResult:为方程的解,若:pRelative=a1,a2,a3,c 则pResult=x1,x2,x3;/m:为方程个数/n:为未知数个数/返回值:方程组有唯一解1:无穷多解2:方程组无解-1:最小二乘解/int CDataFit:Sol
6、veResult(double *pRelativeCMatrix,double *pResult,int m ,int n) int i=0,j=0,t=0,k=0; int nnNum = m*(n+1); double *ju_zhen1 = new doublennNum;/求解会改变pRelative的值,因此新建一个 memcpy(ju_zhen1,pRelativeCMatrix,sizeof(double)*nnNum); /把矩阵阶梯化 int tt=0; for(int l=0;ln+1;l+) for(int h=tt;htt) double a=0; for(int i
7、=0;in+1;i+) a=-1*ju_zhen1h*(n+1)+i; ju_zhen1h*(n+1)+i=ju_zhen1tt*(n+1)+i; ju_zhen1tt*(n+1)+i=a; for(int i=tt+1;il;t-) ju_zhen1i*(n+1)+t=ju_zhen1i*(n+1)+t-ju_zhen1i*(n+1)+l*ju_zhen1tt*(n+1)+t/ju_zhen1tt*(n+1)+l; ju_zhen1i*(n+1)+l=0; tt=tt+1; /以下是找出系数矩阵与增广矩阵的秩,比较大小判断解的情况 int xishu_zhi=0,zengguang_zhi=
8、0; /求系数矩阵秩 int m1=0; if(mn) m1=n; for(int i=0;im1;i+) for(int j=i;jn+1) m1=n+1; for(int i=0;im1;i+) for(int j=i;jn+1;j+) if(ju_zhen1i*(n+1)+j!=0) zengguang_zhi=zengguang_zhi+1; break; if(xishu_zhizengguang_zhi)/第一种情况无解 if(xishu_zhi=n)/超定方程求唯一最小二乘解 for(i=0;im;i+)/清零,用于存放最小二乘转换后的系数曾广矩阵 for(j=0;jn+1;j+
9、) ju_zhen1i*(n+1)+j=0.0; for(i=0;in;i+)/获得最小二乘的转换矩阵 for(j=0;jn+1;j+) for(k=0;km;k+) ju_zhen1i*(n+1)+j += (pRelativeCMatrixk*(n+1)+j*pRelativeCMatrixk*(n+1)+i); /把矩阵阶梯化 int tt=0; for(int l=0;ln+1;l+) for(int h=tt;htt) double a=0; for(int i=0;in+1;i+) a=-1*ju_zhen1h*(n+1)+i; ju_zhen1h*(n+1)+i=ju_zhen1
10、tt*(n+1)+i; ju_zhen1tt*(n+1)+i=a; for(int i=tt+1;il;t-) ju_zhen1i*(n+1)+t=ju_zhen1i*(n+1)+t-ju_zhen1i*(n+1)+l*ju_zhen1tt*(n+1)+t/ju_zhen1tt*(n+1)+l; ju_zhen1i*(n+1)+l=0; tt=tt+1; /还原回阶梯化后的值,为解最小二乘的转换方程做准备 memcpy(pRelativeCMatrix,ju_zhen1,sizeof(double)*nnNum); for(t=0;tn;t+) /每次都先恢复系数矩阵 memcpy(ju_zhen1,pRelativeCMatrix,sizeof(double)*nnNum); for(k=0;kn;k+) ju_zhen1k*(n+1)+t=pRelativeCMatrixk*(n+1)+n;/再把常数列赋值给某一列 /求行列式的值 int tt=0; for(int l=0;ln+1;l+) for(int h=tt;hm;h+)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1