使用lsqcurvefit,我该如何改进拟合

时间:2014-12-30 09:39:29

标签: matlab curve-fitting linear-regression nonlinear-optimization

我需要将Runreg.m中给出的数据拟合到CalculateTime.m中给出的等式中,但resnorm的值非常高,我无法很好地适应。

使用获得的A和sigma值,如果我计算时间,它与实际时间有很大不同。

CalculateTime.m

function [ Ta] = CalculateTime(par_fit,n)
  T1=484.437812;
  sigma = par_fit(1);
  A= par_fit(2);
  const1= sigma*(T1-T1/(2*A));
  const2= T1/A -T1*sigma/(2*A);
  Ta = n.^(-1)*const1 + const2;
end

Runreg.m

n=[1.0000      1.5000    2.0000    2.5000    3.0000    4.0000];
Ta=[484.437812 424.2085  382.3534  352.1422  311.6865  253.5879];
plot(n,Ta,'o')
par_fit=[0.8,2];
options = optimset('Display','iter','TolX', 1e-10, 'TolFun', 1e-10, 'MaxFunEvals', 4000, 'MaxIter', 4000);
[x,resnorm,residual]=lsqcurvefit(@CalculateTime,par_fit,n,Ta,[0 1],[1 Inf],options);
hold on
plot(n,CalculateTime(x,n))
hold off

1 个答案:

答案 0 :(得分:0)

您首先应该做的是将TolXTolFun更改为更合理的值。将它们设置为1e-100这不会改善结果,但只会导致超过必要的迭代次数。我已经使用1e-10附加了两个公差的拟合结果图。我得到的参数是sigma=0.9881A=1.0000,并且拟合看起来完全可以接受。 resnorm483.2636,可能看起来很高,但要记住它是残差平方的总和,因此平均残差约为13,这似乎是可以接受的。

我认为你要问自己的是sigmaA是否在你想要拟合的参数的合理范围内,并想一想你要解决的问题。也许更多的数据点可以帮助更好地适应?也许您的初始值或参数的边界可以调整?在我看来,lsqcurvefit正在做它应该做的事情而你的实际问题是别的。

Result of lsqcurvefit