我需要将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
答案 0 :(得分:0)
您首先应该做的是将TolX
和TolFun
更改为更合理的值。将它们设置为1e-100
这不会改善结果,但只会导致超过必要的迭代次数。我已经使用1e-10
附加了两个公差的拟合结果图。我得到的参数是sigma=0.9881
和A=1.0000
,并且拟合看起来完全可以接受。 resnorm
是483.2636
,可能看起来很高,但要记住它是残差平方的总和,因此平均残差约为13
,这似乎是可以接受的。
我认为你要问自己的是sigma
和A
是否在你想要拟合的参数的合理范围内,并想一想你要解决的问题。也许更多的数据点可以帮助更好地适应?也许您的初始值或参数的边界可以调整?在我看来,lsqcurvefit正在做它应该做的事情而你的实际问题是别的。