1

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

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 因为它为我提供了有关错误的更多统计信息。

提前感谢您提供的任何帮助!

4

1 回答 1

0

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

从这一点来看,您有几个选择:

1 - 以编程方式拦截进入 ncmfun 的每个值,方法是在我的噩梦中扩展你的匿名函数,或者为它创建你自己的 m 文件。如果该值在 [0,1] 之外,则返回逐渐更高的错误值(边界为 >>>,然后是集合内的任何可能值)

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

于 2013-05-12T02:32:02.200 回答