功能适用于lsqcurvefit但不适用于nlinfit

时间:2013-05-12 01:37:24

标签: matlab

我正在尝试将非线性最小二乘拟合为以下函数:

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

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

1 个答案:

答案 0 :(得分:0)

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

从这一点上你有几个选择:

1 - 以编程方式拦截每个进入ncmfun的值,通过在我的噩梦中消耗你的匿名函数,或者为它创建自己的m文件。如果值超出[0,1],则返回逐渐增大的错误值(边界为>>>然后设置中的任何可能值)

2 - 尝试通过播放一些参数来强制收敛(可能使用强大的拟合选项(参见文档))