如何在matlab中正确拟合非线性函数



我有下表,名为"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)

相关内容

  • 没有找到相关文章

最新更新