code 36022; procedure MINMAXPOL(N,M,Y,FY,CO,EM); value N,M;integer N,M; array Y,FY,CO,EM; comment MINMAXPOL CALCULATES THE COEFFICIENTS, CO[I],I=,.....N OF THE POLYNOMIAL P(Y)=CO[0]+CO[1]*Y+...+CO[N]*Y**N, THAT APPROXIMATES THE DISCRETE FUNCTION FY[I],I=0,...M, GIVEN FOR THE ARGUMENTS Y[I],I=0,...M, IN THE MINIMAX NORM. THE ARGUMENTS MUST BE GIVEN IN MONOTONE INCREASING ORDER. IN ARRAY EM[0:3], ONE MUST GIVE THE MAXIMUM ALLOWED NUMBER OF ITERATIONS,EM[2]. MOREOVER, EM[0]:=THE DIFFERENCE OF THE GIVEN FUNCTION AND THE POLYNOMIAL IN THE FIRST APPROXIMATION POINT, EM[1]:=THE MAXIMUM OF ! P(Y[I])-FY[I]! FOR I=0,...M, EM[3]:=THE NUMBER OF ITERATIONS PERFORMED. THE PROCEDURES ELMVEC,DUPVEC,POL,NEWTON,NEWGRN, INI,SNDREMEZ ARE USED. REFERENCE:MEINARDUS,G.(1964,CH.7), APPROXIMATION VON FUNKTIONEN UND IHRE NUMERISCHE BEHANDLUNG; begin integer NP1,K,POMK,COUNT,CNT,J,MI; real E,ABSE,ABSEH; NP1:=N+1; begin integer array S[0:NP1]; array X,B,COEF[0:NP1] ,G[0:M]; procedure ERRPOL(N,M,E,CO,S,Y,FY,G); value N,M,E;integer N,M; real E; integer array S;array CO,Y,FY,G; commentERRPOL DELIVERS THE VALUE OF CO[0]+CO[1]*Y[I]+...+CO[N]*Y[I]**N - FY[I] IN G[I] FOR I=0,1,...M AND I NOT EQUAL S[J],J=0,1,...N+1. FOR J=0,1,...N+1 THEN G[S[J]]:=(-1)**J*E. THE INTEGERS S[J],FOR J=0,1,...N+1 ARE A SUBSET OF 0,1,...M; begin integer J,K,NP1,SJM1,SJ,S0,UP; NP1:=N+1;S0:=SJM1:=S[0]; G[S0]:=E; for J:=1 step 1 until NP1 do begin SJ:=S[J];UP:=SJ-1; for K:= SJM1+1 step 1 until UP do G[K]:=FY[K]-POL(N,Y[K],CO); G[SJ]:=E:=-E; SJM1:=SJ; end J; for K:= S0-1 step -1 until 0 do G[K]:=FY[K]-POL(N,Y[K],CO); for K:= SJ+1 step 1 until M do G[K]:=FY[K]-POL(N,Y[K],CO); end ERRPOL; INI(NP1,M,S); MI:=EM[2]; ABSE:= 0; for COUNT:= 1, COUNT + 1 while COUNT <= MI & ABSE > ABSEH do begin POMK:=1; for K:= 0 step 1 until NP1 do begin X[K]:= Y[S[K]]; COEF[K]:= FY[S[K]]; B[K]:= POMK; POMK:=-POMK end; NEWTON(NP1,X,COEF); NEWTON(NP1,X,B); EM[0]:= E:= COEF[NP1]/B[NP1]; ELMVEC(0,N,0,COEF,B,-E); NEWGRN(N,X,COEF); ERRPOL(N,M,E,COEF,S,Y,FY,G); SNDREMEZ(NP1,M,S,G,EM); ABSEH:=ABSE; ABSE:=ABS(E); CNT:=COUNT; end WHILE COUNT; EM[2]:=MI; EM[3]:=CNT; DUPVEC(0,N,0,CO,COEF); end; end MINMAXPOL eop