2012-06-25 3 views
2

Я хочу, чтобы решить следующую задачу оптимизации:оптимизация Выпуклой в Matlab

Non-Latex: Учитывая й и мю, найти

argmin_p || х-р || _2 S.T. || p || _2 < mu.

Latex:

Учитывая $\mathbf{x}$ и $\mu$, найти

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

который является выпуклой функции на выпуклом множестве. Я использую Matlab's fmincon, но он слишком медленный. Результаты поисковой системы до сих пор приводили мне материал, который гораздо более теоретический, чем то, что я ищу. Я не могу быть первым, кто хочет решить эту проблему, и надеялся найти существующую и эффективную реализацию Matlab.

+0

Предыдущий комментарий revoked; dunno почему я попытался прочитать код LaTeX вместо открытого текста ... – bnaul

ответ

3

cvx может справиться с этой проблемой довольно просто. Даже если вы не знакомы с этим, синтаксис довольно интуитивно:

% 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 

В моей системе это занимает около секунды для 10^4 переменных.

+0

Эй вы можете сказать мне, почему cvx не разрешает векторное умножение? Я продолжаю получать эту ошибку: mtimes: разрешены только квадратичные формы. Есть ли способ обойти эту проблему. Потому что мне действительно нужно использовать cvx, который, кажется, быстро решает проблемы. – SPRajagopal

+0

Какое векторное умножение? В руководстве пользователя перечислены несколько параметров: http://cvxr.com/cvx/cvx_usrguide.pdf. Если вы пытаетесь сделать 'x '* y', вы можете использовать' dot (x, y) ', например. – bnaul

+0

Да, я прошел через все это, и я понимаю, что это очень отличается от nonlcon в fmincon. Он не вычисляет для конкретной переменной оптимизации. Он выполняет проверку, сохраняя переменные как таковые. У меня был вектор A (x) и B (x). A (x) * B (x) ', где я получаю ошибку, как я ожидал бы после прочтения руководства. – SPRajagopal

Смежные вопросы