2013-05-12 20 views
1

我试图获得一个非线性最小二乘法拟合以下功能:功能可与lsqcurvefit但不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一切正常:

​​

另外,如果我使用任何米至评估功能,一切工作正常,以及。然而,当我使用nlinfit:

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

我得到以下错误(S):

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

它们都使用相同的算法来识别解决方案,但是,您明确指出您的解决方案的上下限为lsqcurvefit,这可确保您的不完整的beta函数的行为。您在nlinfit中没有此选项。我不知道你之前(你总是可以看看命令历史记录)

你必须从这个点了几个选项做:

1 - 编程拦截每次去ncmfun,方法是花费值你在我的噩梦中创建的匿名函数,或为它创建自己的m文件。如果该值超出[0,1],则返回逐渐提高的错误值(边界为>>>,则该集合内的任何可能值)

2 - 尝试强制通过播放某些参数(可能通过使用强大的安装选项(cf文档))