0

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

我发现使用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函数句柄了解不多。特别是在这里,它有“最小”功能。而且,我应该如何将这个例子扩展到几个线性段?

预先感谢您!

编辑01:

谢谢!!您的答案已使我的代码按需运行。但是,我可以在这里问一些问题。如前所述,我最初想要将近似值扩展到几个线性段。所以,我走:

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 

你能帮我在这里很快与I.C?以及函数句柄中的“min”函数是什么?

回答

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)。我会尝试修改IC,lbub有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]);