Bonsoir a tous ! Comme indique dans le titre j'ai un petit probleme de contrainte concernant l'optimisation d'une fonction, cette fonction représente l’évolution de l’énergie dégagée par 3 aimants qui flottent dans un bassine circulaire remplie d'eau, leur position d’équilibre est un triangle équilatérale (ils se repoussent simultanément), cette position est stable.
Le but est de trouver cette position d’équilibre en utilisant la fonction fmincon, comme on a trois aimants, on a 3 points a trouves et donc 6 coordonnées (x1,x2,x3,y1,y2,y3).
Mes contraintes décrivent l’équation d'un cercle (la bassine).
Fonction :
et les contraintes non linéaires (c est la contrainte d’inégalité, ceq la contrainte d’inégalité)Code:[ Energie ] = W(X) on note ici y1 = x4 , y2=x5 , y3=x6 R12=sqrt((X(1)-X(2)).^2+(X(4)-X(5)).^2); R23=sqrt((X(2)-X(3)).^2+(X(5)-X(6)).^2); R13=sqrt((X(1)-X(3)).^2+(X(4)-X(6)).^2); Energie=1/R12 + 1/R13 + 1/R23;
Voici le code pour optimiser la fonction :Code:[c,ceq]=constraint(X) % C(X) <= 0 % Ceq(X) = 0 c = [] ; ceq = [X(1).^2 + X(4).^2 -1 ; X(2).^2 + X(5).^2 -1 ; X(3).^2 + X(6).^2 -1];
J'ai aussi fixe la position de l'aimant 1 pour avoir moins de calcul cependant matlab semble bloque et il me donne donc ca au final :Code:n=3; %nombres d'aimants % Position Initiale X0=[0.1;0.2;0.3;0.1;0.2;0.3]; % Minimisation LB = [-1;-1;-1;-1;-1;-1]; UB = [1;1;1;1;1;1]; opts = optimset('Display','iter','Algorithm','interior-point', 'MaxIter', 100000000, 'MaxFunEvals',100000000); [X,fval]=fmincon(@W,X0,[],[],[],[],LB,UB,@constraint,opts); %coordonnees des aimants A1=[X(1);X(4)] A2=[X(2);X(5)] A3=[X(3);X(6)] X(1)=-1; X(4)=0;
Code:No feasible solution found. fmincon stopped because the size of the current step is less than the default value of the step size tolerance but constraints are not satisfied to within the default value of the constraint tolerance. <stopping criteria details> A1 = -1.0000 0.0003 A2 = -0.7628 -0.1556 A3 = -0.3281 -0.3879
ce qui est totalement puisque normalement les position des aimants 2 et 3 devraient être [+/- sqrt(3)/2 ; 0,5 ]
Merci d'avance pour votre aide !
-----