Bonjour à toutes et à tous,
J'ai une expérience qui me donne points .
J'aimerais faire une ajustement par une fonction telle que :
En notant tel que :
Que je dois minimiser par rapport à mes paramètres de fit .
Je calcule donc la dérivée et j'obtiens trois systèmes :
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!
Bonjour,
Ça serait beaucoup plus simple si tu cherchais à minimiser : juste un système linéaire à résoudre, aucune difficulté pour matlab.
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.
est l'équation de l'hyperbole qu'on cherche à faire passer aussi près que possible des points .
Il est donc assez naturel de chercher à minimiser . Et l'avantage est que cette minimisation est facile parce que est linéaire en .
Si ça ne te convient pas, pas grave !
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 !!! )
Plutôt : On essaie de trouver un polynôme du second degré en pour approcher au mieux les (selon les moindres carrés).
ok merci beaucoup ...
et oui l'ajustement est polynomial (second degré)
mais il n'est pas faux de dire que l'ajustement est linéaire (??)
Qui est ? Si tu l'écris comme fonction de dépendant des paramètres que tu cherches à ajuster, ça ne va pas ...
Non, on cherche à avoir à peu près donné par un polynôme du second degré en , et on ajuste les coefficients de ce polynôme selon les moindres carrés.
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 :
Que l'on cherche à minimiser :
Puis en posant :
J'obtiens le système linéaire :
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 :
Et finalement, j'ai oublié encore cette question :
J'ai du prendre la racine carrée es valeurs de 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!
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 par , au lieu de par , 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?
Peux-tu communiquer ton jeu de mesures ?
Les valeurs pour a,b,c que tu affiches dans ton "fit maison" sont visiblement aberrantes.
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
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
en ordonnées : c'est
%-----------------------------------------------------------------------%
%--------- 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);
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 !
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
Je vois pourquoi tu recherches un ajustement hyperbolique. C'est en fait les valeurs des paramètres 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
"fit2" : résolution de système linéaire pour minimiser
La méthode "fit2" est celle que j'avais proposée. Elle donne des résultats catastrophiques (des valeurs négatives de autour de ). Je l'ai corrigée avec la méthode "fit1" en divisant l'écart par (à un facteur deux près, la dérivée de par rapport à . Le résultat de "fit1" est alors très voisin de celui de "fit".
La valeur pour semble assez aberrante ; elle influence "fit2" de façon catastrophique, moins "fit" et "fit1".
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 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...
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()
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 )
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 qui en sort est totalement aberrante ( ) 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 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 mais à contrario, garder que les points loin du sommet peut me donner des valeurs de 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!
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :