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);
И вы можете построить анонимную функцию аналогично другой случай.