2012-06-25 3 views
2

Je veux résoudre le problème d'optimisation suivant:optimisation Convex dans Matlab

sans latex: Étant donné x et mu, trouver

argmin_p || x || p-_2 S.T. || p || _2 < mu.

Latex:

Compte tenu $\mathbf{x}$ et $\mu$, trouver

$\mathrm{argmin}_p \|\mathbf{x}-\mathbf{p}\|_2 \;\; \mathrm{s.t.}\;\;\|\mathbf{p}\|_2 \leq \mu$, 

qui est une fonction convexe sur un ensemble convexe. J'ai utilisé fmincon de Matlab mais c'est trop lent. Les résultats des moteurs de recherche m'ont jusqu'ici apporté du matériel beaucoup plus théorique que ce que je recherche. Je ne peux pas être la première personne à vouloir résoudre ce problème et j'espérais trouver une implémentation de Matlab existante et efficace.

+0

Commentaire précédent révoqué; Je ne sais pas pourquoi j'ai essayé de lire le code LaTeX au lieu du texte en clair ... – bnaul

Répondre

3

cvx peut résoudre ce problème tout simplement. Même si vous n'êtes pas familier avec elle, la syntaxe est assez intuitive:

% test data 
n = 1e4; 
x = randn(n,1); 
mu = 1; 

cvx_begin 
variable p(n) 
minimize norm(x-p) 
subject to 
norm(p) <= mu 
cvx_end 

Sur mon système cela prend moins d'une seconde pour 10^4 variables.

+0

Hey pouvez-vous me dire pourquoi cvx ne permet pas la multiplication vectorielle? Je continue d'obtenir cette erreur: mtimes: seules les formes quadratiques sont autorisées. Y at-il un moyen de contourner ce problème. Parce que j'ai vraiment besoin d'utiliser cvx, ce qui semble résoudre les problèmes assez rapidement. – SPRajagopal

+0

Quel genre de multiplication de vecteur? Le manuel de l'utilisateur répertorie plusieurs options: http://cvxr.com/cvx/cvx_usrguide.pdf. Si vous essayez de faire 'x '* y' vous pouvez utiliser' dot (x, y) ', par exemple. – bnaul

+0

Ouais, j'ai parcouru toute la chose et je comprends que c'est très différent du nonlcon de fmincon. Il ne calcule pas pour une variable d'optimisation spécifique. Il effectue la vérification en conservant les variables en tant que telles. J'avais un vecteur A (x) et B (x). A (x) * B (x) 'est l'endroit où je reçois une erreur, comme je le devrais après avoir lu le manuel. – SPRajagopal