使用已使用 dateticks() MATLAB 格式化的 x 轴拟合数据

fit data with x axis already formatted with dateticks() MATLAB

我已经做了好几个小时了,我觉得简单的问题花费的时间最长,这很烦人。我似乎无法为我的数据拟合曲线,我试过 fit()、polyval(),但我无法让它们工作。我认为问题是,我的 x 轴以月为单位,而不是真正的数字,所以这些功能现在讨厌我。这是我的代码:

startDate = datenum('01-01-1985');
endDate = datenum('12-31-1985');
month = linspace(startDate,endDate,12);
waterLevel1985 = [75.2 75.3 75.4 75.6 75.7 75.75 75.6 75.5 75.3 75.25 75.2 75.25];

p = polyfit(month,waterLevel1985,4);   %error is here apparently...
x = 1:0.5:12;
bestFit = polyval(p,x);
plot(month,waterLevel1985,x,bestFit)

ax = gca;
ax.XTick = month;
datetick('x','mmm','keepticks')

当我绘图时,我得到一个图表,其中 jan feb mar apr....等作为我的 x 轴,1985 年的水位值在我的 y 轴上。如果我只是放置 plot (month, waterlevel1985, 'r+') 我的数据不会得到拟合曲线(看起来最接近 4 次多项式)。请帮我做这个,我搞不懂!

编辑:我什至尝试将 [1:1:12] 放在 polyfit 函数中而不是月份,但它仍然不起作用。我一直在玩弄 polyfit 和 polyval,但它们对我不起作用。我什至尝试了以下方法:

startDate = datenum('01-01-1985');
endDate = datenum('12-31-1985');
month = linspace(startDate,endDate,12);
waterLevel1985 = [75.2 75.3 75.4 75.6 75.7 75.75 75.6 75.5 75.3 75.25 75.2 75.25];

p = polyfit([1:1:12],waterLevel1985,4);
x = 1:0.5:12;
bestFit = polyval(p,x);
plot(month,waterLevel1985,'r+')
hold on
plot(x, bestFit)
hold off

ax = gca;
ax.XTick = month;
datetick('x','mmm','keepticks')    

我认为发生的事情是多项式拟合的数值条件非常糟糕,因为 month 值非常大。 (也许)。

我将月份值重新调整为 [0,1] 然后进行了拟合,然后绘制了绘图,现在似乎可以工作了。

startDate = datenum('01-01-1985')
endDate = datenum('12-31-1985')
month = linspace(startDate,endDate,12);
waterLevel1985 = [75.2 75.3 75.4 75.6 75.7 75.75 75.6 75.5 75.3 75.25 75.2 75.25];
month2=linspace(0,1,48); %// finer grid for plotting
%// Now transform month into [0,1] and fit the polynomial
p = polyfit((month-startDate)/(endDate-startDate),waterLevel1985,4)
plot(month,waterLevel1985,'o',month2*(endDate-startDate)+startDate,polyval(p,month2))
ax = gca;
ax.XTick = month;
datetick('x','mmm','keepticks')

这给了这个