VC最小二乘法求解方程数多于未知变量的线性方程组.doc_第1页
VC最小二乘法求解方程数多于未知变量的线性方程组.doc_第2页
VC最小二乘法求解方程数多于未知变量的线性方程组.doc_第3页
VC最小二乘法求解方程数多于未知变量的线性方程组.doc_第4页
VC最小二乘法求解方程数多于未知变量的线性方程组.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

c语言实现,用最小二乘法求解方程数多于未知变量的线性方程组的最适解(即矛盾方程组) 收藏 一、代码:/* * ArgMin.h * Author * Fri Aug 5 17:18:47 2005 * Copyright 2005 * Email */#include stdio.h#include math.h/* Interface */solve the linear equations using argmin methodint ArgMin(double *inMtrx,int COLUMN,int rowNum,int colNum,double *solution);/Solve a series of linear equationsint SolveLinearEqts(double *inMtrx,int COLUMN,int rowNum,int colNum,double *solution);/Elimination of unknownsint ReduceUnknowns(double *mtrx_tmp,int COLUMN,int rowNo,int colNo,int rowNum,int colNum);/* Begin Coding */ArgMin using solvelineareqts. int ArgMin(double *mtrx_tmp,int COLUMN,int rowNum,int colNum,double *solution) int k,l,j; double *eqt; int *q; q=&colNum; eqt=(double *)malloc(colNum*colNum*sizeof(double); /printf(%d,*q); for(k=0;k*q-1;k+) for(l=0;l*q-1;l+) eqtk*COLUMN+l=0; for(j=0;jrowNum;j+) eqtk*COLUMN+l+=*(mtrx_tmp+COLUMN*j+k)*(*(mtrx_tmp+COLUMN*j+l); for(k=0;k*q-1;k+) eqtk*COLUMN+*q-1=0; for(j=0;jrowNum;j+) eqtk*COLUMN+*q-1+=*(mtrx_tmp+COLUMN*j+*q-1)*(*(mtrx_tmp+COLUMN*j+k); /* show the contents of eqts */ /*int m,n; printf(eqt:n); for(m=0;m*q-1;m+) for(n=0;n*q;n+) printf(%.2lft,eqtm*COLUMN+n); printf(n); */ if(!SolveLinearEqts(eqt,COLUMN,(*q-1),*q,solution) return 0; return 1;/Solve the solution of a series of linear equationsint SolveLinearEqts(double *inMtrx,int COLUMN,int rowNum,int colNum,double *solution) int i,j; double tmpSum; if(rowNum!=(colNum-1) printf(Cant solve the equations because equation number ); printf(is not the same as unknow parameters!n); return 0; /reduce unknown parameters for(i=0;i=0;i-) tmpSum=0; for(j=i+1;jrowNum;j+) tmpSum+=*(solution+j)*(*(inMtrx+i*COLUMN+j); if(fabs(inMtrxi*COLUMN+i)0.000001) printf(nNeed more Equations to solve elements in matrix An); printf(Tip: You can try setting a different theta value, n or ); printf(checking the data introduced to functionCalculateCoeff!)n); return 0; *(solution+i)=(*(inMtrx+i*COLUMN+colNum-1)-tmpSum)/(*(inMtrx+i*COLUMN+i); return 1;/*Column number of Array is COLUMN_A, but actually the number of figures in each row is colNum! */int ReduceUnknowns(double *mtrx_tmp,int COLUMN,int rowNo,int colNo,int rowNum,int colNum) int i,j,tmpInt; double tmpDbl1,tmpDbl2; double rowMax,colMax; double *p,*mp; /*Adjust the rowNo whose value is zero in matrix_tmprowNocolNo down to a suitable site*/ p=mtrx_tmp+rowNo*COLUMN+colNo; mp=mtrx_tmp+rowNo*COLUMN+colNo; /select main variable: /*rowMax=fabs(*p); for(j=colNo+1;jcolNum;j+) p+; if(rowMaxfabs(*p) rowMax=fabs(*p); if(rowMax=0) return 0; p+=COLUMN-(colNum-colNo-1); colMax=fabs(*(mtrx_tmp+rowNo*COLUMN+colNo)/rowMax; tmpInt=rowNo; for(i=rowNo+1;irowNum;i+) rowMax=fabs(*p); for(j=colNo+1;jcolNum;j+) p+; if(rowMaxfabs(*p) rowMax=fabs(*p); p+=COLUMN-(colNum-colNo-1); if(rowMax=0) return 0; tmpDbl1=fabs(*(mtrx_tmp+i*COLUMN+colNo)/rowMax; if(colMaxtmpDbl1) colMax=tmpDbl1; tmpInt=i; /change the whole row of tmpInt to rowNo for(j=colNo;jcolNum;j+) tmpDbl1=*(mtrx_tmp+rowNo*COLUMN+j); *(mtrx_tmp+rowNo*COLUMN+j)=*(mtrx_tmp+tmpInt*COLUMN+j); *(mtrx_tmp+tmpInt*COLUMN+j)=tmpDbl1; */ /*Transform the matrix_tmp using linear calculation methods*/ tmpDbl1=*p; p+=COLUMN; for(i=rowNo+1;irowNum;i+) if(fabs(*p)0.000001) continue; tmpDbl2=*p; for(j=colNo;jcolNum;j+) *p=*p-*mp*tmpDbl2/tmpDbl1; p+; mp+; p+=COLUMN-(colNum-colNo); mp-=colNum-colNo; return 1;二、测试/*/ (1)int ArgMin(double *inMtrx,int COLUMN,int rowNum,int colNum,double *solution); 函数功能:用最小二乘法求解方程数多于未知变量的线性方程组的最适解。 测试代码: #define Q 5 #define ROWNUM 6 int main() double solutionQ-1,eqtQQ=0; double aROWNUMQ=3,-2,4,6,-11,4,3,2,9,-2,2,6,8,3,4,2,4,5,3,3, 0,0,8,6,-20,3,4,5,6,0; ArgMin(&a00,Q,ROWNUM,Q,&solution0); for(i=0;iQ-1;i+) printf(%.14lfn,solutioni); return 0; 测试结果: eqts: 42.000000000 38.000000000 61.000000000 84.000000000 -27.000000000 38.000000000 81.000000000 86.000000000 69.000000000 52.000000000 61.000000000 86.000000000 198.000000000 159.000000000 -161.000000000 84.000000000 69.000000000 159.000000000 207.000000000 -183.000000000 3.00000000000000 2.00000000000000 -1.00000000000000 -2.00000000000000 说明:a, 待求解的方程组数据: 3,-2,4,6,-11, 4,3,2,9,-2, 2,6,8,3,4, 2,4,5,3,3, 0,0,8,6,-20, 3,4,5,6,0 以上数据中共有四个变量,六个方程; b, 测试显示的数据中,“eqts”为通过最小二乘法得出的待求解的线性方程组增广矩阵;下面四行为计算求得的解,与实际完全符合。 (2)int SolveLinearEqts(double *inMtrx,int COLUMN,int rowNum,int colNum,double *solution); 函数功能:用消元法解NN的线性方程组(即未知数和方程数相同的方程组)。 测试代码: double b45=3,-2,4,6,-11,4,3,2,9,-2,2,6,8,3,4,2,4,5,3,3; double c5; SolveLinearEqts(&b00,5,4,5,&c0); for(i=0;i4;i+) printf(%.14lfn,ci); 测试结果: 3.00000000000000 2.00000000000000 -1.00000000000000 -2.00000000000000 说明:求得的解与实际完全符合。/*/ (c)int ArgMin(double *inMtrx,int COLUMN,int rowNum,int colNum,double *solution); 功能说明:用最小二乘法求解方程数多于未知变量的线性方程组的最适解。 参数说明: (1)inMtrx: 线性方程组以增广矩阵的形式用此数组传入方程; (2)COLUMN: 数组inMtrx的列数为COLUMN; (3)rowNum: 数组inMtrx中数据的行数; (4)colNum: 数组inMtrx中数据的列数; (5)solution: 求得方程的解从此参数传出; (6)返回值:0,表示方程组无唯一解;1,表示函数正常结束。 (d)int SolveLinearEqts(double *inMtrx,int COLUMN,int rowNum,int colNum,double *solution); 功能说明:解NN的线性方程组(即未知数和方程数相同的方程组)。 参数说明: (1)inMtrx: 线性方程组以增广矩阵的形式用此数组传入方程; (2)COLUMN: 数组inMtrx的列数为COLUMN; (3)rowNum: 数组inMtrx中数据的行数; (4)colNum: 数组inMtrx中数据的列数; (5)solution: 求得方程的解从此参数传出; (6)返回值:0,表示方程组无唯一解;1,表示函数正常结束。 (e)int ReduceUnknowns(double *mtrx_tmp,int COLUMN,int rowNo,int colNo,int rowNum,int colNum); 功能说明:将储存在mtrx_tmp中、表示待求解线性方程组的增广矩阵变换成阶梯形矩阵。每调用函数一次,通过变换矩阵会将其中元素(rowNo,colNo)对应的那一列第rowNo行以下(不包括第rowNo行)的元素全变为0。 参数说明: (1)mt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论