我有下表,名为"test":
0.0037071 0.5
0.015203 1
0.035039 1.5
0.062272 2
0.093988 2.5
0.12776 3
0.16291 3.5
0.19991 4
0.24002 4.5
0.28574 5
0.34696 5.5
0.47879 6
1.8882 6.1125
现在我想用matlab拟合一个非线性函数:
modelfun = @(b,x)erf(b(1)*x)./b(2) + b(3);
beta0 = [0, 0, 0];
mdl = fitnlm(test,modelfun,beta0)
但我得到以下错误:
Error using nlinfit (line 247)
No usable observations after removing NaNs in Y and in the result of evaluating MODELFUN at the initial value BETA0.
我该如何解决这个问题?(以及如何获得用于绘图的最终拟合的非线性函数?(
我不熟悉fitnlm
,但您可以使用优化工具箱中的另一个函数,例如lsqnonlin
。
% splitting your data in vectors
x = data(:,1);
y = data(:,2);
% the model you want to fit
modelfun = @(b,x) erf(b(1)*x)./b(2) + b(3);
% define a cost function, the error between the data to fit and the
% prediction of the model
cost_fun = @(b,x,y) modelfun(b,x) - y;
% initial guess
beta0 = [1 1 1];
% perform optimization
p = lsqnonlin(@(p) cost_fun(p,x,y), beta0);
结果表明,您的模型返回的beta0
的NaN值均为零。这就是您出现错误的原因。这是由于最初用0除b(2) = 0
。将beta0
更改为1,解决了问题,您可以使用fitnlm
:
% splitting your data in vectors
x = data(:,1);
y = data(:,2);
modelfun = @(b,x) erf(b(1)*x)./b(2) + b(3);
% initial guess
beta0 = [1 1 1];
mdl = fitnlm(x,y,modelfun,beta0)
要绘制数据,只需从mdl
中的表中提取参数并将其存储在b_est
(第一列(中,然后执行y_est = modelfun(b_est,x)
。如果使用lsqnonlin
,它们将存储在输出变量p
中
然后绘制:plot(t,y,t,y_est)