Deux petits soucis sous matlab:
°Comment déclarer des variables a et b sans lui donner de valeur.. est ce que 'global' ça marche? J'ai une longue liste de calculs dans laquelle j'ai besoin d'introduire ce a et ce b avant de la résoudre à la fin.
°dans cette liste, je dois effectuer des régressions linéaire sou polynomiale en utilisant la méthode de Williamson(1968).Je cherche donc à trouver les valeurs de a et b pour que cette somme soit minimale. Quelle commande dois-je utiliser? je ne trouve pas de solve..
Voilà. Je vous remercie d'avance pour vos réponses et je suis à votre dispoition si vous avez besion de plus de détails sur ce projet.
Recherche du minimum sous matlab / des infos en plus pour qu'on m'aide
Voici la partie de mon code qui me pose toujours problème=
xdata=W;
ydata=zeros(1,1)';
for i=1:n
fun=@(x,xdata)sum(xdata(i,2)*( (xdata(i,2)*xdata(i,1)+xdata(i ,4)*x(2)*(xdata(i,3)-x(1)))/(xdata(i,2)+xdata(i,3)*x(2)^2)-xdata(i,1)).^2+(xdata(i,4)*(x( 1)+x(2)*xdata(i,1)-xdata(i,3)).^2));
end
[x]=lsqcurvefit(fun,[a0 b0],xdata,ydata)
où W est une matrice de n lignes et quatres colones. la somme que je tente de réduire est fun , elle est toujours strictement positive c'est pourquoi je tente de la réduire à 0 (il n'y arrive jamais, c'est au moins ça pour moi ).
est ce que quelqu'un voit ce qui ne vas pas....? Les coefficients que je trouve sont radicalement différents de ce que je dois trouver.
Un stagiaire pls qu'en galère,...
20/02/2007 - 12h54
stagiaireengalere
Date d'inscription
février 2007
Messages
17
Re : Recherche du minimum sous matlab
Salut à vous,
Alors j'avance peu à peu dans ce problème mais je suis bloquer à ce stade. L'optimisation est faite mais les coefficients trouvés ne sont pas bon à 10^-2 près, ce qui n'est pas une marge acceptable pour ce problème.
J'ajoute mon code si vous voyez ce qui ne va pas, faites moi signe s'il vous plait.
%Monte Carlo Minimisation somme de Williamson (Cas des droites)%
%Importation des données sous la forme X,Y,u²(X),u²(Y)%
D=load('D.txt');
[n,m]=size(D);
%Moindre carré ordinaire%
O=zeros(1,2);
for i=1:1
gen=polyfit(D(:,1),D(:,2),1);
O=[O;gen];
end
O(1,=[];
b0=O(1,1)
a0=O(1,2)
%Création de la matrice des poids%
W=zeros(1,4);
for i=1:n
W=[W; (D(i,1)) (1/D(i,3)) (D(i,2)) (1/D(i,4))];
end
W(1,=[];
%Génération des 2000xN couples de points suivant la loi normale et
%traitement des matrices%
E=zeros(1,2000);
F=zeros(1,2000);
for i=1:n
randn('state', 0);
gen= randn(2000,1);
gen=gen';
E=[E;(gen*sqrt(D(i,3))+D(i,1))];
F=[F;(gen*sqrt(D(i,4))+D(i,2))];
end
G=E';
H=F';
G(:,1)=[];
H(:,1)=[];
%Minimisation de la somme de Williamson%
x0=[a0;b0]
xdata=W;
anana = @(x)cumsum(xdata(i,2)*((((xdat a(i,2)*xdata(i,1)+xdata(i,4)*x (2)*(xdata(i,3)-x(1)))/(xdata(i,2)+xdata(i,4)*x(2)^2) )-xdata(i,1))).^2+xdata(i,4)*((( x(1)+x(2)*((xdata(i,2)*xdata(i ,1)+xdata(i,4)*x(2)*(xdata(i,3 )-x(1)))/(xdata(i,2)+xdata(i,4)*x(2)^2) ))-xdata(i,3)).^2));
options = optimset('MaxFunEvals',1000000 0);
[x,fval] = fminsearch(anana, x0,options)
à vous, avec une lueure d'espoir.
21/02/2007 - 16h40
pat7111
Date d'inscription
décembre 2005
Localisation
Region parisienne
Âge
39
Messages
1 071
Re : Recherche du minimum sous matlab
Envoyé par stagiaireengalere
L'optimisation est faite mais les coefficients trouvés ne sont pas bon à 10^-2 près, ce qui n'est pas une marge acceptable pour ce problème.
Quel est le problème alors finalement ?...
En attendant, quelques petites remarques sur l'optimisation avec Matlab :
- tu as dû voir dans la toolbox Optimisation qu'il y a plusieurs fonctions de minimisation. fminunc, fmincon entre autres adaptent leur algo aux valeurs courantes du gradient, du hessien etc... Si tu sais exprimer analytiquement ces grandeurs, tu peux l'aider en les lui donnant.
- si ton y=f(a, b) est trop plat, il se peut qu'il ait du mal à converger.
- si ta fonction n'est pas convexe, il est fort possible que ça converge vers un minimum local qui n'est pas le minimum global. Si tu as une idée grossière de la réponse, tu limites les risques en initialisant au plus près
Plutôt appliquer son intelligence à des conneries que sa connerie à des choses intelligentes...
22/02/2007 - 08h02
stagiaireengalere
Date d'inscription
février 2007
Messages
17
Re : Recherche du minimum sous matlab
Salut à toi,
Les coefficient a, pente de ma droite de régression doit valoir 1.7125. Est ce que ce n'est pas trop plat? J'initialise à 1.6403, coefficient donné par une régression standart.
La somme de Williamson est ,dans le cas d'une régression linéaire, un polynome du second degré dont le min est vraisemblablement unique (polynome strictement positif).
Je me demande si mon erreur ne vient pas de l'utilisation de la fonction "sum" (fais t'il la somme sur i? prend il les valeurs des scalaires xdata(i,1 ou 2 ou 3 ou 4) ou les considère t'il comme des colonnes?).
Quoi qu'il en soit je vais retouner voir cette Toolbox Optimisation en essayant les fonctions que tu me proposes.
Merci à toi, et si tu as les réponses aux questions ci dessus n'hésites pas.
Je suis officielement désespérée. J'ai essayé toutes les fonctions de la Toolbox optimization mais à mon grand malheur :
J'ai trouvé la bonne pente à 2 10^-4 près
Mais l'ordonnée à l'origine à une erreur de 20% (ecart de 5).