10 ! Program pentru fitarea unui spectru Mossbauer prin metoda 20 ! celor mai mici patrate folosind metoda Gauss-Newton 30 ! cu algoritmul Levenberg-Marquart 40 ! D. CIURCHEA 1993 50 !************************************************************** 60 !* P R O G R A M U L P R I N C I P A L * 70 !************************************************************** 80 RANDOMIZE(.75) 90 CALL CLEAR 100 !CREEN 2 110 ! 120 !------------- Specificarea variabilelor --------------- 130 ! 140 AA=1!Incepe evaluarea preciziei masinii 150 FOR I=1 TO 100 160 REPS=2^(-I) 170 IF AA=AA+REPS THEN 190 180 NEXT I 190 REPS=REPS*2 :: PRINT REPS :: ! Lungimea mantisei masinii. 200 FOR I=1 TO 70 :: A$=A$&" " :: NEXT I 210 NPCT=121! Nr. punctelor experimentale. 220 NPAR=5! nr. parametrilor din modelul teoretic. 230 DIM D(121)! Vector care contin spectrul experimental. 240 DIM DC(121)! Vector care contine spectrul calculat. 250 DIM W(5),V(5),VT(5)! Vect. pt. param. modelului. 260 DIM A(5,5),X(5),B(5),G(5)! Rez. sist. liniar. 270 DIM AINV(5,5)! Calculul matricii inverse. 280 NSIG=5! Nr. cifrelor semn. in raportarea rez. final. 290 PREC=10^(-NSIG) 300 MAXFN=5000! Nr. max. de evaluari ale func. permis de util. 310 PRINT "FITAREA UNUI SPECTRU MOSSBAUER SIMULAT" 320 PRINT "Programul este in executie" 330 DATA 575,8.4,85,39,60 340 DATA 480,14,70,52,73 350 SZ=0 360 FOR I=1 TO NPAR! Citeste param. adevarati ai spectrului 370 READ V(I)! experimental ai nitroprusiatului de Na. 380 NEXT I 390 GG=V(2)^2/4! Patratul semilargimii la semiinaltime 400 MI=1E+20 410 MA=-1/MI 420 FOR I=1 TO NPCT 430 ZG=.2*(RND-.5)! Simularea erorilor experimentale. 440 BM=I-V(4)! Pozitia picului de la viteze negative, 450 BP=I-V(5)*2+V(4)!respectiv pt.viteze pozitive 460 ! la centrul spectrului dat de V(5). 470 AA=V(2)*V(3) 480 ! AA= Aria picului,V(3) * semilargimea V(2) * 2. 490 D(I)=V(1)-AA/(BM*BM+GG)-AA/(BP*BP+GG) 500 ! Vectorul D() contine intensitatea adevarata. 510 ZG=ZG*SQR(D(I)) 520 ! Erorile "experimentale" urmeaza o distributie Poisson. 530 SZ=SZ+ZG*ZG! Suma erorilor introduse in spectru. 540 D(I)=D(I)+ZG! Intens. "masurata", cu er. "exper.". 550 IF MAD(I)THEN MI=D(I) 570 NEXT I 580 SCL=(MA-MI)! Factorul de scala. 590 ALM=0!10!100 ! Parametrul Levenberg-Marquart. 600 FOR I=1 TO NPAR! Valorile initiale ale parametrilor. 610 READ V(I) 620 NEXT I 630 EPS=SQR(REPS)!*32! Cst. pt. evaluarea derivatei numerice. 640 ! 650 !------------------ INITIALIZARE ----------------- 660 ! 670 FOR I=1 TO NPAR! Initializarea vectorului de lucru. 680 W(I)=V(I) 690 NEXT I 700 GOSUB 2480!Valorarea functiei cu parametrii initiali. 710 F0=F 720 ! 730 !-------------- INCEPUTUL PROCESULUI ITERATIV ------------- 740 ! 750 ! 760 !======= CONSTRUIREA SISTEMULUI LINIAR DE ECUATII ========== 770 ! 780 FOR I=1 TO NPAR! Init. mat. Hessian si a term. liberi. 790 FOR J=I TO NPAR 800 A(I,J)=0 810 A(J,I)=0 820 NEXT J 830 W(I)=V(I)! Actualizarea vectorului de lucru. 840 B(I)=0 850 NEXT I 860 ! 870 !------ Calculul derivatelor numerice in fiecare punct ------ 880 ! 890 GAM=V(2)*V(2)/4 900 FOR IP=1 TO NPCT 910 F1=V(1)-V(2)*V(3)/((IP-V(4))^2+GAM) 920 F1=F1-V(3)*V(2)/((IP-V(5)*2+V(4))^2+GAM) 930 ! F1 este o referinta pentru calculul derivatelor numerice 940 DIF=D(IP)-F1 950 FOR I=1 TO NPAR!Calc. comp.gradientului in punctul IP. 960 AA=ABS(V(I)) :: IF AA<.1 THEN AA=.1! Scala pas. 970 PAS=AA*EPS :: W(I)=V(I)+PAS! Pas deriv.num. 980 GAMW=W(2)*W(2)/4 990 F2=W(1)-W(2)*W(3)/((IP-W(4))^2+GAMW) 1000 F2=F2-W(3)*W(2)/((IP-W(5)*2+W(4))^2+GAMW) 1010 G(I)=(F2-F1)/PAS! Componenta gradientului. 1020 W(I)=V(I)! Refacerea vectorului de lucru. 1030 NEXT I 1040 ! 1050 !--- Calculul matricii Hessian, A si al term. liberi, B -- 1060 ! 1070 FOR I=1 TO NPAR 1080 FOR J=I+1 TO NPAR 1090 A(I,J)=A(I,J)+G(I)*G(J)! Mat. Hessian. 1100 A(J,I)=A(I,J) 1110 NEXT J 1120 A(I,I)=A(I,I)+G(I)*G(I) 1130 B(I)=B(I)+DIF*G(I)! Termenii liberi. 1140 NEXT I 1150 NEXT IP 1160 IFN=IFN+(NPAR*NPAR+NPAR)/2 1170 GOSUB 2640! Rezolvarea sist.liniar printr-o metoda adecvata. 1180 ! 1190 !=================== AJUSTAREA PASULUI ==================== 1200 ! 1210 IF INEF>6 OR IFN>MAXFN THEN 2060 1220 ALFA=1! Incercarea cu un pas cit mai mare 1230 GOSUB 3140 1240 F2=F 1250 IF F2>=F0 THEN 1290 1260 AL=ALFA 1270 F0=F2 1280 GOTO 1540 1290 ALFA=.5! Incercarea cu jumatatea pasului maxim 1300 GOSUB 3140 1310 F1=F 1320 IF F1>=F0 THEN 1360 1330 AL=ALFA 1340 F0=F1 1350 GOTO 1540 1360 ALFA=(3*F0-4*F1+F2)/4/(F0-F1-F1+F2) 1370 ! Ajust. pas. cu o parabola prin abscisele 0, 0.5, 1. 1380 GOSUB 3140 1390 IF F>=F0 THEN 1440 1400 AL=ALFA 1410 F0=F 1420 GOTO 1540 1430 ! 1440 !-------- Decizie pentru cautarea ineficienta ----------- 1450 ! 1460 !IF F0 >= F1 AND F0 >= F2 THEN 1270 1470 ALM=ALM*1.01! Se amplifica param. L-M. 1480 INEF=INEF+1 1490 GOSUB 2410! Schimba semnul si marimea corectiilor. 1500 GOTO 1210!Reia ajustarea pasului. 1510 ! 1520 ! ========== P R O G R E S I N C A U T A R E ========= 1530 ! 1540 ITN=ITN+1 1550 ALM=ALM/2 1560 INEF=0 1570 CALL CLEAR 1580 FOR I=1 TO NPAR 1590 W(I)=V(I)+AL*X(I) 1600 !LOCATE 13+I,1 1610 DISPLAY AT(13+I,1):USING "v(#)=###.### ":I,V(I) 1620 !LOCATE 13 + I, 65 1630 !PRINT USING " w()=."; I; w(I) 1640 NEXT I 1650 DISPLAY AT(1,1):USING "alfa=###.###^^^^":AL 1660 DISPLAY AT(2,1):USING "Par.L-M=##.##^^^^":ALM 1670 DISPLAY AT(3,1):USING "itn=#####":ITN 1680 DISPLAY AT(4,1):USING "rez=#####.##":F0 1690 NQ=0! Testeaza cifrele semnif. in parametrii calculati. 1700 FOR I=1 TO NPAR 1710 IF ABS(V(I)/W(I)-1)NPAR THEN 2170 2140 A$="TERMINATIE NORMALA." 2150 A$=A$&" S-AU OBTINUT ## CIFRE SEMNIF. IN ### ITERATII" 2160 DISPLAY AT(2,1):USING A$:NSIG,ITN :: GOTO 2230 2170 A$="TERMINATIE ANORMALA " 2180 IF INEF=0 THEN 2210 2190 PRINT A$&"datorata cautarii ineficiente" 2200 GOTO 2230 2210 IF IFN