求非线性方程组的最小二乘解的广义逆法




#include "math.h"#include "stdlib.h"#include "6gmiv.c"int ngin(m,n,eps1,eps2,x,ka,f,s)void (*f)(),(*s)();int m,n,ka;double eps1,eps2,x[];{ int i,j,k,l,kk,jt;double y[10],b[10],alpha,z,h2,y1,y2,y3,y0,h1;double *p,*d,*pp,*dx,*u,*v,*w;p=malloc(m*n*sizeof(double));d=malloc(m*sizeof(double));pp=malloc(n*m*sizeof(double));dx=malloc(n*sizeof(double));u=malloc(m*m*sizeof(double));v=malloc(n*n*sizeof(double));w=malloc(ka*sizeof(double));l=60; alpha=1.0;while (l>0){ (*f)(m,n,x,d);(*s)(m,n,x,p);jt=gmiv(p,m,n,d,dx,pp,eps2,u,v,ka);if (jt<0){ free(p); free(d); free(pp); free(w);free(dx); free(u); free(v); return(jt);}j=0; jt=1; h2=0.0;while (jt==1){ jt=0;if (j<=2) z=alpha+0.01*j;else z=h2;for (i=0; i<=n-1; i++) w[i]=x[i]-z*dx[i];(*f)(m,n,w,d);y1=0.0;for (i=0; i<=m-1; i++) y1=y1+d[i]*d[i];for (i=0; i<=n-1; i++)w[i]=x[i]-(z+0.00001)*dx[i];(*f)(m,n,w,d);y2=0.0;for (i=0; i<=m-1; i++) y2=y2+d[i]*d[i];y0=(y2-y1)/0.00001;if (fabs(y0)>1.0e-10){ h1=y0; h2=z;if (j==0) { y[0]=h1; b[0]=h2;}else{ y[j]=h1; kk=0; k=0;while ((kk==0)&&(k<=j-1)){ y3=h2-b[k];if (fabs(y3)+1.0==1.0) kk=1;else h2=(h1-y[k])/y3;k=k+1;}b[j]=h2;if (kk!=0) b[j]=1.0e+35;h2=0.0;for (k=j-1; k>=0; k--)h2=-y[k]/(b[k+1]+h2);h2=h2+b[0];}j=j+1;if (j<=7) jt=1;else z=h2;}}alpha=z; y1=0.0; y2=0.0;for (i=0; i<=n-1; i++){ dx[i]=-alpha*dx[i];x[i]=x[i]+dx[i];y1=y1+fabs(dx[i]);y2=y2+fabs(x[i]);}if (y1<eps1*y2){ free(p); free(pp); free(d); free(w);free(dx); free(u); free(v); return(1);}l=l-1;}free(p); free(pp); free(d); free(dx);free(u); free(v); free(w); return(0);}

这里面调用的其他函数见另一篇:
求解线性最小二乘问题的奇异值分解及广义逆法的C++实现

一个例子:

#include "stdio.h"#include "7ngin.c"main(){ int m,n,i,ka;double eps1,eps2;void nginf(int,int,double [],double []);void ngins(int,int,double [],double [2][2]);static double x[2]={0.5,-1.0};m=2; n=2; ka=3; eps1=0.000001; eps2=0.000001;i=ngin(m,n,eps1,eps2,x,ka,nginf,ngins);printf("\n");printf("i=%d\n",i);printf("\n");for (i=0; i<=1; i++)printf("x(%d)=%13.7e\n",i,x[i]);printf("\n");}void nginf(m,n,x,d)int m,n;double x[],d[];{ m=m; n=n;d[0]=x[0]*x[0]+10.0*x[0]*x[1]+4.0*x[1]*x[1]+0.7401006;d[1]=x[0]*x[0]-3.0*x[0]*x[1]+2.0*x[1]*x[1]-1.0201228;return;}void ngins(m,n,x,p)int m,n;double x[2],p[2][2];{ m=m; n=n;p[0][0]=2.0*x[0]+10.0*x[1];p[0][1]=10.0*x[0]+8.0*x[1];p[1][0]=2.0*x[0]-3.0*x[1];p[1][1]=-3.0*x[0]+4.0*x[1];return;}

还有一个例子:

#include "stdio.h"#include "7ngin.c"main(){ int m,n,i,ka;double eps1,eps2;void nginf(int,int,double [],double []);void ngins(int,int,double [],double [3][2]);static double x[2]={1.0,-1.0};m=3; n=2; ka=4; eps1=0.000001; eps2=0.000001;i=ngin(m,n,eps1,eps2,x,ka,nginf,ngins);printf("\n");printf("i=%d\n",i);printf("\n");for (i=0; i<=1; i++)printf("x(%d)=%13.7e\n",i,x[i]);printf("\n");}void nginf(m,n,x,d)int m,n;double x[],d[];{ m=m; n=n;d[0]=x[0]*x[0]+7.0*x[0]*x[1]+3.0*x[1]*x[1]+0.5;d[1]=x[0]*x[0]-2.0*x[0]*x[1]+x[1]*x[1]-1.0;d[2]=x[0]+x[1]+1.0;return;}void ngins(m,n,x,p)int m,n;double x[2],p[3][2];{ m=m; n=n;p[0][0]=2.0*x[0]+7.0*x[1];p[0][1]=7.0*x[0]+6.0*x[1];p[1][0]=2.0*x[0]-2.0*x[1];p[1][1]=-2.0*x[0]+2.0*x[1];p[2][0]=1.0;p[2][1]=1.0;return;}

求非线性方程组的最小二乘解的广义逆法C实现相关推荐

  1. 线性方程组AX=b,AX=0以及非线性方程组的最小二乘解(解方程组->优化问题)

    一.非齐次线性方程组AX=b的最小二乘解 超定方程组无解是因为方程组包含了过多的约束条件,无法满足所有的约束条件,在这种情况下,方程组的某些方程必然是矛盾的,也就是说,他们描述的条件是不兼容的,无法同 ...

  2. 蒙特卡洛法求非线性方程组

    蒙特卡罗法的概念及应用 蒙特卡洛法 (又称统计试验法)是描述装备运用过程中各种随机现象的基本方法,而且它特别适用于一些解析法难以求解甚至不可能求解的问题,因而在装备效能评估中具有重要地位. 用蒙特卡洛 ...

  3. 求解线性最小二乘问题的奇异值分解及广义逆法的C++实现

    求解线性最小二乘问题的广义逆法的C++实现 1,功能 2,方法说明 3,函数语句与形参说明 第一步,求对系数矩阵进行奇异值分解(muav函数) #include "stdlib.h" ...

  4. Matlab 数值计算----二分法求非线性方程组

    bisect.m函数(二分法的实现算法) function[x_star,index,it]=bisect(fun,a,b) %求解非线性计算方程的二分法,其中,fun(x)为需要求根的函数; %a, ...

  5. 牛顿拉夫森法 matlab,【原创】牛顿-拉夫森迭代求非线性方程组

    function [xf,fval,iter]=newtmullt(e,x0,es,maxit,varargin) %     written by tubehu %     www.MATLABsk ...

  6. 二分法求非线性方程组Java_用C#编写二分法解一元非线性方程

    在计算方法里有一种求一元非线性方程的解法,叫做二分法. 简单介绍如下: 函数F(x)在区间[a,b] 上连续,假定在区间内有唯一实根,计为x* 二分法的思想为:首先确定有根区间,将区间二等分,通过判断 ...

  7. matlab求解不等式方程组解集,matlab求不等式方程组的可行解

    求高手用matlab解一个三元的方程组 我算的你这个解都是无穷大.具体过程如下:第一步:建立M文件函数myf.mfunctionf=myf(x)f(1)=600+x(1)*cos(10)+x(2)*s ...

  8. python牛顿法解非线性方程组_科学网—求解多元非线性方程组F(x)=0的Newton-Raphson方法及其MATLAB实现 - 王福昌的博文...

    科学网对公式支持不太好,在博客园有相同博文 牛顿迭代法可以推广到多元非线性方程组 $boldsymbol{F}(boldsymbol{x})=boldsymbol{0}$的情况,称为牛顿-- 拉夫逊方 ...

  9. 快速验证矩阵求MP广义逆及最小范数解或最小二乘解是否正确

    \quad设计了一个测试函数,传入原矩阵AAA和其最大秩分解B,D,A=BDB,D,A=BDB,D,A=BD,列向量bbb.函数依次输出以下内容 1.判断当前给出的最大秩分解是否正确 2.给出AAA的 ...

最新文章

  1. 基于图割优化的多平面重建视觉 SLAM(ISMAR2021)
  2. minor gc和Major GC,Full GC的触发条件
  3. oracle 快速备份表数据
  4. vue开发入门篇(二)-axios POST提交数据的三种请求方式写法
  5. AppStreamMgr
  6. python中的魔法属性和方法
  7. 【DP】和谐的奶牛(jzoj 1750)
  8. C语言为四维数组申请动态内存空间的方法(二)
  9. LeetCode(852)——山脉数组的峰顶索引(JavaScript)
  10. Docker、Mesos和Marathon剖析以及入门实战
  11. Vue(三)goods组件开发
  12. 有可直接运营的IPTV/OTT系统ma?
  13. ICMP数据包结构(转)
  14. 装了linux的u盘格式化,u盘格式化容量变小了u盘安装linuxcentos
  15. hexo更换icarus主题和美化
  16. HBuilderX代码提示失效解决方案
  17. PHP 免费获取手机号码归属地
  18. amoled led 排列_为何AMOLED屏幕不用RGB排列?
  19. android sensor之重力小球
  20. 《管理学》计划、激励、沟通的摘要笔记

热门文章

  1. OGNL中的s:property /标签
  2. 推荐几篇介绍Windows CE 6.0的文章
  3. Ping Tracert result Command explanation
  4. 数据库学习之(6)了解数据库触发器
  5. scala 中List的简单使用
  6. 服务器与本地时间的倒计时
  7. 函数调用的方法一共有 4 种,call,apply,bind
  8. 【树莓派】为树莓派配置或扩展swap分区
  9. Android下的动画
  10. Oracle VM VirtualBox 虚拟机中ubuntu里,鼠标滚轮不能使用