function NewtonMethod_ponderation_error_parameters

%p est un vecteur de dimension 3x1 contenant les parametres

p(1,1) = 0.8;
p(2,1) = 0.4;
p(3,1) = 0.5;

%F = y - (p(1).*t)./(p(2)+t); -> forme de l'equation a minimiser

%dF1 = -t./(p(2)+t);          -> forme de la premiere derivee en p(1)
%dF2 = p(1)*x./((p(2)+t).^2); -> forme de la seconde derivee en p(2)

%donnees experimentales
t = [0.038 ; 0.194 ; 0.425 ; 0.626 ; 1.253 ; 2.500 ; 3.740];
D = [0.050 ; 0.127 ; 0.094 ; 0.2122 ; 0.2729 ; 0.2665 ; 0.3317];
D = D + 0.57;
 
weight = [0.03 0.02 0.035 0.05 0.04 0.035 0.07];
w = eye(length(t));
w(w~=0) = 1./(weight.^2);

%il y aura 10 iterations
for inc = 1:5
    
    %calcul du Jacobien
    J(1:length(t),1) = -t./(p(2)+t);
    J(1:length(t),2) = p(1)*t./((p(2)+t).^2);
    J(1:length(t),3) = -ones(1,length(t));
    
    %calcul des residus
    F = D-((p(1).*t)./(p(2)+t)+p(3));
    %calcul de la variance
    variance2 = sum(((F.^2).')./(weight.^2))./(length(t)-length(p));
    %calul de la matrice de ponderation
    w = variance2*w;
    %il y a plusieurs maniere de calculer
    %l'incrementation Delta
    Delta = -inv(J.'*w*J)*(J.'*w*F);
    
    %incrementation des parametres
    p = p+Delta;
    w = w/variance2;
    
end

%Deviation standard des parametres
stdp = sqrt(variance2)*diag(sqrt((inv((J.')*w*J))));

%Parametres divises par stdp
p_stdp = p./stdp;

%Calcul de la matrice variance-covariance pour calculer
%la matrice de correlation qui va être affichee à l'écran.
%La matrice est symmetrique et seulement une moitie doit etre calculee.
covmat = sqrt(variance2)*inv(J.'*w*J);                
for inc = 1:3
    for tt = 1:inc
        CorrelationMatrix(inc,tt) = covmat(inc,tt)/sqrt(covmat(inc,inc)*covmat(tt,tt));
    end
end

%calculation de la rmse
rmse = (sum(F.^2)/length(F))^(0.5);

%calcul de la rmse ponderee
rmsew = (sum(diag(w).*(F.^2))/sum(diag(w)))^0.5;

%calcul de l'ecart type (standard deviation)
stdv = (sum(F.^2)/(length(F)-length(p)))^(0.5);

%evalutation des donnees ajustees
ta = 0:0.01:4;
Da = (p(1).*ta)./(p(2)+ta) + p(3);

%affichage des resultats
fprintf('\np1 = %f\np2 = %f\np3 = %f\n\n',p);
fprintf('error_p1 = %f\nerror_p2 = %f\nerror_p3 = %f\n\n',stdp);
fprintf('p1_stdp1 = %f\np2_stdp2 = %f\np3_stdp3 = %f\n\n',p_stdp);
  
fprintf('          p(1)    p(2)    p(3)');
for inc = 1:3
    fprintf('\np(%d)\t', inc);
    for tt = 1:inc
        fprintf(' %4.3f\t',CorrelationMatrix(inc,tt));
    end
end
fprintf('\n\n');

fprintf('rmse = %f\n',rmse);
fprintf('rmsew = %f\n',rmsew);
fprintf('stdv = %f\n\n',stdv);

figure
h = plot(t, D, 'or', ta, Da, 'b');

legend(h, {'Donnees experimentales' 'Meilleur ajustement'}, 'location', 'southeast')

title({'Ajustement avec la methode de Gauss-Newton' 'avec calcul des erreurs sur les parametres'});
xlabel('t');
ylabel('Donnes a ajuster');