2016-10-02 13 views
0

Supposons que j'ai une fonction fmincon. Comme nous le savons grâce à la documentation matlab, nous pouvons imposer des contraintes linéaires et non linéaires. Supposons maintenant que j'ai une fonction de 3 paramètres pour optimiser. Et je veux que 3 d'entre eux soient plus grands que 0 et 1 d'entre eux soit supérieur à -1 J'aurais besoin de 4 contraintes mais j'ai une erreur.fmincon - trop de contraintes - MATLAB

Exemple simple (code de fonction):

A=eye(4) 
A(4,4)=-1; 
b=100*ones(4,1) 
b(4,1)=+1 
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2+x(3); 
fmincon(fun,[0,0,0],A,b) 

L'erreur est

erreur en utilisant fmincon (ligne 287) A doit avoir trois colonne (s).

Il est étrange que A ne peut avoir n contraintes (que vous pouvez ajouter à la non linéaire)

Merci

+2

S'il vous plaît nous donner le message d'erreur exact que vous obtenez et aussi la «taille» des paramètres vous passez à 'fmincon'. – Lumen

+0

J'ai ajouté un exemple simple –

+0

YNotre estimation de départ a trois éléments, mais la matrice A s'attend à fonctionner sur un 4 elt. Vous avez peut-être voulu créer une matrice 4x3 (qui sera 4 contraintes d'inégalité) –

Répondre

1

Votre fonction fun attend exactement trois entrées, c'est-à-dire que le vecteur x sera toujours 3x1. Donc, votre point de départ doit être un vecteur 3x1, pas 4x1. La fonction fmincon vous permet de spécifier tout nombre de contraintes linéaires de la forme Ax ≤ b. Ici, le Ax est un matrix multiplication: chaque colonne A correspond à l'une des dimensions de x, donc A doit avoir exactement trois colonnes. Le nombre de lignes peut être n'importe quel nombre arbitraire - bien sûr, b devra avoir la même dimension!

Petit exemple: si vous avez l'inégalité 3*x + 4*y - z ≤ 1, la première ligne de A est [3, 4, -1]. Et la première entrée de b est 1. Maintenant, créons une contrainte supplémentaire, par ex. y ≤ 4, donc vous devez ajouter une ligne [0, 1, 0] à A et 4 à b. Vos matrices sont

A = [3, 4, -1; 
    0, 1, 0]; 
b = [1; 4]; 

Dans votre cas, vous voulez plus de conditions que de variables. Vous pouvez le faire en appelant eye avec deux paramètres: nombre de lignes et le nombre de colonnes:

>> A = eye(4, 3); 
A = 
    1  0  0 
    0  1  0 
    0  0  1 
    0  0  0 

et ajouter manuellement la dernière contrainte:

A(4,:) = [0, 0, -1]; 

Pour mettre en œuvre la contrainte, que tous les paramètres doivent être supérieur à 0, et z doit être inférieur à 1, vous pouvez créer vos matrices comme suit:

A = -eye(4, 3); 
A(4,:) = [0, 0, 1]; 
b = [zeros(3,1); 1]; 

-à-direles équations sont:

-1 * x ≤ 0, ce qui équivaut à x ≥ 0
-1 * y ≤ 0, ce qui équivaut à y ≥ 0
-1 * z ≤ 0, ce qui équivaut à z ≥ 0
z ≤ 1

maintenant, vous pouvez utiliser fmincon:

>>fmincon(fun, zeros(3,1), A, b); 
ans = 
    1.0000 
    1.0000 
    0.0000 
+0

Pourquoi dois-je donner nécessairement 4 points de départ? sinon, il ne fonctionne pas –

+0

Non, * très * important: ne donne * pas * 4 points de départ! Comme votre fonction attend 3 paramètres, donnez 3 points de départ - comme dans le dernier exemple de ma réponse. L'erreur était dans votre matrice 'A': elle avait 4 colonnes au lieu de 3 colonnes. Comme expliqué dans ma réponse, le nombre de colonnes doit toujours être le même que le nombre de paramètres, c'est-à-dire 3. – hbaderts

1

au lieu de traiter les deux contraintes absolues que 4 linéaire séparée contraint pourquoi ne pas les traiter comme 2 contraintes non linéaires spécifiquement. x^2 < 9?

+0

Bonne idée. Pouvez-vous ajouter un exemple à votre question, où vous montrez comment faire cela? – hbaderts

+0

Je pensais à ça mais c'était bizarre à mon avis qu'il n'était pas possible de le résoudre avec des contraintes linéaires! Et j'étais courageux à ce sujet –