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