0

我需要将Runreg.m中给出的数据拟合到CalculateTime.m中给出的公式中,但resnorm的值非常高,我不能很好地拟合。使用lsqcurvefit,我该如何改进拟合

使用获得的A和σ值,如果我的CalculateTime与实际时间有很大不同。

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

@HighPerformanceMark:刚刚更新的问题。 – Biparite

回答

0

什么你应该做的首先是改变TolXTolFun一些更合理的值。将它们设置为1e-100这不会改善结果,但会导致更多的迭代次数超过必要的次数。我附上了使用1e-10两种公差的合适结果图。我得到的参数是sigma=0.9881A=1.0000和fit看起来相当可接受。 resnorm483.2636,它可能看起来很高,但请记住它是平方残差的总和,所以平均残差约为13,这似乎是相当可接受的。

我觉得你有什么要问自己是sigmaA是否是一个合理的范围内为您正试图适应范围之内,想多一点关于你正在试图解决的问题。也许更多的数据点可以帮助更好地适应?也许你的初始值或参数的界限可以调整?在我看来,lsqcurvefit正在做它应该做的事情,而你的实际问题是另一回事。

Result of lsqcurvefit

+0

我已添加更多数据。适合适用于较小的n值,但想法是使用这个模型来获得更大的n值,这肯定会失败。正如你所提到的“也许你的初始值或你的参数的边界可以调整”,你能解释一下吗? – Biparite

+0

我已经用更多的数据点试了一下,看起来好像你试图适合数据的函数可能没有准确地描述它。你能告诉我们更多关于你正在测量的过程和你正在使用的方程吗?我对初始值/边界的评论意味着,有时拟合的结果可能取决于解算器陷入局部最小值时的初始参数,但在这里可能不是这种情况。 – magnetometer

+0

这是预测任意数量节点上的执行时间的模型。 tn =σ(T1-T1/2A)/ n + T1/A-T1σ/ 2A; A Biparite