code 33132; procedure LINIGER1VS(X,XE,M,Y,SIGMA,DERIVATIVE,J, JACOBIAN,ITMAX,HMIN,HMAX,AETA,RETA,INFO,OUTPUT); value M; integer M,ITMAX; real X,XE,SIGMA,AETA,RETA,HMIN,HMAX; array Y,J,INFO; procedure DERIVATIVE,JACOBIAN,OUTPUT; begin integer I,ST,LASTJAC; real H,HNEW,MU,MU1,BETA,P,E,E1,ETA,ETA1,DISCR; boolean LAST,FIRST,EVALJAC,EVALCOEF; integer array PI[1:M]; real array DY,YL,YR,F[1:M],A[1:M,1:M],AUX[1:3]; real procedure NORM(A); array A; NORM:=SQRT(VECVEC(1,M,0,A,A)); procedure COEFFICIENT; begin real B,E; B:=ABS(H*SIGMA); if B>40 then begin MU:=1/B; BETA:=1; P:=2+2/(B-2) end else if B<.04 then begin E:=B*B/30; P:=3-E; MU:=.5-B/12*(1-E/2); BETA:=.5+B/6*(1-E) end else begin E:=EXP(B)-1; MU:=1/B-1/E; BETA:=(1-B/E)*(1+1/E); P:=(BETA-MU)/(.5-MU) end; MU1:=H*(1-MU); LUDECOMP procedure LUDECOMP; begin integer I; for I:=1 step 1 until M do begin MULROW(1,M,I,I,A,J,-MU1); A[I,I]:=A[I,I]+1 end; AUX[2]:=0; DEC(A,M,AUX,PI) end LUDECOMP; procedure STEPSIZE; if ETA<0 then begin real HL; HL:=H; H:=HNEW:=HMAX; INFO[5]:=INFO[5]+1; if 1.1*HNEW>XE-X then begin LAST:=true; H:=HNEW:=XE-X end; EVALCOEF:=H^=HL; end else if FIRST then begin H:=HNEW:=HMIN; FIRST:=false; INFO[4]:=INFO[4]+1 end else begin real B,HL; B:=DISCR/ETA; HL:=H; if B<.01 then B:=.01; HNEW:= if B>0 then H*B**(-1/P) else HMAX; if HNEW<HMIN then begin HNEW:=HMIN; INFO[4]:=INFO[4]+1 end else if HNEW>HMAX then begin HNEW:=HMAX; INFO[5]:=INFO[5]+1 end; if 1.1*HNEW>=XE-X then begin LAST:=true; H:=HNEW:=XE-X end else if ABS(H/HNEW-1)>.1 then H:=HNEW; EVALCOEF:=H^=HL end STEPSIZE; procedure LINEARITY(ERROR); real ERROR; begin integer K; for K:=1 step 1 until M do DY[K]:=Y[K]-MU1*F[K]; SOL(A,M,PI,DY); ELMVEC(1,M,0,DY,Y,-1); ERROR:=NORM(DY) procedure ITERATION(I); integer I; if RETA<0 then begin integer K; if I=1 then begin MULVEC(1,M,0,DY,F,H); for K:=1 step 1 until M do YL[K]:=Y[K]+MU*DY[K]; SOL(A,M,PI,DY); E:=1; end else begin for K:=1 step 1 until M do DY[K]:=YL[K]-Y[K]+MU1*F[K]; if E*NORM(Y)>E1*E1 then begin EVALJAC:=I>=3; if I>3 then begin INFO[3]:=INFO[3]+1; JACOBIAN(J,Y); LUDECOMP end; end; SOL(A,M,PI,DY) end; E1:=E; E:=NORM(DY); ELMVEC(1,M,0,Y,DY,1); ETA:=NORM(Y)*RETA+AETA; DISCR:=0; DUPVEC(1,M,0,F,Y); DERIVATIVE(F); INFO[2]:=INFO[2]+1; end else begin integer K; if I=1 then begin LINEARITY(E); if E*(ST-LASTJAC)>ETA then begin JACOBIAN(J,Y); LASTJAC:=ST; INFO[3]:=INFO[3]+1; H:=HNEW; COEFFICIENT; LINEARITY(E) end; EVALJAC:= E*(ST+1-LASTJAC)>ETA; MULVEC(1,M,0,DY,F,H); for K:=1 step 1 until M do YL[K]:=Y[K]+MU*DY[K]; SOL(A,M,PI,DY); for K:=1 step 1 until M do YR[K]:=H*BETA*MATVEC(1,M,K,J,DY); SOL(A,M,PI,YR); ELMVEC(1,M,0,YR,DY,1); end else begin for K:=1 step 1 until M do DY[K]:=YL[K]-Y[K]+MU1*F[K]; if E>ETA1 and DISCR>ETA1 then begin INFO[3]:=INFO[3]+1; JACOBIAN(J,Y); LUDECOMP end; SOL(A,M,PI,DY); E:=NORM(DY) end; ELMVEC(1,M,0,Y,DY,1); ETA:=NORM(Y)*RETA+AETA; ETA1:=ETA/SQRT(RETA); DUPVEC(1,M,0,F,Y); DERIVATIVE(F); INFO[2]:=INFO[2]+1; for K:=1 step 1 until M do DY[K]:=YR[K]-H*F[K]; DISCR:=NORM(DY)/2 end ITERATION; FIRST:=EVALJAC:=true; LAST:=EVALCOEF:=false; INIVEC(1,9,INFO,0); ETA:=RETA*NORM(Y)+AETA; ETA1:=ETA/SQRT(ABS(RETA)); DUPVEC(1,M,0,F,Y); DERIVATIVE(F); INFO[2]:=1; for ST:=1,ST+1 while ^LAST do begin STEPSIZE; INFO[1]:=INFO[1]+1; if EVALJAC then begin JACOBIAN(J,Y); INFO[3]:=INFO[3]+1; H:=HNEW; COEFFICIENT; EVALJAC:=false; LASTJAC:=ST end else if EVALCOEF then COEFFICIENT; for I:=1,I+1 while E>ABS(ETA) and DISCR>1.3*ETA and I<=ITMAX do begin ITERATION(I); if I>INFO[6] then INFO[6]:=I; end; INFO[7]:=ETA; INFO[8]:=DISCR; X:=X+H; if DISCR>INFO[9] then INFO[9]:=DISCR; OUTPUT; end; end LINIGER1VS; eop