繁体   English   中英

函数适用于lsqcurvefit但不适用于nlinfit

[英]Function works with lsqcurvefit but not nlinfit

我正在尝试使非线性最小二乘适合以下函数:

Nloc = 250;

d = 1 / Nloc;

m = 0.5; %Initial guess

ncmfun = @(m, p) arrayfun(@(p) betainc(d, Nloc*m .* p, Nloc*m .* (1 - p), 'upper'), p);

其中m是要拟合的参数,Nloc和d是常数,p和freq是正实数且长度相同的向量(已三重检查)。 当我使用lsqcurvefit时,一切正常:

[mfit,resnorm,]  = lsqcurvefit(ncmfun, m, p, freq, 0, 1)

另外,如果我使用任何m来评估函数,那么一切也都很好。 但是,当我使用nlinfit时:

[mfit,R,Jac,CovB,MSE,ErrorModelInfo] = nlinfit(p, freq, ncmfun, m)

我收到以下错误:

Error using betainc

Z must be real and non-negative.

Error in @(p)betainc(d,Nloc*m.*p,Nloc*m.*(1-p),'upper')


Error in
@(m,p)arrayfun(@(p)betainc(d,Nloc*m.*p,Nloc*m.*(1-p),'upper'),p)


Error in nlinfit>@(b,x)w.*model(b,x) (line 206)
        modelw = @(b,x) w.*model(b,x);

Error in nlinfit>LMfit (line 486)
    yfit = model(beta,X);

Error in nlinfit (line 207)
        [beta,J,~,cause,fullr] = LMfit(X,yw,
        modelw,beta,options,verbose,maxiter);

Error in Sloan_NCM_Parameterize_Nm (line 37)
[mfit,R,Jac,CovB,MSE,ErrorModelInfo] = nlinfit(p, freq,
ncmfun, m);

尤其令人沮丧的是,同一脚本在几个星期前就已经开始工作了。 然后,我尝试再次使用它,它不再起作用。 我尝试查看一下是否意外更改了某些内容,并且不记得了,但是找不到任何错误。 此外,我对为什么lsqcurvefit有效但对nlinfit不满意感到困惑。 我想使用nlinfit,因为它为我提供了有关该错误的更多统计信息。

预先感谢您提供的任何帮助!

它们都使用相同的算法来标识解决方案,但是,您要在lsqcurvefit中明确说明解决方案的上限和下限,以确保不完整的beta函数起作用。 您在nlinfit没有此选项。 我不确定您之前做过什么(可以随时查看命令历史记录)

从这一点上,您有几种选择:

1-通过扩展我的噩梦中的匿名函数或为此创建自己的m文件,以编程方式截获ncmfun的每个值。 如果该值在[0,1]之外,则逐渐返回更高的错误值(边界为>>>,则该集中的任何可能值)

2-尝试通过使用某些参数来强制更快地收敛(也许使用健壮的拟合选项(参见文档))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM