【问题标题】:Function works with lsqcurvefit but not nlinfit函数适用于 lsqcurvefit 但不适用于 nlinfit
【发布时间】:2013-05-12 10:32:02
【问题描述】:

我正在尝试对以下函数进行非线性最小二乘拟合:

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

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2015-09-09
      • 2017-11-22
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      相关资源
      最近更新 更多