【问题标题】:fit data with x axis already formatted with dateticks() MATLAB使用已用 dateticks() MATLAB 格式化的 x 轴拟合数据
【发布时间】:2015-12-01 05:50:53
【问题描述】:

我已经在这里工作了好几个小时,我觉得简单的问题花费的时间最长,这很烦人。我似乎无法将曲线拟合到我的数据中,我尝试过 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....etc 作为我的 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')    

【问题讨论】:

  • 如果您的数据是均匀分布的(每月一次观察),只需创建一个虚拟的 x 变量 1:12 并为此进行拟合/评估,但是当您绘制时使用 month
  • 但是您已经遗漏了给您带来问题的代码!请重新添加您的拟合和绘图代码。
  • @David 我试过了,但由于某些奇怪的原因,它仍然不起作用。我已经清除并再次尝试,仍然没有。我希望图表在 y 轴上有水位,在 x 轴上有一年中的 12 个月,然后我想绘制我的原始数据 plot(month,waterLevel1985,'r+') 然后绘制一条拟合曲线对于这些数据,这就是我使用 polyfit 和 polyval 函数的原因。
  • 问题是,当我使用 polyfit(month,waterLevel1985,4) 时,它会警告我我的合身性不合适,并且不会绘制曲线。当我使用 polyfit([1:1:12], waterLevel1985,4) 时,它不会再次绘制拟合,但这次没有警告。

标签: matlab curve-fitting


【解决方案1】:

我认为发生的事情是多项式拟合的数值条件非常糟糕,因为 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')

这给了这个

【讨论】:

  • 我有点不确定你做了什么,但这很神奇。谢谢好心的先生。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
相关资源
最近更新 更多