我正在尝试将非线性最小二乘拟合为以下函数:
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是正实数和相同长度的矢量(I三重检查)。当我使用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,因为它为我提供了有关错误的更多统计信息。
提前感谢您提供的任何帮助!
答案 0 :(得分:0)
他们都使用相同的算法来识别解决方案,但是,您明确地在lsqcurvefit
中说明了解决方案的上限和下限,以确保您的不完整beta函数的行为。您在nlinfit
中没有此选项。我不确定你之前做了什么(你总是可以查看命令历史记录)
从这一点上你有几个选择:
1 - 以编程方式拦截每个进入ncmfun的值,通过在我的噩梦中消耗你的匿名函数,或者为它创建自己的m文件。如果值超出[0,1],则返回逐渐增大的错误值(边界为>>>然后设置中的任何可能值)
2 - 尝试通过播放一些参数来强制收敛(可能使用强大的拟合选项(参见文档))