Régression polynomial

cs_LordNoir Messages postés 2 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 28 novembre 2004 - 19 nov. 2004 à 18:05
cs_LordNoir Messages postés 2 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 28 novembre 2004 - 28 nov. 2004 à 00:25
Bonjour, je cherche à faire une régression d'une liste (X,Y) de points (une dizaine en tout). J'aimerais calculer un polynome de la forme:

P(n)= a+ b.n^(1/3)+c.n^(2/3) avec c fixée.

Vous allez rire mais j'étais malade le jour ou l'on a eu ça à faire en cours lorsque j'étais en taupe alors ...

Pour ceux que cela interesse, cela me servirait à ajuster des énergies d'amas (terme de volume en 3/3 nul, terme de surface connu par une construction de Wulff, il ne me reste que le terme d'arrete et de coin à trouver).

D'avance merci.
PS: du c, du c++, du vb, du tout ce que vous voulez, je m'arrangerais.

4 réponses

Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
27 nov. 2004 à 12:58
alors voilà la partie théorique :

Tu cherches à minimiser la distance de la courbe à tes points.
La distance est définie ainsi (en fait, elle est au carré mais ça ne change rien) :
D = Somme sur tous tes points de (Y(i)-P(X(i)))^2
ie D = (Y(1) - (a+b.X(1)^(1/3)+c.X(1)^(2/3)))^2 + ...
Pour trouver le minimum, il suffit donc de prendre la dérivée de cette expression par rapport à chaque inconnue (a et b) et de résoudre en l'égalant à 0. Il y a donc 2 équations à résoudre dans ton cas.

Alors maintenant, soit tu arrives à trouver directement la solution analytique (formule), soit tu fais des itérations en partant d'un choix initial (a0, b0), et tu calcules (a1, b1) par différentes méthodes :

1) Newton généralisé
2) Gradient
3) ...

VB Lover
0
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
27 nov. 2004 à 13:16
après qq petits calculs, voilà ce que j'obtiens :

de tes 2 inconnues (a et b), tu peux facilement calculer a. En posant N le nombre de points (Xi,Yi) que tu as, tu trouves :

a = (1/N) * Somme_i[Yi - b Xi^(1/3) - c Xi^(2/3)]

avec bien sûr Somme_i représentant le symbole Sigma mathématique, allant de 1 à N. Connaissant a en fonction de b, on injecte ce résultat dans la 2è équation, et donc on n'a plus qu'une seule inconnue (b) et une équation du type f(b) = 0 à résoudre. Donc là c'est facile, tu peux utiliser toute les méthodes qui existent pour une seule variable :

1) Newton
2) Bissectrice
3) ...
En posant Xi1 Xi^(1/3) et Xi2 Xi^(2/3), l'équation sur b est donnée par :

0 = Somme_i[Xi1*(Yi-b Xi1-c Xi2- Somme_j[Yj-b Xj1-c Xj2]/N)]

VB Lover
0
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
27 nov. 2004 à 14:26
bon, alors là, je me suis motivé! voilà la solution exacte de ton problème (si je n'ai pas fait trop d'erreurs de calcul...) :

S1 = Somme_i[Xi^(1/3)]
S2 = Somme_i[Xi^(2/3)]
T1 = Somme_i[Xi^(1/3)*Yi - c Xi]
T2 = Somme_i[Yi - c Xi^(2/3)]

D = N*S2-S1*S1

a = (T2*S2-T1*S1)/D
b = (N*T1-T2*S1)/D

Si y'a des erreurs de calculs, il suffit de comprendre le principe de minimisation de la distance et de résoudre les équations. Ici, on peut assez facilement la solution explicite du problème, parce que les inconnues a et b interviennent linéairement dans la fonction.

En fait j'y pense maintenant, c'est la méthode des moindres carrés ce que j'ai expliquée !

VB Lover
0
cs_LordNoir Messages postés 2 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 28 novembre 2004
28 nov. 2004 à 00:25
Oui,
j'ai également cherché de mon côté. j'ai trouvé un cours avec des tds sur le sujet, notamment une feuillle excel que j'ai pu adapter à mon problème.
Ca marche bien et c'est exactement ce que tu as décrit.
Merci bcp.
0
Rejoignez-nous