// Illustration de l'interpolation spline.

function e0400()
//==============
//Listing 4.3 page 73, construction d'interpolation spline
deff("y =fn(x)", "y=(1.0)./(1 + x.*x)");
npts = 200;
npiv = 5;
//npiv = input("nombre de pivots (entre 3 et 15) :");
xmin = -5;   xmax = 5;
x = linspace(xmin, xmax, npts);
xp = linspace(xmin, xmax, npiv);

// place les points
plot2d(xp, fn(xp), -4, rect=[xmin-0.5, -0.5, xmax+0.5, 1.5]);
eee1=gce();
eee1.children(1).mark_size = 5;  // mark plus grosses

// Cas du spline naturel, qui est assez bon
derivees = splin(xp, fn(xp), "natural");
spline1 = interp(x, xp, fn(xp), derivees);

// trace la courbe du spline
plot2d(x, spline1, 2, "000");
eee2=gce();
eee2.children(1).thickness = 2;  // courbe plus épaisse

// Structure du graphique
aaa = gcf();  // Référence au graphique
bbb = aaa.children;  // bbb = gca(); est équivalent. Référence aux axes.
eee1 = bbb.children(1); // eee1 = gce() après le plot est équivalent des points
fff1 = eee1.children(1); // la courbe
fff1.mark_mode = "off"; // marques afficher sur la courbe ou non
fff1.thickness = 4; // épaisseur du trait.

eee2 = bbb.children(2); // eee2 = gce() après le plot est équivalent de la ligne
fff2 = eee2.children(1); // les points
fff2.mark_mode = "off"; // ne trace pas les points ???
fff2.mark_style = 3; // style des marques
fff2.line_mode = "off"; // trace des lignes, on ou off.
fff2.thickness = 1; // épaisseur du trait.

// Cas par défaut, qui n'est pas le meilleur
derivees = splin(xp, fn(xp), "not_a_knot");
spline2 = interp(x, xp, fn(xp), derivees);
plot(x, spline2);
aaa.color_map(31,:) = [0, 0, 0];  // = couleur de la courbe
eee=gce();
eee.children.foreground = 31;
eee.children.thickness = 2;
eee.children.line_style = 2;

// cas où l'on impose les dérivées aux bords
derivees = splin(xp, fn(xp), "clamped", [0, 0]);
spline3 = interp(x, xp, fn(xp), derivees);
plot(x, spline3);
aaa.color_map(29,:) = [0, 0.6, 0];
eee=gce();
eee.children.foreground = 29;
eee.children.thickness = 2;
eee.children.line_style = 3;

plot(x, fn(x)); // la courbe d'origine
aaa.color_map(30,:) = [1, 0, 0];  // = couleur de la courbe
eee=gce();
eee.children.foreground = 30;
eee.children.thickness = 1;
eee.children.line_style = 1;

// le dernier plot correspond au premier children de  bbb
endfunction

clf();
e0400();


// Polynome de Chebychev
// ss=chepol(4, 'x');  deff('y=fc4(x)', strcat(['y=', pol2str(ss)]))
// ss=chepol(4, 'x');  x=-1:0.1:1;  plot(x, horner(ss,x));

