如何用matlab对这组数据曲线拟合?
y = [46808,49416,53094,57237,56677,56198,59673,61826,64158,65220,63108,60944,59543,58779,59882,60087,61825,63104,64963,66902,66443,67061,67273,67372,68679,69995,71522,73292,73932,75826,76954,78105,78439,79892,82631];
就是这样一组数据,函数的形式为:y=a+b*cos(c*x+d)+e*exp(f*x);
我试图用nfitlin和cftool里面自定义的函数进行拟合,效果都非常不理想。
按书上给出的答案,函数的系数分别为:a=31950;b=1557;c=0.605;d=-3159.659;e=1.183e-16;f=0.02369。
有哪位大神能帮一下忙么?
我用的matlab版本是2013b,可以的话最好用这个版本的程序给我解答,我发现这个版本还是和别的版本的界面差别蛮大的。。。 展开
a =15019.08239, b = 2345.431602, c =0.5108014930, d = -136.6872430, e =0.5309357832e-8, f =0.1503166632e-1
剩余平方和SSE:148234466.9758
相关系数R-square:0.94084
剩余标准差RMSE:2119.4229
按书上给出的答案,其
剩余平方和SSE:367174768.0736
相关系数R-square:0.85346
剩余标准差RMSE:3335.6421
这说明书上给出的答案给出的结果,并不是最优。
具体求解代码,见附件。
2024-10-13 广告
用这个函数的拟合效果比树上给出的答案效果要好:
f(x) = a1*exp(-((x-b1)/c1)^2) + a2*exp(-((x-b2)/c2)^2)
拟合结果如下:
General model Gauss2:
f(x) = a1*exp(-((x-b1)/c1)^2) + a2*exp(-((x-b2)/c2)^2)
where x is normalized by mean 1987 and std 10.25
Coefficients (with 95% confidence bounds):
a1 = 8.28e+19 (-1.89e+23, 1.892e+23)
b1 = 433.1 (-2.802e+04, 2.888e+04)
c1 = 73.4 (-2340, 2487)
a2 = 9194 (7087, 1.13e+04)
b2 = -0.9514 (-1.025, -0.8779)
c2 = 0.4332 (0.2931, 0.5733)
Goodness of fit:
SSE: 5.391e+07
R-square: 0.9785
Adjusted R-square: 0.9748
RMSE: 1363
而直接将树上的拟合结果带进去,求得拟合优度为:
sse: 1.9653e+08
rsquare: 0.9216
dfe: 29
adjrsquare: 0.9080
rmse: 2.6032e+03
效果不如二项高斯分布~
你验证过答案吗?答案的效果很理想?
你的初始值怎么选的?尤其是cos项的频率如果初值设置不当就很难找到正解了。
观察一下数据,发现非常变态:x和y都离谱且不必要的大。所以先把x改成从0开始,y的偏置减小一下,比如均值归0。而且cos项是非常难以拟合的,可以先去掉,这样至少能先到一个结果。