2012-02-05 2 views
0

Как написать выражение в коде Matlab с использованием суммирования переменной, а затем как свести к минимуму выражение? ex. Мне нужно, чтобы минимизировать следующую функциюЗапись выражения суммирования в Matlab

E = \ sum_ {I, J} [C_ {IJ} (r_ {IJ}) + C2_ {IJ} (r_ {IJ})^2]

I необходимо минимизировать приведенное выше выражение для любых значений r_ {ij} s, где i и j меняются.

Я мог бы использовать fmincon() в MATLAB, но я не могу написать свое выражение подходящим образом, чтобы передать его как вход в fmincon().

Спасибо.

ответ

1

Попробуйте это:

E = sum(sum(C.*r + C2.*r.^2)); 

где C, C2 и r матрицы одинаковой формы.

1

fmincon и другие функции оптимизации не требуют от вас писать все как выражение, они также могут оптимизировать функции.

function E = criterion(r, C, C2) 
    e = C.*r + C2.*r.^2; 
    E = sum(e(:)); 

Я не совсем уверен, что синтаксис требуемой fmincon, но я предполагаю, что это что-то вроде E = f(theta), где theta является вектор параметров, которые вы хотите отрегулировать таким образом, что E минимальна. Поскольку я не нахожу, что ваша проблема четко описана, я буду считать, что ваши параметры: C и C2 (в случае, если r - ваши параметры, корпус аналогичен и проще).

Поскольку fmincon использует вектор для хранения коэффициентов, нам нужна функция, которая принимает такой вектор и преобразует его в размеры, необходимые для функции criterion выше.

function E = criterionRolledC(theta,r) 
    assert(numel(theta)==2*numel(r), 'The size of theta has to be twice the size of r'); 
    [M N] = size(r); 
    C = theta(1:M*N);  
    C2 = theta(M*N+1:end); 
    C = reshape(C , M, N); 
    C2 = reshape(C2, M, N); 

    E = criterion(r,C,C2); 

Таким образом, вы можете сделать анонимную функцию, которая легко соответствует интерфейсу оптимизатора: @(theta)(criterionRolledC(theta,rValues)) будет делать, когда в текущем рабочем пространстве переменная rValues содержит ваши r значения.

В случае, если вы хотите прямо противоположное, то есть ваши параметры r, это проще:

function E = criterionRolledR(theta,C,C2) 
    assert(numel(theta)==numel(C), 'The size of theta has to be the same size as C'); 
    assert(all(size(C)==size(C2)), 'C and C2 need to have the same size'); 
    [M N] = size(C); 
    r = reshape(theta, M, N); 

    E = criterion(r,C,C2); 

И вы можете построить анонимную функцию аналогично другой случай.

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