Download levma2.eso

Back to the list

   1 : C LEVMA2    SOURCE    CHAT      05/01/13    01:15:25     5004           
   2 :        subroutine levma2(x,y,sig, ndata,a,ma,
   3 :      +ytest,dyda,chisq,alamda,alpha,beta,aold,covar,da)
   4 : c
   5 : c appele par mrqmin pour evaluer la matrice alpha et le vecteur beta
   6 :       IMPLICIT INTEGER(I-N)
   7 :       IMPLICIT REAL*8 (A-H,O-Z)
   8 :       parameter (mmax=20)
   9 :       real*8 x(ndata),y(ndata),sig(ndata),alpha(ma,ma),beta(ma)
  10 :       real*8 covar(ma,ma),da(ma)
  11 :       real*8 dyda(ma*ndata),a(ma),ytest(ndata),aold(ma)
  12 :       logical deini
  13 : 
  14 :       nca = ma
  15 :       deini = .false.
  16 :       if (chisq.lt.0) deini = .true.
  17 : 
  18 : c       write(6,*) ytest(1),dyda(1),dyda(2),dyda(3),dyda(4)
  19 : * initialisation
  20 :       if (deini) then
  21 :          alamda = 0.001d0
  21 :          call levma3(x,y,sig,ndata,a,ma,alpha,beta,nca,
  22 :      + ytest,dyda,chisq)
  23 :          deini = .false.
  24 :          do 113 j=1,ma
  25 :             aold(j)=a(j)
  26 :  113     continue
  27 :          goto 202
  28 :       endif
  29 : 
  30 :  201  ochisq = chisq
  31 : 
  32 : * calcul de chi2
  32 :       call levma3(x,y,sig,ndata,a,ma,covar,da,nca,
  33 :      + ytest,dyda,chisq)
  34 :  203  continue
  35 : 
  36 :       write(6,*) 'ochisq ',ochisq, ' chisq', chisq, 'alamda  ',alamda
  37 :       if (chisq.le.ochisq) then 
  38 : * si oui prend la nouvelle solution
  39 :          alamda = 0.1d0*alamda
  40 :          ochisq = chisq
  41 :          do 218 j=1,ma
  42 :            do 217 k=1,ma
  43 :              alpha(j,k)=covar(j,k)
  44 :  217       continue
  45 :            beta(j) = da(j)
  46 :            aold(j)=a(j)
  47 :  218     continue
  48 :       else
  49 : * si non augmente alamda et retour
  50 :         write(6,*) ' alamda augmente ' ,alamda
  51 :         alamda = 10.d0*alamda
  52 :         chisq = ochisq
  53 :         do 219 j= 1,ma
  54 :           a(j) = aold(j)
  55 :  219    continue
  56 :       endif
  57 : 
  58 : * propose nouveaux parametres 
  59 :  202  continue
  60 : * matrice d ajustment linearisee : augmente les elements diagonaux
  61 :       do 215 j=1,ma
  62 :          do 214 k=1,ma
  63 :             covar(j,k)=alpha(j,k)
  64 :  214     continue
  65 :          covar(j,j)=alpha(j,j)*(1. + alamda)
  66 :          da(j) = beta(j)
  67 :  215  continue
  68 : 
  69 : c      write(6,*) (covar(1,j),j=1,4) 
  70 : c      write(6,*) (covar(2,j),j=1,4) 
  71 : c      write(6,*) (covar(3,j),j=1,4) 
  72 : c      write(6,*) (covar(4,j),j=1,4)
  73 : c      write(6,*) 'da', (da(j),j=1,4) 
  73 :       call gaussk(covar,ma,nca,da,1,1)
  74 :       if (alamda.eq.0.) then
  74 :         call covsrt(covar,nca,ma)
  75 :         return
  76 :       endif
  77 : 
  78 : c      write(6,*) 'aold',(aold(lista(j)),j=1,4) 
  79 : c      write(6,*) 'a',(a(lista(j)),j=1,4) 
  80 : c      write(6,*) (lista(j),j=1,4)
  81 :       do 216 j =1,ma
  82 :         a(j) = a(j) + da(j)
  83 :  216   continue
  84 : c      write(6,*) 'da',(da(j),j=1,3) 
  85 :       return
  86 :       end
  87 :  
  88 :  

© Cast3M 2003 - All rights reserved.
Disclaimer