matlab中带斜率约束的分段线性函数拟合
我试图为我的matlab中带斜率约束的分段线性函数拟合,matlab,Matlab,我试图为我的(扩展数据,ydata)数据拟合分段线性方程。我必须挑战,第一个是如何将方程转换为函数句柄的形式,第二个是如何在斜率上设置约束,例如,a2>a1和a2>0和a1>0 xdata = 5:0.2:40; ydata = max(18,xdata) + 0.5*randn(size(xdata)); a1 = (y1-y0)/(x1-x0); a2 = (y2-y1)/(x2-x1); if x < x1; f(x) = y0 + a1*(x-x0); else f
(扩展数据,ydata)
数据拟合分段线性方程。我必须挑战,第一个是如何将方程转换为函数句柄的形式,第二个是如何在斜率上设置约束,例如,a2>a1
和a2>0
和a1>0
xdata = 5:0.2:40;
ydata = max(18,xdata) + 0.5*randn(size(xdata));
a1 = (y1-y0)/(x1-x0); a2 = (y2-y1)/(x2-x1);
if x < x1;
f(x) = y0 + a1*(x-x0);
else
f(x) = y0 + a1*(x1-x0) + a2*(x-x1);
end
FU = matlabFunction(f)
x0 = 5; y0 = 16;
x = lsqcurvefit(FU,[x0,y0],xdata,ydata)
扩展数据=5:0.2:40;
ydata=最大值(18,扩展数据)+0.5*randn(大小(扩展数据));
a1=(y1-y0)/(x1-x0);a2=(y2-y1)/(x2-x1);
如果x创建分段函数的关键是将
if
条件替换为矢量化的
。通过在某个数组x
上调用y=x>1
,输出y
将是一个与x
大小相同的数组,如果x
中的对应元素大于1,则逻辑True
,否则为False
。比如说
>> x = [1, 2, 4; 3, 1, 2];
>> y = x > 2
y =
2×3 logical array
0 0 1
1 0 0
您可以利用它创建分段线性函数,如下所示:
>> fun = @(theta, xdata) theta(1) + ...
(xdata<=theta(2)) .* theta(3) .* xdata + ...
(xdata>theta(2)) .* (theta(3) * theta(2) + ...
theta(4) .* (xdata-theta(2)))
该函数还允许您为要估计的变量指定下限lb
和上限ub
。对于不希望指定边界的变量,可以使用例如inf
作为边界。为了确保您的a1
和a2
,即theta(3)
和theta(4)
为正,我们可以将下限指定为[-inf,-inf,0,0]
但是,lsqcurvefit
函数不允许添加约束a2>a1
(或任何线性不等式约束)。在示例数据中,此约束甚至可能不是必需的,因为从数据中可以明显看出这一点。否则,可能的解决方案是将a2
替换为a1+da
,并对da
使用0
的下限。这将确保a2>=a1
>> fun = @(theta, xdata) theta(1) + ...
(xdata<=theta(2)) .* theta(3) .* xdata + ...
(xdata>theta(2)) .* (theta(3) * theta(2) + ...
(theta(3)+theta(4)) .* (xdata-theta(2)))
>> theta = lsqcurvefit(fun, [0; 15; 0; 1], xdata, ydata, [-Inf, -Inf, 0, 0], [])
theta =
18.1162
18.1159
0.0000
0.9944
乐趣=@(θ,扩展数据)θ(1)+。。。
(xdatatheta(2)).*(theta(3)*theta(2)+。。。
(θ(3)+θ(4)).*(扩展数据θ(2)))
>>θ=lsqcurvefit(fun[0;15;0;1],扩展数据,ydata,[-Inf,-Inf,0,0],])
西塔=
18.1162
18.1159
0
0.9944
非常感谢您的回答和详尽的解释!
>> fun = @(theta, xdata) theta(1) + ...
(xdata<=theta(2)) .* theta(3) .* xdata + ...
(xdata>theta(2)) .* (theta(3) * theta(2) + ...
(theta(3)+theta(4)) .* (xdata-theta(2)))
>> theta = lsqcurvefit(fun, [0; 15; 0; 1], xdata, ydata, [-Inf, -Inf, 0, 0], [])
theta =
18.1162
18.1159
0.0000
0.9944