2017-09-14 6 views
1

Merci d'avoir lu ceci, j'ai une fonction matlab 'myfun' qui retourne un scalaire pour un vecteur d'entrée X. Maintenant, j'essaie de minimiser cette fonction en utilisant fmincon mais j'ai des difficultés à contraindre mon vecteur de sortie éléments.MATLAB fmincon éléments vectoriels contraignants

X0=1:1:10; 

fhandle = @myfun; 

lb=X0(1)*ones(length(X0),1); 
ub=X0(end)*ones(length(X0),1); 

[X]=fmincon(fhandle,X0,[],[],[],[],lb,ub); 

Tout d'abord, les éléments ne peuvent pas être plus petite que X0 (1) ou plus grande que X0 (fin). Jusqu'ici tout va bien, je pense, mais j'ai deux autres contraintes pour mon vecteur de sortie que je ne trouve pas de solution pour chercher les questions ici. Le premier étant

X(1)=X0(1) 
and 
X(end)=X0(end) 

Les premiers et derniers éléments doivent donc être définis comme des constantes.

Ma dernière contrainte a à voir avec la variation de valeur de l'élément i à i + 1, il doit être limité à une certaine valeur A et élément i doit toujours être inférieur ou equall à l'élément i + 1

X(i)<=X(i+1) 
X(i+1)-X(i)<=E 

Un exemple de sortie X avec les entrées suivantes X0 et A serait

X0=1:1:10; 
E=3; 

X=[1 1.1 1.2 1.4 1.7 2.0 2.7 4.7 7 10] 

Si quelqu'un a des conseils sur les parties/fonctions de fmincon ou d'autres fonctions de minimisation dans Matlab d'utiliser, très apprécié!

PS: Comme je l'ai lu le post complet à nouveau je me rends compte que mes 2 contraintes que je suis à la recherche impliquera la première

Répondre

1

Votre question se compose de deux parties:

  1. Application égalité les contraintes sur les variables de conception:

    Définissez la borne inférieure et supérieure à la même valeur:

    ub(1) = lb(1) 
    lb(end) = ub(end); 
    
  2. Appliquer des contraintes d'inégalité (X(i+1)-X(i)<=E):

    Reformuler vos équations sous la forme matricielle suivante:

    A*X <= B 
    

    avec

    A = zeros(9, 10); 
    A(:, 1:9) = -eye(9) 
    A(:, 2:10) = A(:, 2:10) + eye(9) 
    
    B = ones(9, 1)*E; 
    

Ensuite, vous pouvez appeler fmincon comme suit:

[X]=fmincon(fhandle,X0,A,B,[],[],lb,ub); 
+0

Merci beaucoup pour votre commentaire, je n'ai pas fini de tester la contrainte d'inégalité car elle continue d'essayer d'ajuster les valeurs de x0 (1) et x0 (fin) tout en optimisant, j'ai mis à jour mon code – Alex

+0

, pour une raison quelconque, Matlab essaye d'ajuster les limites à la première itération, mais tient les contraintes après la première. Merci pour votre temps, tout semble fonctionner! – Alex