子程序lmder1(fcn、m、n、x、fvec、fjac、ldfjac,tol,info,ipvt,wa,*lwa)整数m,n,ldfjac,info,lwa整数ipvt(n)双精度tol双精度x(n),fvec(m),fjac(ldfjac,n),wa(lwa)外部fcnc**********c(c)c子程序lmder1c(c)c lmder1的目的是最小化n元cm-非线性函数的修正c levenberg-marquardt算法。这是通过使用更多c通用最小二乘解算器lmder。用户必须提供计算函数和雅可比函数的c子程序。c(c)c子程序语句是c(c)c子程序lmder1(fcn、m、n、x、fvec、fjac、ldfjac,tol,info,c ipvt、wa、lwa)c(c)c其中c(c)c fcn是用户提供的子例程的名称c计算函数和雅可比矩阵。fcn必须c在用户的外部语句中声明c调用程序,并应编写如下。c(c)c子程序fcn(m、n、x、fvec、fjac、ldfjac和iflag)c整数m,n,ldfjac,iflagc双精度x(n),fvec(m),fjac(ldfjac,n)c(c)----------c如果iflag=1,计算x处的函数c在fvec中返回这个向量。不要改变fjac。c如果iflag=2,计算x处的雅可比数c在fjac中返回此矩阵。不要改变fvec。c(c)----------c返回c端c(c)cfn不应更改iflag的值,除非c用户想要终止lmder1的执行。在本例中,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)cfjac是一个m乘n数组的输出。上n乘n子矩阵fjac的c包含上三角矩阵rc非增量对角元素,以便c(c)c吨t吨c p*(jac*jac)*p=r*r,c(c)c,其中p是置换矩阵,jac是最终矩阵c计算了jacobian。p的j列是ipvt(j)列单位矩阵的c(见下文)。下梯形fjac的c部分包含在c计算r。c(c)c ldfjac是一个不小于m的正整数输入变量c,它指定数组fjac的前导维数。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的次数,iflag=1c达到100*(n+1)。c(c)c info=6 tol太小。不再减少c平方和是可能的。c(c)c info=7 tol太小。没有进一步改进c近似解x是可能的。c(c)c ipvt是长度为n的整数输出数组。ipvtc定义了置换矩阵p,使得jac*p=q*r,c其中jac是最终计算的jacobian,q是c正交(未存储),r为上三角c的对角线元素的大小不增加。p的c列j是单位矩阵的列ipvt(j)。c(c)cwa是长度lwa的工作数组。c(c)clwa是一个不小于5*n+m的正整数输入变量。c(c)c子程序调用c(c)c用户提供。。。。。。燃料电池网络c(c)c minpack提供。。。不羁c(c)c阿贡国家实验室。minpack项目。1980年3月。c伯顿·s·加博、肯尼思·希尔斯特罗姆、乔治·j·摩尔c(c)c(c)**********整数maxfev,mode,nfev,njev,nprint双精度因子,ftol,gtol,xtol,zero数据因子,零/1.0d2,0.0d0/信息=0c(c)c检查输入参数是否有错误。c(c)如果(n.le.0或.m lt.n或.ldfjac.lt.m或.tol.lt.zero*.或。lwa.lt.5*n+m)转到10c(c)c致电lmder。c(c)最大发热量=100*(n+1)ftol=醇xtol=醇gtol=零模式=1nprint=0调用lmder(fcn、m、n、x、fvec、fjac、ldfjac,ftol、xtol、gtol、maxfev,*wa(1),模式,因子,nprint,info,nfev,njev,ipvt,wa(n+1),*wa(2*n+1),wa(3*n+1如果(info.eq.8)info=410继续返回c(c)c子程序lmder1的最后一张卡。c(c)结束