function [r, J]=rAndJac(p) a = p(1); mu = p(2); sigma = p(3); e = exp(-(t-mu).^2/sigma^2); f = a*e; r = f-y; J = [e, 2*(t-mu)/sigma^2.*f, 2*(t-mu).^2/sigma^3.*f]; end http_get("https://moodle.utc.fr/mod/resource/view.php?id=109806","dataGaussian.sod",follow=%t); load dataGaussian.sod clf plot(t,y,"o") ITMAX = 1000; TOL = 1e-6; // La valeur de lambda=0 ne permet pas de converger // avec les valeurs initiales [1;1;1]; // Mais avec lambda=0.2 par exemple la méthode // de Levenberg-Marquardt converge. // // L'utilisation des valeurs obtenues avec le "log trick" // permet de prendre lambda=0 (voir l'autre script tdmcpart2_b.sci) p = [1;1;1]; lambda = 0; for k=1:ITMAX [r,J] = rAndJac(p); dp = [J;sqrt(lambda)*eye(3,3)] \ [r; zeros(3,1)]; p = p-dp; if norm(dp) < TOL break end end disp(k) // les valeurs des paramètres "naturels" sont utilisées // pour tracer la gaussienne a = p(1); mu = p(2); sigma = p(3); tt = linspace(-3,9,1000); plot(tt,a*exp(-(tt-mu).^2/sigma^2),"r")