« Découvrir Scilab/Interpolation, extrapolation et lissage » : différence entre les versions

Contenu supprimé Contenu ajouté
import de Calcul numérique
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Ligne 21 :
 
Pour un interpolation linéaire, on considère une valeur <code>xp</code> arbitraire, ou un vecteur de valeurs, les valeurs de <code>yp</code> correspondantes sont obtenues par
<sourcesyntaxhighlight lang="scilab">
yp = interp1(x, y, xp)
</syntaxhighlight>
</source>
Plutôt que d'avoir les valeurs interpolées, on peut préférer les valeurs les plus proches ; pour cela, on utilise l'option <code>"nearest"</code> :
<sourcesyntaxhighlight lang="scilab">
yp = interp1(x, y, xp, "nearest")
</syntaxhighlight>
</source>
 
On peut aussi utiliser la commande d'interpolation à ''n'' dimensions <code>linear_interpn()</code> :
<sourcesyntaxhighlight lang="scilab">
yp = linear_interpn(xp, x, y)
</syntaxhighlight>
</source>
Si l'on veut faire une ''extrapolation'', c'est-à-dire avoir une valeur hors de l'intervalle [''x''<sub>1</sub>, ''x<sub>n</sub>''], on peut ajouter une option :
* <code>"by_zero"</code> : ''y'' = 0 hors intervalle ;
Ligne 39 :
* <code>"periodic"</code> : si la fonction est supposée périodique, on répète le motif obtenu.
Par exemple :
<sourcesyntaxhighlight lang="scilab">
yp = linear_interpn(xp, x, y, "natural")
</syntaxhighlight>
</source>
 
=== Interpolation par une ''spline'' cubique ===
 
Pour une interpolation par ''spline'' cubique d'Hermite, la fonction d'interpolation est décrite par les coordonnées des points et un vecteur de coefficients <code>d</code> (les dérivées), soit trois vecteurs ( <code>x</code>, <code>y</code>, <code>d</code>). Le vecteur <code>d</code> est obtenu par la commande <code>splin()</code> :
<sourcesyntaxhighlight lang="scilab">
d = splin(x, y)
</syntaxhighlight>
</source>
si l'on a maintenant une valeur <code>xp</code> arbitraire, ou un vecteur de valeurs, les valeurs de <code>yp</code> correspondantes sont obtenues par
<sourcesyntaxhighlight lang="scilab">
yp = interp(xp, x, y, d)
</syntaxhighlight>
</source>
 
=== Lissage ===
Ligne 61 :
 
Scilab propose la commande <code>lsq_splin()</code> qui utilise des ''splines'' cubique comme modèle, déterminées par la méthode des moindres carrés ''(least square)''. Si l'on a deux vecteurs ''x'' et ''y'' de ''m'' valeurs chacun, on choisit ''n'' abscisses ''xs'' pour déterminer la ''spline'', avec dans l'idéal ''n'' &lt;&lt; ''m''. Typiquement :
<sourcesyntaxhighlight lang="scilab">
// ***** Génération des données *****
 
Ligne 84 :
plot(x, y) // données originales
plot(x, yliss, "r") // données lissées
</syntaxhighlight>
</source>
Ainsi, Scilab a construit une ''spline'' cubique passant par les abscisses ''xs'' (en l'occurrence 0, 2π/5, 4π/5, 6π/5, 8π/5 et 2π), et a déterminé les dérivées ''d'' en ces ''n'' points.
 
Si l'on veut éviter des effets de bord, on peut choisir une répartition différente des points de contrôle. On utilise fréquemment une répartition sinusoïdale pour avoir plus de points aux bords qu'au centre (comme pour les [[w:fr:Polynôme de Tchebychev|polynômes de Tchebychev]]).
<sourcesyntaxhighlight lang="scilab">
theta = linspace(-%pi, 0, n); // angles uniformément répartis
xs = mean([x(1), x($)]) + 0.5*(x($) - x(1))*cos(theta);
// abscisse des points de contrôle
</syntaxhighlight>
</source>
Ceci est en particulier important si l'on veut extrapoler, c'est-à-dire calculer des valeurs de ''y'' pour des ''x'' hors des points de mesure.
 
Ligne 102 :
 
On peut aussi effectuer un simple lissage par la méthode des moyennes glissantes en utilisant la fonction <code>convol()</code> (voir [[#Produit de convolution|ci-après]]). Si l'on appelle ''p'' le nombre de points de l'intervalle glissant :
<sourcesyntaxhighlight lang="scilab">
p = 10; // largeur de l'intervalle
 
Ligne 111 :
plot(x, y) // données originales
plot(x, yliss(1+p/2:$-p/2+1), "r") // données lissées
</syntaxhighlight>
</source>
 
== Interpolation d'une surface ==
Ligne 126 :
 
L'interpolation linéaire se fait de la même manière que précédemment : on définit un nouveau couple de valeurs <code>xp</code> et <code>yp</code> (ou un couple de vecteurs défnissant un nouveau quadrillage), et l'on a :
<sourcesyntaxhighlight lang="scilab">
zp = linear_interp(xp, yp, x, y, z)
</syntaxhighlight>
</source>
c'est-à-dire qu'à partir des points (''x'', ''y'', ''z''), on définit les points interpolés (''xp'', ''yp'', ''zp'').
 
Ligne 137 :
* une matrice <code>z</code> de dimension ''m''×''n'', contenant les valeurs correspondante : ''z''<sub>''i'', ''j''</sub> = ƒ(''x<sub>i</sub>'', ''y<sub>j</sub>'').
Et comme dans le plan, la fonction d'interpolation est décrite par (<code>x</code>, <code>y</code>, <code>C</code>), les valeurs coordonnées des points du quadrillage et une matrice de coefficients <code>C</code> obtenue par
<sourcesyntaxhighlight lang="scilab">
C = splin2d(x, y, z)
</syntaxhighlight>
</source>
Si l'on considère un point du plan (<code>xp</code>, <code>yp</code>) (ou un couple de vecteurs défnissant un nouveau quadrillage), les valeurs de ''z'' sur ces nouveaux points sont :
<sourcesyntaxhighlight lang="scilab">
zp = interp2d(xp, yp, x, y, C)
</syntaxhighlight>
</source>
 
=== Interpolation cubique sur un nuage de points dispersés ===
Ligne 154 :
\end{pmatrix}</math>
La fonction d'interpolation est définie par une [[../Structures de données avancées#Structures|liste typée]] T obtenue par
<sourcesyntaxhighlight lang="scilab">
T = cshep2d(M)
</syntaxhighlight>
</source>
Si l'on considère un point du plan (<code>xp</code>, <code>yp</code>) (ou un couple de vecteurs défnissant un nouveau quadrillage), les valeurs de ''z'' sur ces nouveaux points sont :
<sourcesyntaxhighlight lang="scilab">
zp = eval_cshep2d(xp, yp, T)
</syntaxhighlight>
</source>
 
== Notes ==