|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 9472 (0x2500) Types: TextFile Names: »CFIG.PAS«
└─⟦692ac107c⟧ Bits:30005923 PolyPascal-80 V3.10 arbejdsdiskette 1 └─ ⟦this⟧ »CFIG.PAS«
(*$R-*) PROGRAM CURVEFIT; LABEL 5,10,15,20,40,50,99,110,220,330,440; CONST MAX=100; VAR (*S STAAR FOR SUMMA*) XE,YE, SX,SX2,SX3,SX4,SLNX,SLNX2,SLNX3,SLNX4,SY,SY2,SLNY,SLNY2,SXY,SX2Y,SXLNY,SX2LNY ,SYLNX,SYLNX2,SLNXLNY,SLNX2LNY,A1,A2,A3,B1,B2,B3,C1,C2,C3,D1,D2,D3 ,DENOM,A,B,C,EPSILON,EMIN,XINP,YCALC:REAL; NN,II,YY,I,N,BEST,CTRL,FIT:INTEGER; X:ARRAY Æ1..MAXÅ OF REAL; Y:ARRAY Æ1..MAXÅ OF REAL; E:ARRAY Æ1..4Å OF REAL; DUMMY:CHAR; EDITFLAG:BOOLEAN; PROCEDURE XY(X,Y:INTEGER); æCURSOR ADDRESSING PLEASEå CONST ESC=27; æVALUE FOR ESCå OFF=32; æOFFSET IN DECIMALå BEGIN WRITE(CHR(ESC),'Y',CHR(Y+OFF),CHR(X+OFF)); END; PROCEDURE CLRSCR; BEGIN WRITELN(CHR(27),'E'); æCLEAR SCREEN PROCEDUREå END; PROCEDURE BEEP; BEGIN WRITE(CHR(7)); æBELL CHARå END; PROCEDURE MORE; VAR ACK:CHAR; BEGIN WRITELN('More, press <RETURN>'); READ(ACK); END; PROCEDURE EDIT(VAR N:INTEGER;P:INTEGER); æN IS NEW DATAINDEX VALUE RETURNEDå VAR æP IS OLD DATAINDEX VALUE FRM PRG å P1,N1,ANSWER:INTEGER; IPU,RUNFLAG:BOOLEAN; BEGIN RUNFLAG:=FALSE; WHILE RUNFLAG=FALSE DO BEGIN XY(40,10); WRITE('Backward..................<1>'); XY(40,11); WRITE('Forward...................<2>'); XY(40,12); WRITE('Finished..................<3>'); XY(40,13); WRITE('Start over................<4>'); XY(40,14); WRITE('Continue..................<5>'); XY(40,15); WRITE('Enter your choice.........<?>'); REPEAT XY(67,15); WRITE('?'); XY(67,15); FOR N1:=1 TO 10000 DO; IPU:=KEYPRESS; XY(67,15); WRITE(' '); XY(67,15); FOR N1:=1 TO 10000 DO; UNTIL IPU; READ(ANSWER); IF ANSWER IN Æ1,2,3,4,5Å THEN BEGIN RUNFLAG:=TRUE; FOR P1:=10 TO 15 DO æCLEAR MENU AREAå BEGIN XY(40,P1); WRITE(' '); END; CASE ANSWER OF 1:IF P>1 THEN N:=P-1; æBACKWARD å 2:N:=P+1; æFORWARD å 3:N:=0; æFINISHED å 4:N:=1; æSET TO FIRST DATALOCATION å 5:N:=P; æSET TO SAME DATALOCATION å END; END ELSE BEGIN BEEP; XY(68,15); WRITE(' '); æCLEAR ENTRY AREAå RUNFLAG:=FALSE; END; END; END; PROCEDURE ENTER(VAR X,Y:REAL;VAR EDITFLAG:BOOLEAN;I:INTEGER);æGET INPUT DATAå TYPE æRETURN THESE AS X,Yå DAT=STRING (.10.); VAR DATAIN,DATAX,DATAY:DAT; N1,N2,TESTX,TESTY:INTEGER; INCFLAG,RUNFLAG:BOOLEAN; BEGIN RUNFLAG:=FALSE; REPEAT IF I > 23 THEN IF YY > 23 THEN YY:=1 ELSE BEGIN YY:=YY+1; END ELSE YY:=I; XY(5,YY); WRITE(' '); XY(2,YY); WRITE('Enter x,y (',i,')........... '); READ(DATAIN); IF DATAIN='' THEN BEGIN æUSER WANT TO EDIT DATAå EDITFLAG:=TRUE; RUNFLAG:=TRUE; END ELSE æREAL DATA ENTERED SEARCH FOR A ','å BEGIN N1:=POS(',',DATAIN); IF N1 <> 0 THEN BEGIN RUNFLAG:=TRUE; N2:=LEN(DATAIN); DATAX:=COPY(DATAIN,1,N1-1); DATAY:=COPY(DATAIN,N1+1,(N2-N1+1)); VAL(DATAX,X,TESTX); VAL(DATAY,Y,TESTY); æGET X AND Y VALUES FROM STRINGå IF (TESTX >0) OR (TESTY >0) THEN RUNFLAG:=FALSE; æERROR IN ENTRYå END ELSE RUNFLAG:=FALSE; æNO COMMA, IE. STRANGE DATAå END; UNTIL RUNFLAG=TRUE; END; PROCEDURE EQUATIONS(TYP:INTEGER); BEGIN CLRSCR; DENOM:=A1*(B2*C3-B3*C2)+A2*(B3*C1-B1*C3)+A3*(B1*C2-B2*C1); A:=(D1*(B3*C2-B2*C3)+D2*(B1*C3-B3*C1)+D3*(B2*C1-B1*C2))/DENOM; B:=(D1*(A2*C3-A3*C2)+D2*(A3*C1-A1*C3)+D3*(A1*C2-A2*C1))/DENOM; C:=(D1*(A3*B2-A2*B3)+D2*(A1*B3-A3*B1)+D3*(A2*B1-A1*B2))/DENOM; CASE TYP OF 1:BEGIN WRITELN('LINEAR CASE:'); EÆ1Å:=SQRT ((SY2-A*SX2Y-B*SXY-C*SY)/(SY2)); EPSILON:=EÆ1Å; END; 2:BEGIN WRITELN('EXPONENTIAL CASE:'); EÆ2Å:=SQRT((SLNY2-A*SX2LNY-B*SXLNY-C*SLNY)/(SLNY2)); EPSILON:=EÆ2Å; END; 3:BEGIN WRITELN('LOGARITHMIC CASE:'); EÆ3Å:=SQRT((SY2-A*SYLNX2-B*SYLNX-C*SY)/(SY2)); EPSILON:=EÆ3Å; END; 4:BEGIN WRITELN('POWER CASE:'); EÆ4Å:=SQRT((SLNY2-A*SLNX2LNY-B*SLNXLNY-C*SLNY)/(SLNY2)); EPSILON:=EÆ4Å; END; END; WRITELN('A =',A:16:8); WRITELN('B =',A:16:8); WRITELN('C =',C:16:8); WRITELN('EPSILON =',EPSILON:16:10); MORE; END; BEGIN N:=0; CTRL:=0; SX:=0;SX2:=0;SX3:=0;SX4:=0;SLNX:=0; SLNX2:=0;SLNX3:=0;SLNX4:=0;SY:=0; SY2:=0;SLNY:=0;SLNY2:=0;SXY:=0; SX2Y:=0;SXLNY:=0;SX2LNY:=0;SYLNX:=0; SYLNX2:=0;SLNXLNY:=0;SLNX2LNY:=0; 5:CLRSCR; WRITELN(' *****************************************************************'); WRITELN(' ++++++++++++++++ IMPROVED CURVE FITTING PROGRAM ++++++++++++++++'); WRITELN(' *****************************************************************'); XY(50,23); WRITE('Press <RETURN> to continue '); READ(DUMMY); CLRSCR; EDITFLAG:=FALSE; I:=1; NN:=1; REPEAT æCONTINUE UNTIL N:=0å ENTER(XE,YE,EDITFLAG,I); IF EDITFLAG THEN REPEAT EDIT(NN,I); IF NN> 0 THEN I:=NN; EDITFLAG:=FALSE; IF NN>0 THEN ENTER(XE,YE,EDITFLAG,I); UNTIL NOT EDITFLAG; IF NN>0 THEN BEGIN XÆIÅ:=XE; YÆIÅ:=YE; I:=I+1; END; UNTIL NN=0; II:=I-1; FOR I:=1 TO II DO BEGIN SX:=SX+XÆIÅ; SX2:=SX2+SQR(XÆIÅ); SX3:=SX3+SQR(XÆIÅ)*XÆIÅ; SX4:=SX4+SQR(SQR(XÆIÅ)); SLNX:=SLNX+LN(XÆIÅ); SLNX2:=SLNX2+SQR(LN(XÆIÅ)); SLNX3:=SLNX3+LN(XÆIÅ)*SQR(LN(XÆIÅ)); SLNX4:=SLNX4+SQR(SQR(LN(XÆIÅ))); SY:=SY+YÆIÅ; SY2:=SY2+SQR(YÆIÅ); SLNY:=SLNY+LN(YÆIÅ); SLNY2:=SLNY2+SQR(LN(YÆIÅ)); SXY:=SXY+XÆIÅ*YÆIÅ; SX2Y:=SX2Y+SQR(XÆIÅ)*YÆIÅ; SXLNY:=SXLNY+XÆIÅ*LN(YÆIÅ); SX2LNY:=SX2LNY+SQR(XÆIÅ)*LN(YÆIÅ); SYLNX:=SYLNX+YÆIÅ*LN(XÆIÅ); SYLNX2:=SYLNX2+YÆIÅ*SQR(LN(XÆIÅ)); SLNXLNY:=SLNXLNY+LN(XÆIÅ)*LN(YÆIÅ); SLNX2LNY:=SLNX2LNY+SQR(LN(XÆIÅ))*LN(YÆIÅ); END; CLRSCR; WRITELN(CHR(171),'X = ',SX:16:10); WRITELN(CHR(171),'X^2 = ',SX2:16:10); WRITELN(CHR(171),'S^3 = ',SX3:16:10); WRITELN(CHR(171),'X^4 = ',SX4:16:10); WRITELN(CHR(171),'LN(X)= ',SLNX:16:10); WRITELN(CHR(171),'LN(X)^2 = ',SLNX2:16:10); WRITELN(CHR(171),'LN(X)^3 = ',SLNX3:16:10); WRITELN(CHR(171),'LN(X)^4 = ',SLNX4:16:10); WRITELN(CHR(171),'Y = ',SY:16:10); WRITELN(CHR(171),'Y^2 = ',SY2:16:10); WRITELN(CHR(171),'LN(Y) = ',SLNY:16:10); WRITELN(CHR(171),'LN(Y)^2 = ',SLNY2:16:10); MORE; CLRSCR; WRITELN(CHR(171),'X,Y ',SXY:16:10); WRITELN(CHR(171),'Y*X^2 ',SX2Y:16:10); WRITELN(CHR(171),'X*LN(Y) = ',SXLNY:16:10); WRITELN(CHR(171),'X^2*LN(Y)= ',SX2LNY:16:10); WRITELN(CHR(171),'Y*LN(X) = ',SYLNX:16:10); WRITELN(CHR(171),'Y*LN(X)^2 = ',SYLNX2:16:10); WRITELN(CHR(171),'LNX*LNY = ',SLNXLNY:16:10); WRITELN(CHR(171),'LNX2*LNY = ',SLNX2LNY:16:10); MORE; CLRSCR; 110:(*LINEAR CASE*) A1:=SX4;A2:=SX3;A3:=SX2; B1:=SX3;B2:=SX2;B3:=SX; C1:=SX2;C2:=SX;C3:=N; D1:=-SX2Y;D2:=-SXY;D3:=-SY; EQUATIONS(1); IF CTRL=1 THEN GOTO 40; 220:(*EXPONENTIAL CASE*) A1:=SX4;A2:=SX3;A3:=SX2; B1:=SX3;B2:=SX2;B3:=SX; C1:=SX2;C2:=SX;C3:=N; D1:=-SX2LNY;D2:=-SXLNY;D3:=-SLNY; EQUATIONS(2); IF CTRL=1 THEN GOTO 40; 330:(*LOGARITHMIC CASE*) A1:=SLNX4;A2:=SLNX3;A3:=SLNX2; B1:=SLNX3;B2:=SLNX2;B3:=SLNX; C1:=SLNX2;C2:=SLNX;C3:=N; D1:=-SYLNX2;D2:=-SYLNX;D3:=-SY; EQUATIONS(3); IF CTRL=1 THEN GOTO 40; 440:(*POWER CASE*) A1:=SLNX4;A2:=SLNX3;A3:=SLNX2; B1:=SLNX3;B2:=SLNX2;B3:=SLNX; C1:=SLNX2;C2:=SLNX;C3:=N; D1:=-SLNX2LNY;D2:=-SLNXLNY;D3:=-SLNY; EQUATIONS(4); IF CTRL=1 THEN GOTO 40; EMIN:=EÆ1Å;BEST:=1; FOR I:=2 TO 4 DO BEGIN IF EÆIÅ<EMIN THEN BEGIN EMIN:=EÆIÅ; BEST:=I; END; END; CASE BEST OF 1: WRITELN('LINEAR FIT BEST! (1)'); 2: WRITELN('EXPONENTIAL FIT BEST (2)'); 3: WRITELN('LOGARITHMIC FIT BEST (3)'); 4: WRITELN('POWER FIT BEST (4)'); END; CTRL:=1; 50: WRITELN; WRITE('ENTER ESTIMATION CASE 1 TO 4 , -1 TO STOP OR 0 TO RESTART '); READLN(FIT); CASE FIT OF -1:GOTO 99; 0:GOTO 5; 1:GOTO 110; 2:GOTO 220; 3:GOTO 330; 4:GOTO 440; END; 40:WRITE('X: ');READ(XINP); CASE FIT OF 1: (*LINEAR:*) YCALC:=A*SQR(XINP)+B*XINP+C; 2: (*EXPONENTIAL:*) YCALC:=EXP(A*XINP*XINP+B*XINP+C); 3: (*LOGARITHMIC:*) YCALC:=A*LN(SQR(XINP))+B*LN(XINP)+C; 4: (*POWER:*) YCALC:=EXP(A*LN(XINP)*LN(XINP)+B*LN(XINP)+C); END; WRITELN('Y: ',YCALC:14:10); GOTO 40; 99: FOR NN:=0 TO 9 DO; END. «eof»