SUBROUTINE mrqmin(x,y,sig,ndata,a,ia,ma,covar,alpha,nca,chisq, *funcs,alamda) INTEGER ma,nca,ndata,ia(ma),MMAX REAL alamda,chisq,funcs,a(ma),alpha(nca,nca),covar(nca,nca), *sig(ndata),x(ndata),y(ndata) PARAMETER (MMAX=20) CU USES covsrt,gaussj,mrqcof INTEGER j,k,l,m,mfit REAL ochisq,atry(MMAX),beta(MMAX),da(MMAX) SAVE ochisq,atry,beta,da,mfit if(alamda.lt.0.)then mfit=0 do 11 j=1,ma if (ia(j).ne.0) mfit=mfit+1 11 continue alamda=0.001 call mrqcof(x,y,sig,ndata,a,ia,ma,alpha,beta,nca,chisq,funcs) ochisq=chisq do 12 j=1,ma atry(j)=a(j) 12 continue endif j=0 do 14 l=1,ma if(ia(l).ne.0) then j=j+1 k=0 do 13 m=1,ma if(ia(m).ne.0) then k=k+1 covar(j,k)=alpha(j,k) endif 13 continue covar(j,j)=alpha(j,j)*(1.+alamda) da(j)=beta(j) endif 14 continue call gaussj(covar,mfit,nca,da,1,1) if(alamda.eq.0.)then call covsrt(covar,nca,ma,ia,mfit) return endif j=0 do 15 l=1,ma if(ia(l).ne.0) then j=j+1 atry(l)=a(l)+da(j) endif 15 continue call mrqcof(x,y,sig,ndata,atry,ia,ma,covar,da,nca,chisq,funcs) if(chisq.lt.ochisq)then alamda=0.1*alamda ochisq=chisq j=0 do 17 l=1,ma if(ia(l).ne.0) then j=j+1 k=0 do 16 m=1,ma if(ia(m).ne.0) then k=k+1 alpha(j,k)=covar(j,k) endif 16 continue beta(j)=da(j) a(l)=atry(l) endif 17 continue else alamda=10.*alamda chisq=ochisq endif return END C (C) Copr. 1986-92 Numerical Recipes Software .