用MATLAB分段拟合线性曲线拟合

时间:2014-02-21 15:58:26

标签: matlab mathematical-optimization curve-fitting least-squares

在我的实验中,我需要用n个线性段来近似或拟合测量y = f_m(x)。 n的值可以选择为1,2,3,4,5 ......并且可能小于10.为了清楚起见,如果可以比较不同情况下的误差以找到具有最小误差的误差,则是好的。

我找到了一个使用MATLAB(link)的例子:

% Random data...
xdata = linspace(-2,3,101);
ydata = log(abs(10./(10+1i*10.^xdata))) + 0.5*randn(size(xdata));
plot(xdata,ydata)
F = @(B,xdata) min(B(1),B(2)+B(3)*xdata);   %Form of the equation
IC = [max(ydata) max(ydata) 0]; %Initial guess
B = lsqcurvefit( F,IC,xdata,ydata,[min(ydata) -inf -inf],[max(xdata) inf 0]);
hold all;
plot(xdata,F(B,xdata));
a = (B(1) - B(2)) / B(3)
cte = B(1)
c = B(2)
d = B(3)

这与我在2段的情况下所寻找的类似。我试图通过更改函数句柄来修改此函数以满足我的需要:

F = @(B,xdata) min(B(1),B(2)+B(3)*xdata);   %Form of the equation

F = @(B,xdata) min(B(1)+B(2)*xdata,B(3)+B(4)*xdata);

但似乎我的修改导致同一行上有2个段。

我对MATLAB函数句柄了解不多。特别是在这里,它有“min”功能。此外,我该怎么做才能将这个例子扩展到几个线性段?

提前谢谢!!

Edit01:

谢谢!你的答案使我的代码按需运行。但是,我可以在这里问一些问题。如前所述,我原本希望将近似扩展到几个线性段。所以,我想:

F = @(B,xdata) min(B(1)+B(2)*xdata, B(3)+B(4)*xdata, B(5)+B(6)*xdata);   %Form of the equation
IC = [max(ydata) max(ydata) max(ydata) max(ydata) max(ydata) 0]; %Initial guess
B = lsqcurvefit( F,IC,xdata,ydata,[min(ydata) -inf -inf -inf -inf -inf],[max(xdata) inf inf inf inf 0]);

但MATLAB对I.C.的回应错误:

Failure in initial user-supplied objective function evaluation

你能不能在这里很快帮助我?什么是函数句柄中的“min”函数?

1 个答案:

答案 0 :(得分:1)

运行代码时出现以下错误:

??? Error using ==> lsqncommon at 101
LSQCURVEFIT cannot continue because user supplied objective function failed with the following error:
Attempted to access B(4); index out of bounds because numel(B)=3.

因此,这意味着B(4)中没有任何内容。我会尝试修改IClbub以包含4个元素。

因此,请尝试将这两行放在代码中:

IC = [max(ydata) max(ydata) max(ydata) 0]; %Initial guess
B = lsqcurvefit( F,IC,xdata,ydata,[min(ydata) -inf -inf -inf],[max(xdata) inf inf 0]);