在我的实验中,我需要用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”函数?
答案 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)
中没有任何内容。我会尝试修改IC
,lb
和ub
以包含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]);