Inscription / Connexion Nouveau Sujet
Niveau école ingénieur
Partager :

Courbe d'ajustement hyperbolique

Posté par
Louistomtom
23-10-20 à 12:03

Bonjour à toutes et à tous,

J'ai une expérience qui me donne n points (x_i,y_i).
J'aimerais faire une ajustement par une fonction f telle que :

f(x_i)=\sqrt{a+b\cdot x_i+c\cdot x_i^2}

En notant \Delta tel que :

\Delta = \sum_i\ \left[y_i-f(x_i)\right]^2

Que je dois minimiser par rapport à mes paramètres de fit a,b,c.
Je calcule donc la dérivée et j'obtiens trois systèmes :

\partial_a \Delta = \sum_i\ -1\cdot\dfrac{y_i+f(x_i)}{f(x_i)}
\partial_b \Delta = \sum_i\ -x_i\cdot\dfrac{y_i+f(x_i)}{f(x_i)}
\partial_c \Delta = \sum_i\ -x_i^2\cdot \dfrac{y_i+f(x_i)}{f(x_i)}

La question que je me pose, est ce qu'il existe une méthode "simple" pour résoudre ce truc?
"simple" car je souhaite implémenter ça sous matlab...

Je préviens les matheux, que je ne le suis pas :p donc merci d'avance pour votre indulgence, et bien sûr de votre aide!

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 23-10-20 à 14:09

Bonjour,

Ça serait beaucoup plus simple si tu cherchais à minimiser  \sum_i(y_i^2-f(x_i)^2)^2 : juste un système linéaire à résoudre, aucune difficulté pour matlab.

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 23-10-20 à 16:19

Bonjour,

Merci de votre réactivité tout d'abord.

Mais pourquoi? Ça vient d'où votre proposition?
Est ce que c'est toujours du moindre carré?

Désolé pour ces questions peut-être trop naïves?

Merci encore.

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 23-10-20 à 16:30

E(x,y)=y^2-(cx^2+bx+a) est l'équation de l'hyperbole qu'on cherche à faire passer aussi près que possible des points (x_i,y_i).
Il est donc assez naturel de chercher à minimiser \sum_i E(x_i,y_i)^2. Et l'avantage est que cette minimisation est facile parce que E est linéaire en a,b,c.
Si ça ne te convient pas, pas grave !

Posté par
carpediem
re : Courbe d'ajustement hyperbolique 23-10-20 à 18:39

salut

je me permets d'intervenir en particulier pour savoir si j'ai bien compris ce que propose GBZM (qui peut bien sûr me corriger si j'ai tord ... et j'en serai heureux puisque moins bête au final !!! )

Louistomtom @ 23-10-2020 à 12:03

J'ai une expérience qui me donne n points (x_i,y_i).
J'aimerais faire une ajustement par une fonction f telle que :

f(x_i)=\sqrt{a+b\cdot x_i+c\cdot x_i^2}

En notant \Delta tel que :

\Delta = \sum_i\ \left[y_i-f(x_i)\right]^2
tu proposes de faire un ajustement (par la méthode des moindres carrés) avec une fonction "compliquée"

ce que te propose GBZM c'est de faire le changement de variable \left\lbrace\begin{matrix} X_i = f(x_i)^2\\ Y_i = y_i^2 \end{matrix}\right. pour te ramener à un ajustement linéaire de la série (X_i, Y_i)

l'ajustement linéaire étant simplement Y_i = X_i $ avec $ X_i = ax_i^2 + bx_i + c

et alors la détermination de a, b et c conduit à un système linéaire ...

GBZM : est-ce bien cela ?    merci par avance

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 23-10-20 à 18:46

Plutôt : On essaie de trouver un polynôme du second degré en x pour approcher au mieux les y_i^2 (selon les moindres carrés).

Posté par
carpediem
re : Courbe d'ajustement hyperbolique 23-10-20 à 18:53

ok merci beaucoup ...

et oui l'ajustement (Y_i, x_i) est polynomial (second degré)

mais il n'est pas faux de dire que l'ajustement (Y_i, X_i) est linéaire (??)

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 23-10-20 à 19:02

Qui est X_i ? Si tu l'écris comme fonction de x_i dépendant des paramètres a,b,c que tu cherches à ajuster, ça ne va pas ...
Non, on cherche à avoir y_i^2 à peu près donné par un polynôme du second degré en x_i, et on ajuste les coefficients de ce polynôme selon les moindres carrés.

Posté par
carpediem
re : Courbe d'ajustement hyperbolique 23-10-20 à 19:15

ok d'accord et merci

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 23-10-20 à 22:17

Wow quelle vie sur ce forum! C'est pour ça que je ne m'en passe pas ^_^
Pour en revenir a ce que propose GBZM.

Je ne m'en suis pas rendu compte tout de suite, mais votre suggestion c'est celle que j'ai implémenté en premier mais par erreur! Ou du moins par précipitation dans mes calculs. En effet on a donc ici :

\Delta=\sum_{i=1}^n\ \left[y_i^2-f(x_i)^2\right]^2

Que l'on cherche à minimiser :

\partial_a\ \Delta=0\iff -2\cdot \sum_{i=1}^n\ (y_i^2-f(x_i)^2)=0\iff \sum_{i=1}^n \ y_i^2 = \sum_{i=1}^n\ f(x_i)^2
\partial_b\ \Delta=0\iff \sum_{i=1}^n \ x_i\cdot y_i^2 = \sum_{i=1}^n\ x_i\cdot f(x_i)^2
\partial_c\ \Delta=0\iff \sum_{i=1}^n \ x_i^2\cdot y_i^2 = \sum_{i=1}^n\ x_i^2\cdot f(x_i)^2

Puis en posant :

S_k=\sum_{i=1}^n \ x_i^k

W_k=\sum_{i=1}^n \ x_i^k*y_i^2

J'obtiens le système linéaire :

\bigl(\begin{smallmatrix} n & S_1 & S_2\\ S_1 & S_2 & S_3 \\ S_2 & S_3 & S_4 \end{smallmatrix}\bigr)\cdot\bigl(\begin{smallmatrix} a\\ b \\ c \end{smallmatrix}\bigr)= \bigl(\begin{smallmatrix} W_o\\ W_1 \\ W_2 \end{smallmatrix}\bigr)

qui, en effet, se résout très facilement.
Cependant, entre deux, j'ai découvert une fonction prédéfinie nlinfit qui donne des valeurs de paramètres de fit, à partir d'une condition initiale, et que l'on peut tracer par la suite.
Cette fonction semble donner des résultats un peu meilleurs ( pas forcément flagrant sur les pièces jointes je sais ... )

Ma question est donc la suivante :
Quelle méthode utiliser?
L'une 'fit maison' ( pour la figure ), je connais son fonctionnement, et n'est pas récursive, ( pas d'erreur de consistance car résolution algébrique si je me plante pas? )
L'autre, je connais rien de son fonctionnement sauf le fait qu'elle soit récursive. Mais de temps en temps elle m'indique des erreurs :

Citation :
weighted residuals are not real


n'ayant aucune notion de statistiques, estimateurs etc. je n'ai aucune idée de ce que ça peut bien vouloir dire...

Merci

Courbe d\'ajustement hyperbolique

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 23-10-20 à 22:17

Et voici le résultat donné par la fonction nlinfit pour la même mesure

Courbe d\'ajustement hyperbolique

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 23-10-20 à 22:21

Et finalement, j'ai oublié encore cette question :
J'ai du prendre la racine carrée es valeurs de a,b,c retournées par la méthode "maison" pour pouvoir tracer le fit.
Ça parait intuitif mais je ne sais pas comment l'expliquer proprement?

Encore un grand merci à vous deux!

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 23-10-20 à 23:37

Citation :
J'ai du prendre la racine carrée es valeurs de a,b,c retournées par la méthode "maison" pour pouvoir tracer le fit.

Je ne comprends pas cette histoire.

Autre question : pourquoi penses-tu que la meilleure façon d'approcher est par une fonction du genre x\mapsto \sqrt{a+bx+cx^2} ?

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 24-10-20 à 07:40

Bonjour,

Bon je vous explique le contexte alors :
Je dois quantifier la divergence d'un faisceau laser.
Pour ceci on mesure le diamètre du faisceau durant sa propagation sur 20 [cm].
Étant donné que c'est une caractéristique importante des fasiceaux lasers, une norme ISO a été créée et qui demande d'utiliser une courbe d'ajustement de type hyperbolique.

Sinon de manière générale, la dispersion ( pour le temps ) ou la diffraction ( pour l'espace ) donne une évolution hyperbolique respectivement de la durée d'impulsion et du diamètre du faiscau.
Ci contre un lien d'un cours donné à l'X qui démontre mon affirmation

Quant à la racine, comme je l'ai dit, ça me parait naturel. On ajuste les y_i^2 par f^2, au lieu de y_i par f, donc il y a forcément une histoire de racine, mais je ne sais pas comment le démontrer proprement ( bon j'avoue que je je n'ai pas cherché en profondeur ce point )

sinon, auriez vous une idée par rapport au fait de choisir la méthode de fit?

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 24-10-20 à 12:07

Peux-tu communiquer ton jeu de mesures ?
Les valeurs pour a,b,c que tu affiches dans ton "fit maison" sont visiblement aberrantes.

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 24-10-20 à 12:52

Oui bien sûr, et voilà. Par contre pourquoi aberrantes? Quel est votre critère?

Z,X',Y'
0.00,1271.88,1378.61
20.00,852.02,
40.00,633.44,812.65
50.00,591.60,645.99
60.00,465.27,483.13
80.00,295.70,343.97
90.00,161.01,238.88
100.00,150.81,206.25
110.00,148.12,171.70
120.00,164.85,161.36
130.00,251.97,228.21
140.00,297.53,269.36
150.00,394.00,360.35
160.00,532.36,461.02
180.00,714.10,689.83
190.00,813.83,788.86
200.00,927.00,906.86

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 24-10-20 à 13:14

Et j'en profite pour vous donner mon bout de code.
Bien faire attention, ici les notations du code et de mon énoncé sont différentes :

en abscisses : c'est z_x
en ordonnées : c'est x


%-----------------------------------------------------------------------%
%---------        Remove zeros
%-----------------------------------------------------------------------%
loc_x = [];
loc_y = [];
for k = 1:length(x)
      if x(k)==0
            loc_x = [loc_x k];
      end
      if y(k)==0
            loc_y = [loc_y k];
      end
end
x(loc_x)=[];y(loc_y)=[];

z_x = Import(33:end,1);z_y = Import(33:end,1);

z_x(loc_x)=[];z_y(loc_y)=[];

n_z_x = length(z_x);n_z_y = length(z_y);
%-----------------------------------------------------------------------%
%---------        Fitting
%-----------------------------------------------------------------------%
for k = 1:4
      s(k)=sum(z_x.^k);
end
for k = 1:3
      w(k) = sum(x.^2.*z_x.^k);
end

S = [n_z_x s(1) s(2); s(1) s(2) s(3); s(2) s(3) s(4)]

W = [w(1); w(2); w(3)]

FitCoeff = sqrt(linsolve(S,W));

x_fit = sqrt(FitCoeff(1)+(z_x-Z0X)*FitCoeff(2)+(z_x-Z0X).^2*FitCoeff(3));

M2X_fit = pi/(8*1064)*sqrt(4*FitCoeff(1)*FitCoeff(3)-FitCoeff(2)^2)

%-----------------------------------------------------------------------%
%---------        Plotting
%-----------------------------------------------------------------------%
x_ticks = 0:20:200;
x_min = -1;
x_max = 201;
y_min = 50;
y_max = 1500;

figure
      hold on
            plot(z_x,x_fit,'linewidth',5,'color',[0 0 0])
            scatter(z_x,x,'filled')
            xticks(x_ticks)
            axis([x_min x_max y_min y_max])
            xlabel('z [ mm ]')
            ylabel('X [ um ]')
            leg = legend("fit 'maison'","measure","location","north");
            legend("boxoff")
            title(sprintf("M_X^2 = %.2f",M2X_fit))
            set(gca,'FontSize',20)
            set(leg,'FontSize',20)
            text (50, 1200, "f( x_i ) = ( a + b*x_i + c*x_i^2 )^{1/2}",'fontsize',20);
            text(40,1000,sprintf("a = %.0f",FitCoeff(1)),'fontsize',20);
            text(90,1000,sprintf("b = %.0f",FitCoeff(2)),'fontsize',20);
            text(140,1000,sprintf("c = %.0f",FitCoeff(3)),'fontsize',20);

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 24-10-20 à 14:09

Merci, je regarderai plus tard.

Une chose aberrante : l'abscisse du sommet de la branche d'hyperbole est -b/2c. Avec ton "fit maison", ça donne 0, ce qui est aberrant.
Il y a peut-être des notations différentes, auquel cas c'est un peu dur de s'y retrouver !

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 24-10-20 à 14:57

Ah oui c'est vrai.
Pourtant avec le fit de nlinfit ça correspond bien..

Donc oui le sommet de la parabole est bien obtenu pour -b/(2\cdot a)

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 24-10-20 à 14:59

un lien pour le document ISO donnant la méthode de fitting et les paramètres associés ( si ça peut aider? )

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 24-10-20 à 16:57

Non, -b/2c puisque pour toi le coefficient de x^2 est c.

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 25-10-20 à 22:11

Je vois pourquoi tu recherches un ajustement hyperbolique. C'est en fait les valeurs des paramètres a,b,c qui t'intéressent.

J'ai fait des essais en python (avec numpy et scipy) à partir de tes données.

Trois méthodes
"fit" : la commande curve_fit de scipy.optimize
"fit1" : résolution de système linéaire pour minimiser \sum_i \left(y_i-\dfrac{a}{y_i} -\dfrac{bx_i}{y_i}-\dfrac{cx_i^2}{y_i}\right)^2
"fit2" : résolution de système linéaire pour minimiser \sum_i \left(y_i^2-a-bx_i-cx_i^2\right)^2

La méthode "fit2" est celle que j'avais proposée. Elle donne des résultats catastrophiques (des valeurs négatives de ax^2+bx+c autour de x=110). Je l'ai corrigée  avec la méthode "fit1" en divisant l'écart y_i^2-a-bx_i-cx_i^2 par y_i (à un facteur deux près, la dérivée de y^2-a-bx-cx^2 par rapport à y. Le résultat de "fit1" est alors très voisin de celui de "fit".
La valeur pour x=0 semble assez aberrante ; elle influence "fit2" de façon catastrophique, moins "fit" et "fit1".

Courbe d\'ajustement hyperbolique

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 25-10-20 à 22:12

PS. Je peux donner le code python, si ça t'intéresse. Mais il n'a rien de très excitant.

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 26-10-20 à 10:31

Bonjour GBZM,

Ça marche du feu de Dieu votre nouvelle proposition! Un GRAND merci
Quant au code Python, je me dis que ça peut toujours servir. J'en ai fait dans ma jeunesse mais il faudrait que je m'y remette un jour ^_^

J'en profite pour une nouvelle question liée à tout ça.
Est ce que ça vaut le coup de faire un fit un ensemble de mesures moyennées ou juste sur une seule suffit?

Parce que je repense au fait que vous disiez que le point pour x=0 soit aberrant. En moyennant on peut éluder ce problème non?

La question du moyennage c'est juste que la mesure peut prendre du temps 3/4 minutes et il faudrait faire ça de façon très répétée. Donc en soit c'est pas long, sauf quand ça doit être fait en grande série...

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 26-10-20 à 14:26

Avec plaisir.

Voici le code python. Je ne l'ai pas commenté, mais je pense que tu t'y retrouveras sans peine.

import numpy as np
import matplotlib.pyplot as plt

xdata=np.array([0.,20.,40.,50.,60.,80.,90.,100.,110.,120.,\
   130.,140.,150.,160.,180.,190.,200.])
ydata=np.array([1271.88,852.02,633.44,591.60,465.27,295.70,161.01,150.81,\
   148.12,164.85,251.97,297.53,394.00,532.36,714.10,813.83,927.00])

from scipy.optimize import curve_fit

def func(x, a, b, c):
    return np.sqrt(a+b*x+c*x**2)

popt, pcov = curve_fit(func, x,y)

def S(i,j) :
    return sum(xdata**i*ydata**j)

m=np.array([[S(i+j,-2) for i in range(3)] for j in range(3)])
s=np.array([S(i,0) for i in range(3)])
popt1=np.linalg.solve(m,s)

n=np.array([[S(i+j,0) for i in range(3)] for j in range(3)])
t=np.array([S(i,2) for i in range(3)])
popt2=np.linalg.solve(n,t)

x = np.linspace(0,200)
plt.plot(x, func(x, *popt), '-',\
         label='fit: a=%5.2f, b=%5.2f, c=%5.2f' % tuple(popt))
plt.plot(x, func(x, *popt1), '-',\
         label='fit1: a=%5.2f, b=%5.2f, c=%5.2f' % tuple(popt1))
plt.plot(x, func(x, *popt2), '-',\
         label='fit2: a=%5.2f, b=%5.2f, c=%5.2f' % tuple(popt2))
plt.plot(xdata, ydata, 'o', label='données')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()


Concernant ta question de "plusieurs mesures" : outre le fait de moyenner, on peut aussi pondérer la méthode des moindres carrés par des poids qui sont les inverses des variances des échantillons de y_i correspondant à un même x_i (je suis loin d'être un spécialiste de la question, mais j'ai vu que ça se fait).

Posté par
GBZM
re : Courbe d'ajustement hyperbolique 26-10-20 à 14:28

Une ligne à modifier :

popt, pcov = curve_fit(func, xdata, ydata)

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 26-10-20 à 14:30

Merci beaucoup pour le bout de code.
Oui le python pour le calcul c'est aussi facile à lire que matlab, scilab etc.


Quant à la pondération, merci du tuyau, je vais y jeter un oeil!
Merci encore pour votre implication et à bientôt ( peut-être )

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 06-11-20 à 09:28

Bonjour,

Je ne sais pas si ça se fait trop de déterrer un sujet mais ça m'évite de devoir reposer tout le problème.
J'ai réussi à limiter le nombre de points aberrants en modifiant un peu mon protocole de mesures ( voir figure ).
Le fit se fait donc très bien avec un coefficient de détermination top!

MAIS, la valeur de M^2 qui en sort est totalement aberrante ( M^2<1 ) et ce pour un grand nombre de mesures. Je précise que le laser que je teste là est différent du précédent ( et devrait même être bien meilleure qualité point de vue faisceau ).

Du coup j'ai testé différents trucs à partir des mêmes données pour voir si ça changeait ma valeur de M^2 et ... oui...

1/ retirer les points les plus proches du waist ( sommet de l'hyperbole ) ( figure 2 )
2/ retirer les points les plus loins du waist ( figure 3 )
3/ retirer périodiquement les points ( figure 4 )

De ces résultats j'en déduit que c'est les points proches du sommet qui mettent le bazar dans mes valeurs de M^2 mais à contrario, garder que les points loin du sommet peut me donner des valeurs de M^2 variant du simple au double.

Du coup ma question c'est : auriez vous une idée de à quoi ça peut être dû? La méthode de mesure est bonne à 100% sûr puisque j'ai pu drastiquement réduire les incertitudes ( il suffit de comparer avec la série de points que j'ai pu donner plus haut )

Merci encore!

Courbe d\'ajustement hyperbolique

Courbe d\'ajustement hyperbolique

Courbe d\'ajustement hyperbolique

Posté par
Louistomtom
re : Courbe d'ajustement hyperbolique 06-11-20 à 09:28

Et la dernière image ...

Courbe d\'ajustement hyperbolique



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1674 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !