Запись выражения суммирования в Matlab - PullRequest
0 голосов
/ 05 февраля 2012

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

E = \ sum_ {i, j} [C_ {ij} (r_ {ij}) + C2_ {ij} (r_ {ij}) ^ 2]

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

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

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);

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

1 голос
/ 05 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...