Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中带斜率约束的分段线性函数拟合_Matlab - Fatal编程技术网

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