子程序dogleg(n,r,lr,diag,qtb,delta,x,wa1,wa2)整数n,lr双精度三角形双精度r(lr),diag(n),qtb(n)c(c)**********c(c)c子程序狗腿c(c)c给定m乘n矩阵a,n乘n非奇异对角c矩阵d、m向量b和正数deltac问题是确定c gauss-newton和缩放梯度方向最小化c(a*x-b)在最小二乘意义下,受d×x的欧氏范数至多为δ的限制。c(c)c这个子程序完成了问题的解决c如果提供了来自a的cqr因子分解,也就是说,如果a=q*r,其中q具有c正交列,r是上三角矩阵,c则dogleg期望r的完整上三角c(q转置)*b的前n个分量。c(c)c子程序语句是c(c)c子程序dogleg(n,r,lr,diag,qtb,delta,x,wa1,wa2)c(c)c其中c(c)cn是设置为r阶的正整数输入变量。c(c)c r是长度为lr的输入数组,它必须包含上限c按行存储三角形矩阵r。c(c)c lr是一个不小于的正整数输入变量c(n*(n+1))/2。c(c)c diag是长度为n的输入数组,它必须包含c矩阵d的对角元素。c(c)c qtb是长度为n的输入数组,必须包含第一个c n向量元素(q转置)*b。c(c)c delta是一个正输入变量,它指定了一个上限c在d*x的欧氏范数上有界。c(c)cx是长度为n的输出数组,其中包含所需的gauss-newton方向的c凸组合c缩放梯度方向。c(c)cwa1和wa2是长度为n的工作阵列。c(c)c子程序调用c(c)c minpack提供。。。dpmpar,enorm公司c(c)c fortran供应。。。dabs、dmax1、admin1、dsqrtc(c)c阿贡国家实验室。minpack项目。1980年3月。c伯顿·s·加博、肯尼思·希尔斯特罗姆、乔治·j·摩尔c(c)c**********整数i,j,jj,jp1,k,l双精度alpha、bnorm、epsmch、gnorm、one、qnormal、sgnorm、sum,*温度,零双精度dpmpar,enorm数据一,零/1.0d0,0.0d0/c(c)c epsmch是机器精度。c(c)epsmch=dpmpar(1)c(c)c首先,计算gauss-newton方向。c(c)jj=(n*(n+1))/2+1做50 k=1,nj=n-k+1jp1=j+1jj=jj-kl=jj+1总和=零如果(n.lt.jp1)转到20do 10 i=jp1,n总和=总和+r(l)*x(i)l=l+110继续20继续温度=r(jj)如果(温度为零),则转到40l=j做30 i=1,j温度=dmax1(温度,dabs(r(l)))l=l+n-i30继续温度=epsmch*温度如果(温度等于零)温度=epsmch40继续x(j)=(qtb(j)-总和)/温度50继续c(c)c测试gauss-newton方向是否可接受。c(c)做60 j=1,nwa1(j)=零wa2(j)=诊断(j)*x(j)60继续qnorm=enorm(n,wa2)如果(qnorm.le.delta)转到140c(c)c高斯-纽顿方向是不可接受的。接下来,计算缩放的梯度方向。c(c)l=1做80 j=1,n温度=qtb(j)do 70 i=j,nwa1(i)=wa1(i)+r(l)*温度l=l+170继续wa1(j)=wa1(j)/诊断(j)80继续c(c)c计算比例梯度的范数并测试c缩放梯度为零的特殊情况。c(c)gnorm=enorm(n,wa1)sgnorm=零α=δ/q范数如果(gnorm.eq.zero)转到120c(c)c沿缩放梯度计算点c处二次方最小化。c(c)做90 j=1,nwa1(j)=(wa1(j)/gnorm)/diag(j)90继续l=1do 110 j=1,n总和=零do 100 i=j,n总和=总和+r(l)*wa1(i)l=l+1100继续wa2(j)=总和110继续温度=烯醇(n,wa2)sgnorm=(gnorm/temp)/tempc(c)c测试缩放梯度方向是否可接受。c(c)α=零如果(sgnorm.ge.delta)转到120c(c)c比例梯度方向不可接受。c最后,计算狗腿上的点c处二次方最小化。c(c)bnorm=烯醇(n,qtb)温度=(bnorm/gnorm)*(bnormal/qnormal)*(sgnorm/delta)温度=温度-(增量/qnorm)*(sgnorm/delta)**2*+dsqrt((温度-(delta/qnorm))**2*+(1-(增量/qnorm)**2)*(1-(sgnorm/delta)**2α=((δ/qnorm)*(1-(sgnorm/δ)**2))/温度120继续c(c)c形gauss-newton的适当凸组合c方向和缩放梯度方向。c(c)温度=(1-α)*dmin1(sgnorm,δ)do 130 j=1,nx(j)=温度*wa1(j)+α*x(j130继续140继续返回c(c)c子程序狗腿的最后一张卡。c(c)结束