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