### 6.26.34 Les splines naturelles: `spline`

Définition
Soit une subdivision σn de l’intervalle [a,b] :

a=x0, x1, ..., xn=b

On dit que s est une fonction spline de degré l si s est une application de [a,b] dans ℝ vérifiant :

- s admet des dérivées continues jusqu’à l’ordre l−1,
- s restreint à chaque intervalle de la subdivision est un polynôme de degré inférieur ou égal à l.

Théorème
L’ensemble des fonctions splines de degré l sur σn est un ℝ-espace vectoriel de dimension n+l.
En effet :
Sur [a,x1], s est un polynôme A de degré inférieur ou égal à l, donc sur [a,x1], s=A(x)=a0+a1x+...alxl et A est une combinaison linéaire de 1,x,...xl.
Sur [x1,x2], s est un polynôme B de degré inférieur ou égal à l, donc sur [x1,x2], s=B(x)=b0+b1x+...blxl.
Puisque s admet des dérivées continues jusqu’à l’ordre l−1 on doit avoir :

∀ 0 ≤ j ≤ l−1, B(j)(x1)−A(j)(x1)=0

donc B(x)−A(x)=α1(x−x1)l ou encore B(x)=A(x)+α1(x−x1)l.
Soit la fonction :

q1(x) =

⎧
⎨
⎩

0 | sur | [a,x1]
(x−x1)l | sur | [x1,b]

Donc :
s|[a,x2]=a0+a1x+...alxl+α1q1(x).

Sur [x2,x3], s est un polynôme C de degré inférieur ou égal à l, donc sur [x2,x3], s=C(x)=c0+c1x+...clxl.
Puisque s admet des dérivées continues jusqu’à l’ordre l−1 on doit avoir :

∀ 0 ≤ j ≤ l−1, C(j)(x2)−B(j)(x2)=0

donc C(x)−B(x)=α2(x−x2)l ou encore C(x)=B(x)+α2(x−x2)l.
Soit la fonction :

q2(x) =

⎧
⎨
⎩

0 | sur | [a,x2]
(x−x2)l | sur | [x2,b]

Donc : s|[a,x3]=a0+a1x+...alxl+α1q1(x)+α2q2(x)
Et ainsi de suite, on définit les fonctions :

∀ 1 ≤ j ≤ n−1, qj(x) =

⎧
⎨
⎩

0 | sur | [a,xj]
(x−xj)l | sur | [xj,b]

ainsi,
s|[a,b]=a0+a1x+...alxl+α1q1(x)+....+αn−1qn−1(x) et
s est une combinaison linéaire des n+l fonctions indépendantes 1,x,..xl,q1,..qn−1.

Interpolation avec des fonctions splines
On peut demander d’interpoler une fonction f sur σn par une fonction spline s de degré l, ce qui va imposer à s de vérifier s(xk)=yk=f(xk) pour tout 0≥ k≥ n. On a donc n+1 conditions, il reste donc l−1 degrés de liberté. On peut donc encore imposer l−1 conditions supplémentaires qui seront des conditions sur les derivées de s en a et b. Il existe alors trois types d’interpolation (interpolation d’Hermite, interpolation naturelle, interpolation périodique) qui sont obtenues en rajoutant trois types de contraintes. On peut montrer que pour chacun de ces types d’interpolation la solution au problème d’interpolation est unique.

Supposons l impair, l=2m−1, il y a donc 2m−2 degrés de liberté. On rajoute les contraintes suivantes :

- Interpolation d’Hermite

  ∀ 1≤ j≤ m−1, s(j)(a)=f(j)(a), s(j)(b)=f(j)(b)

- Interpolation naturelle

  ∀ m ≤ j ≤ 2m−2, s(j)(a)=s(j)(b)=0

- Interpolation périodique

  ∀ 1≤ j≤ 2m−2, s(j)(a)=s(j)(b)

Supposons l pair, l=2m, il y a donc 2m−1 degrés de liberté. On rajoute les contraintes suivantes :

- Interpolation d’Hermite

  ∀ 1≤ j≤ m−1, s(j)(a)=f(j)(a), s(j)(b)=f(j)(b)

  et

  s(m)(a)=f(m)(a)

- Interpolation naturelle

  ∀ m ≤ j ≤ 2m−2, s(j)(a)=s(j)(b)=0

  et

  s(2m−1)(a)=0

- Interpolation périodique

  ∀ 1≤ j≤ 2m−1, s(j)(a)=s(j)(b)

Une spline naturelle de degré donné passant par des points donnés est une fonction spline vérifiant l’interpolation naturelle.

L’instruction `spline` calcule une spline naturelle de degré donné passant par des points dont les listes des abscisses par ordre croissant et des ordonnées sont passées en argument. Elle renvoie la fonction spline sous forme d’une liste de polynômes, chaque polynôme étant valide dans un intervalle. On donne dans l’ordre croissant la liste des abscisses, la liste des ordonnées, le nom de variables souhaité pour les polynômes et le degré.

Par exemple, on veut une spline naturelle de degré 3, passant par les points x0=0,y0=1, x1=1,y1=3 et x2=2, y2=0, on tape :

`spline([0,1,2],[1,3,0],x,3)`

On obtient une liste de deux polynômes fonction de x :

[ −5*x3/4+13*x/4+1, 5*(x−1)3/4−15*(x−1)2/4+(x−1)/−2+3 ]

valables respectivement sur les intervalles [0,1] et [1,2].

Par exemple, on veut une spline naturelle de degré 4, passant par les points x0=0,y0=1, x1=1,y1=3, x2=2, y2=0 et x3=3, y3=−1, on tape :

`spline([0,1,2,3],[1,3,0,-1],x,4)`

On obtient une liste de trois polynômes fonction de x :

[(−62*x4+304*x)/121+1,

(201*(x−1)4−248*(x−1)3−372*(x−1)2+56*(x−1))/121+3,

(−139*(x−2)4+556*(x−2)3+90*(x−2)2+−628*(x−2))/121]

valables respectivement sur les intervalles [0,1], [1,2] et [2,3].

Par exemple, pour avoir l’interpolation naturelle de cos sur [0,π/2,3π/2], on tape :

`spline([0,pi/2,3*pi/2],cos([0,pi/2,3*pi/2]),x,3)`

On obtient :

[((3π3+(−7π2)x+4x3)1/3)/(π3),

((15π3+(−46π2)*+36π x2−8x3)1/12)/(π3)]