子程序lmdif1(fcn,m,n,x,fvec,tol,info,iwa,wa,lwa)整数m,n,info,lwa整数iwa(n)双精度tol双精度x(n),fvec(m),wa(lwa)外部fcnc(c)**********c(c)c子程序lmdif1c(c)c lmdif1的目的是最小化n元cm-非线性函数的修正c levenberg-marquardt算法。这是通过使用更多c通用最小二乘解算器lmdif。用户必须提供计算函数的c子程序。雅各布斯是然后通过前向差分近似计算c。c(c)c子程序语句是c(c)c子程序lmdif1(fcn,m,n,x,fvec,tol,info,iwa,wa,lwa)c(c)c其中c(c)c fcn是用户提供的子例程的名称c计算函数。必须声明fcnc在用户调用的外部语句中c程序,并应编写如下。c(c)c子程序fcn(m,n,x,fvec,iflag)c整数m,n,iflagc双精度x(n),fvec(m)c(c)----------c计算x处的函数c在fvec中返回这个向量。c(c)----------c返回c端c(c)cfn不应更改iflag的值,除非c用户想要终止lmdif1的执行。在本例中,c将iflag设置为负整数。c(c)c m是一个正整数输入变量,设置为数字函数的c。c(c)c n是设置为数字的正整数输入变量变量的c。n不得超过m。c(c)c x是长度为n的数组。输入x必须包含c解向量的初始估计。输出x上c包含解向量的最终估计。c(c)cfvec是长度为m的输出数组,其中包含c在输出x处计算的函数。c(c)c tol是一个非负输入变量。终止发生c当算法估计平方和的误差最多为tol或c x和解之间的相对误差为c最多tol。c(c)c info是一个整数输出变量。如果用户有c终止执行,信息设置为(负数)iflag的c值。参见fcn的说明。否则,c信息设置如下。c(c)c info=0输入参数不正确。c(c)c info=1算法估计相对误差平方和中的c最多为tol。c(c)c info=2算法估计相对误差x和溶液之间的c最多为tol。c(c)对于info=1和info=2,c info=3条件都成立。c(c)c info=4 fvec与c雅克比对机器精度的要求。c(c)c info=5个呼叫fcn的次数已达到或c超过200*(n+1)。c(c)c info=6 tol太小。不再减少c平方和是可能的。c(c)c info=7 tol太小。没有进一步改进c近似解x是可能的。c(c)ciwa是长度为n的整数工作数组。c(c)cwa是长度lwa的工作数组。c(c)c lwa是一个不小于的正整数输入变量c m*n+5*n+m。c(c)c子程序调用c(c)c用户提供。。。。。。燃料电池网络c(c)c minpack提供。。。lmdif公司c(c)c阿贡国家实验室。minpack项目。1980年3月。c伯顿·s·加博、肯尼思·希尔斯特罗姆、乔治·j·摩尔c(c)c(c)**********整数maxfev,模式,mp5n,nfev,nprint双精度epsfcn,factor,ftol,gtol,xtol,zero数据因子,零/1.0d2,0.0d0/信息=0c(c)c检查输入参数是否有错误。c(c)如果(n.le.0.或.m.lt.n.或.tol.lt.零*.或。lwa.lt.m*n+5*n+m)转到10c(c)c调用lmdif。c(c)最大fev=200*(n+1)ftol=醇xtol=醇gtol=零epsfcn=零模式=1nprint=0mp5n=米+5*n调用lmdif(fcn,m,n,x,fvec,ftol,xtol,gtol,maxfev,epsfcn,wa(1),*模式、因子、nprint、info、nfev、wa(mp5n+1)、m、iwa、,*wa(n+1),wa(2*n+1)如果(info.eq.8)info=410继续返回c(c)c子程序lmdif1的最后一张卡。c(c)结束