В Matlab вы выполняете числовую оптимизацию. Это означает, что вам не нужно беспокоиться об аналитической форме вашей целевой функции. Вместо этого вам нужно написать целевую функцию, которая с помощью параметров оптимизации создает для каждого значения x
ваших данных значение y
, которое затем можно сравнить с вашими входными данными.
С линейными и нелинейными ограничениями вы можете использовать FMINCON для решения вашей проблемы.
Я не совсем уверен, что понимаю, что вы хотите оптимизировать (извините, это немного рано), но для примера позвольте мне предположить, что у вас есть вектор со значениями x xdata
и вектор с y-значениями ydata
, к которым вы хотите добавить «лестничную функцию». Вы знаете, сколько шагов, но не знаете, где они находятся. Кроме того, вы знаете, что сумма местоположений шагов должна быть 5 (ограничение линейного равенства).
Вы начинаете с написания своей целевой функции, выход которой вы хотите получить как можно ближе к 0. Это может быть возведенная в квадрат сумма невязок (то есть разность между действительными значениями y и оценочными значениями y). Для моего удобства я не буду определять расположение ступеней с помощью линейных уравнений, но вместо этого я установлю их напрямую.
function out = objFun(loc,xdata,ydata)
%#OBJFUN calculates the squared sum of residuals for a stair-step approximation to ydata
%# The stair-step locations are defined in the vector loc
%# create the stairs. Make sure xdata is n-by-1, and loc is 1-by-k
%# bsxfun creates an n-by-k array with 1's in column k wherever x>loc(k)
%# sum sums up the rows
yhat = sum(bsxfun(@gt,xdata(:),loc(:)'),2); %'# SO formatting
%# sum of squares of the residuals
out = sum((ydata(:)-yhat).^2);
Сохраните эту функцию как objFun.m
в вашем пути Matlab. Затем вы определяете xdata
и ydata
(или загружаете его из файла), делаете начальное предположение для loc
(массив k-на-1) и массив Aeq
для ограничения линейного равенства, так что Aeq*loc==beq
(Aeq
равно [1 1 1]
в случае, если у вас есть 3 шага), и напишите
locEst = fmincon(@(u)objFun(u,xdata,ydata),locInitialGuess,[],[],Aeq,5);
Это позволит оценить расположение ступеней. Вместо двух пустых скобок вы можете добавить ограничения неравенства, а 5 - потому что я предположил, что ограничение равенства равно 5.