在 Matlab 中,您进行数值优化。这意味着您不必担心目标函数的分析形式。相反,您需要编写一个目标函数,该函数使用优化参数为x
数据的每个值创建一个y
-value,然后您可以将其与输入数据进行比较。
通过线性和非线性约束,您可以使用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
和(或从文件中加载它),对(k×1数组)和线性等式约束的数组进行ydata
初始猜测,这样(如果你有3个步骤),然后写loc
Aeq
Aeq*loc==beq
Aeq
[1 1 1]
locEst = fmincon(@(u)objFun(u,xdata,ydata),locInitialGuess,[],[],Aeq,5);
这将估计步骤的位置。您可以添加不等式约束,而不是两个空括号,而 5 是因为我假设等式约束的计算结果为 5。