C LEVMA2 SOURCE CHAT 05/01/13 01:15:25 5004 subroutine levma2(x,y,sig, ndata,a,ma, +ytest,dyda,chisq,alamda,alpha,beta,aold,covar,da) c c appele par mrqmin pour evaluer la matrice alpha et le vecteur beta IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) parameter (mmax=20) real*8 x(ndata),y(ndata),sig(ndata),alpha(ma,ma),beta(ma) real*8 covar(ma,ma),da(ma) real*8 dyda(ma*ndata),a(ma),ytest(ndata),aold(ma) logical deini nca = ma deini = .false. if (chisq.lt.0) deini = .true. c write(6,*) ytest(1),dyda(1),dyda(2),dyda(3),dyda(4) * initialisation if (deini) then alamda = 0.001d0 call levma3(x,y,sig,ndata,a,ma,alpha,beta,nca, + ytest,dyda,chisq) deini = .false. do 113 j=1,ma aold(j)=a(j) 113 continue goto 202 endif 201 ochisq = chisq * calcul de chi2 call levma3(x,y,sig,ndata,a,ma,covar,da,nca, + ytest,dyda,chisq) 203 continue write(6,*) 'ochisq ',ochisq, ' chisq', chisq, 'alamda ',alamda if (chisq.le.ochisq) then * si oui prend la nouvelle solution alamda = 0.1d0*alamda ochisq = chisq do 218 j=1,ma do 217 k=1,ma alpha(j,k)=covar(j,k) 217 continue beta(j) = da(j) aold(j)=a(j) 218 continue else * si non augmente alamda et retour write(6,*) ' alamda augmente ' ,alamda alamda = 10.d0*alamda chisq = ochisq do 219 j= 1,ma a(j) = aold(j) 219 continue endif * propose nouveaux parametres 202 continue * matrice d ajustment linearisee : augmente les elements diagonaux do 215 j=1,ma do 214 k=1,ma covar(j,k)=alpha(j,k) 214 continue covar(j,j)=alpha(j,j)*(1. + alamda) da(j) = beta(j) 215 continue c write(6,*) (covar(1,j),j=1,4) c write(6,*) (covar(2,j),j=1,4) c write(6,*) (covar(3,j),j=1,4) c write(6,*) (covar(4,j),j=1,4) c write(6,*) 'da', (da(j),j=1,4) call gaussk(covar,ma,nca,da,1,1) if (alamda.eq.0.) then call covsrt(covar,nca,ma) return endif c write(6,*) 'aold',(aold(lista(j)),j=1,4) c write(6,*) 'a',(a(lista(j)),j=1,4) c write(6,*) (lista(j),j=1,4) do 216 j =1,ma a(j) = a(j) + da(j) 216 continue c write(6,*) 'da',(da(j),j=1,3) return end