equation d'une courbe à partir de points

(Cliquez-ici pour accéder à la version originale de cette discussion avec couleurs et images)







Posted by: pat62

je voudrais trouver l'equation de la courbe qui passe par les points suivants :
y x
0,823388267 310,1570681
0,736164933 309,3193717
0,593750558 304,8167539
0,528555892 292,9842932
0,5053669 278,0104712
0,4635761 219,895288
0,4 0

A l'aide d'une fonction polynomiale d'ordre 6 j'obtient une courbe qui passe par les 7 points. Par contre, si je prends une valeur de x qui n'est pas dans ce tableau j'obtient une valeur de y complétement fausse.
J'ai essayé avec les courbes de tendance d'excel mais cela ne donne rien de précis.
Existe-t-il un logiciel ou une méthode pour trouver cette équation ?
Je précise que les points proviennent de mesures.
Merci d'avance pour votre aide



Posted by: Chimomo

Tu dit que si tu prends y en dehors de ces points tu obtiens des valeurs de x fausses, as-tu donc d'autres valeurs de x ???



Posted by: pat62

non je n'ai pas d'autres points mais j'ai retracé la courbe avec la fonction polynomiale d'ordre 6 qui passe par tous les points du tableau mais la courbe présente des max et min qui n'ont à rien à voir avec la courbe réelle.



Posted by: Chimomo

Quelle est cette courne réelle dont tu parles ?

Tu as plus de données que ut ne nous en donne. Tu cherches donc à approcher une courbe et pas à relier un nuage de point ? Le problème n'est pas le même.



Posted by: nox

sinon matlab permet d'interpôler (ou scilab)



Posted by: pat62

le tableau correspond à des mesures que j'ai effectué sur un systéme.
A partir de ces points, j'ai tracé la courbe avec excel (nuage de points+lissage). L'allure que j'obtiens correspond à celle théorique donné dans des bouquins.
Maintenant j'ai besoin de l'équation de cette courbe pour l'utiliser toujours sur excel dans d'autres calculs.



Posted by: Chimomo

Donc tu cherches l'approximation d'une courbe plus qu'une simple interpooation.

Je ne m'y connais pas trop mais tu peux essayer des interpolations avec plus de poitns (tirés de ta courbe excel). En faisant des essais en augmentant le degré du polynôme interpolateur tu pourras peut être parvenir à quelque chose.



Posted by: nox

le problème c'est que là tu n'as pas assez de points car le polynôme d'interpôlation devra être d'un degré assez élevé (d'après l'allure de la courbe donnée par les points...).

(exemple : entre 219 et 278 c'est censé être linéaire? le lissage te donne une droite pour cette partie?)



Posted by: pat62

j'ai rajouté des points dans la 1ére partie et j'arrive à une fct d'ordre 10.
Mais j'ai toujours le même probleme, par exemple pour x = 200 (valeur hors tableau de mesures), j'obtiens - 11 avec la fct d'ordre 10 ?? alors que ma valeur max est de 0,82.
il faudrait sans doute une autre forme d'equation mais laquelle ? Quelqu'un à une idée ?



Posted by: buzard

Salut,

ton probleme c'est les effet de bord (phénomène de Runge), l'interpolation de lagrange n'est pas stable aux bords des intervalles que tu considère. Pour te rapprocher au maximum, de ta fonction réelle, essaye des mesures avec des points de tchebytchev (ou chebyschev, au choix de toute facon c'est une approximation
pour info les points de subdivision de chebyschev sur [0,1] sont :
\large c_k = \cos\frac{(2k-1)\pi}{2n}

Mais attention tu ne sera plus prés qu'à l'interieur de l'intervalle [min xi, max xi]. L'interpolation de lagrange, c'est pour de l'interpolation et ca supporte tres mal l'extrapolation.
Tu peut pour cela t'interresser à l'approximation, plutot qu' l'interpolation. Ainsi tu peut chercher une fonction simple (polynomes par exemple) qui se rapproche le mieux des points de mesures (au sens des moindres carrés)

Pour ton cas, on va chercher à approcher ta fonction par un polynome de degree 5 (au dela on retombe sur une interpolation )
\large f(x) \approx \Bigsum_{i=1}^5{\alpha_i x^{i-1}}
comme ta mesure en x=0, n'a pas l'aire sérieuse (trop loin des autres) il faut pondérer l'erreur à minimiser :
\large J(\alpha_1,\ldots,\alpha_5) = \Bigsum_{k=1}^7{\omega_k \left(y_k-\Bigsum_{i=1}^5{\alpha _i x_k^{i-1}}\right)^2}
attention il y les indice i=1..5 des fonction approximante,
et k=1..7 de l'echantillon de mesure.

en notant \Omega = \left[\begin{array}{cccc}<br />
1&amp; &amp; &amp;\\<br />
&amp; \ddots &amp; &amp;\\<br />
&amp; &amp; 1 &amp;\\<br />
&amp; &amp; &amp; \omega<br />
\end{array}\right] la matrice des poids, et A=\left(x_k^{i-1}\right)_{k=1\ldots7,i=1\ldots5} la matrice 7x5 de la base d'echantillon alors on a les alpha en résolvant le système suivant :
\large A^\top\Omega A\alpha=A^\top\Omega y
Tu peut fixer w suivant la fiabilité de la dernière mesure, ou le laisser en parametre, ainsi tu aura une famille d'approximation parmis lesquels tu peut choisir celle que tu prefère.

Une base de polynome n'est pas forcément le meilleur choix tu peut essayer avec d'autre fonction. Pour le poids, le mieux c'est de prendre l'inverse de la variance si tu as des erreurs de mesure.

Le mieux pour ce genre de calcul c'est scilab (ou maple pour les calculs formelle)
sinon avec une feuille excel ca se fait aussi (c'est plus long mais ce se fait), tu peut utiliser le module d'optimisation pour minimiser le critère (ca s'appelle solver en anglais, et c'est un add-ins) il n'est pas selectionné par défaut



Posted by: pat62

je confirme Buzard que le point à 0 n'est pas précis car je ne peux mesurer cette valeur.
En tant que physicien, j'ai qq pb avec ce genre de calcul.
J'ai telecharge scilab, j'espére que cela pourra m'aider.
Merci pour ton aide.



Posted by: buzard

Scilab est vraiment pratique on peut quasiment tout faire. Il est un peu dure à prendre en main au début, mais si tu connais matlab tu sera pas depaysé.

sinon pour ton approximation les fonctions utils seront:
linsolve(A,b)
vandermonde(v)

pour t'aider à aller plus vite voilà ce que tu peut faire :

Code:
//on rentre les données de l'echantillon //attention on veut des vecteurs colonnes t=[...]' y=[...]' m=size(t,1) // on recupere la taille de l'echantillon n=... // le nombre de parametre qu'on fais varier (d°polynome-1) V=vandermonde(t) A=V(:,1:n) // on ne prend que les n colonnes qui nous interresse //pour de l'interpolation au choix // la fonction qui fait tout (ouai) beta_1 = linsolve(V,y) //ou le calcul explicite (beurk) beta_2 = inv(V)*y // inv(V) plutot que V^-1 car c'est plus rapide // il diagonalise la matrice et pour une simple inversion ca sert à rien //pour l'approximation des moindres carrés //le calcul explicite (beurk) alpha_2 = inv(A'*A)*A'*y //la fonction de scilab (ouai) //simplement alpha_0 = linsolve(A'*A, A'*y) //ou plus subtile //on définie d'abord la fonction de R^n->R^m qu'on cherche a minimiser function e = f(u) e=A*u-y //le vecteur des ecarts entre le modele et les mesures end uo = zeros(1::n) //une valeur initiale alpha_1 = leastsqr(f, uo)


et voila le tour est jouer, bon apres y'a plusieurs methodes de résolution (le gradient conjugué,...), tu peut egalement calculer le jacobien pour aider les calculs, surtout dans le cas de modèle non linéaire.
Le dernier cas (leastsqr) te permettra d'utiliser d'autre modèle non forcément linéaire. (il suffit de remplacer l'ecart par 'g(u,t)-y'

essaye avec : \large g(\lambda,t) = \frac{\lambda_1}{(\lambda_2-t)^{\lambda_4}} + \lambda_3
Je pense que tu sera pas decu.

si t'a des problème n'hesite pas à consulter l'aide de scilab (celle en ligne). Elle est en anglais mais bourré d'exemple complets. Et pose des question si tu n'y arrive toujours pas

pour les polynomes j'obtiens ca c'est pas joli :
http://img361.imageshack.us/img361/...92350ug8.th.gif



Posted by: nox

eh oui...j'avais le meme résultat (matlab il suffit de plotter et puis dans la fenetre graphique -> tools -> basic fitting ^^) donc on manque de points dans notre cas. On ne pourra pas avoir un truc joli.

Mais bon tu m'as dit que tu avais plus de points que nous...donc y a plus qu'a ^^



Posted by: buzard

je me suis trompé vandermonde n'existe pas, mais c'est pas grave, on l'obtient en faisant:
Code:
function [v] = vandermonde(x) n = size(x,1) v = (x*ones(1,n)).^(ones(n,1)*(0:n-1)) endfunction


sinon le modèle non linéaire que je t'ai montré à la fin s'ajuste trés bien. J'obtient comme fonction approchante :

\Large \tilde{f}(t) = \frac{0.0002044}{(0.7905573-t)^{1.7661427}}+0.4820013

ah j'oubliais, j'ai ramener l'echelle sur les t en divisant par 400, ainsi on voit mieux les variations relatives.

et on a le graphique :
http://img309.imageshack.us/img309/...01909vn6.th.gif











-