%% syntaxe : x array interpolfunct --> f(x) interpole a partir du
%% tableau de points array
/interpolfunct {
11 dict begin
/table_f exch def
/x exch def
%% n = le + grand indice
/n table_f length 2 idiv 1 sub def
/x0 table_f 0 get def
/xn table_f 2 n mul get def
/xi+1 0 def
xn x0 gt {
%% table_f trie par x croissant
/y_xmin table_f 1 get def
/y_xmax table_f n 2 mul 1 add get def
/i 0 def
/increment 1 def
/xi x0 def
} {
%% table_f trie par x decroissant
/y_xmax table_f 1 get def
/y_xmin table_f n 2 mul 1 add get def
/i n def
/increment -1 def
/xi xn def
} ifelse
x x0 lt x xn lt and {
%% x < x0 et x < xn
y_xmin
%% (x0) x0
%% (xn) xn
%% (x) x blim
} {
x xn gt x x0 gt and {
%% x > x0 et x > xn
y_xmax
} {
%% x dans [xi ; xn] ou dans [xi ; x0]
{
/i i increment add store
i 0 lt i n gt or {
%% impossible en principe
(PROBLEME DANS F) boum
} if
/xi+1 table_f 2 i mul get store
x xi+1 le {
%% alors xi < x < xi+1
/yi+1 table_f 2 i mul 1 add get def
/yi table_f 2 i increment sub mul 1 add get def
yi+1 yi sub xi+1 xi sub div
x xi sub mul
yi add
%% (xi) xi
%% (xi+1) xi+1
%% (yi) yi
%% (yi+1) yi+1
exit
} {
%% alors x dans [xi+1 ; xn] (ou [xi+1 ; x0])
/xi xi+1 store
% (i) i
} ifelse
} loop
} ifelse
} ifelse
end
} def
|