使用 ThingSpeak 数据预测潮汐深度
此示例展示了如何使用 ThingSpeak™通道中存储的数据来预测 Ockway Bay 的潮汐深度。预测潮汐深度至关重要:如果您不知道水深,您的船很容易陷入浅海湾的泥浆中。
从 Ockway Bay 实时潮汐计读取数据
ThingSpeak™通道50289 包含有关奥克威湾潮汐深度的数据。数据每 5 分钟收集一次。通道的字段 1 包含潮汐深度数据。使用thingSpeakRead
函数从通道50289读取特定日期的数据,示例2016年7月1日。
startDate = datetime('July 1, 2016 12:01:00 AM'); endDate = datetime('July 2, 2016 12:02:00 AM'); dateRange = startDate:endDate; data = thingSpeakRead(50289,'DateRange',dateRange,'Fields',1);
将 AR 模型拟合到数据
使用 iddata
函数创建潮汐深度数据的 iddata 对象。对数据使用 detrend
使数据为零均值。由于潮汐深度随时间变化,因此请使用 ar
函数对数据拟合离散时间自回归模型。在去除趋势之前捕获偏移量,然后拟合 AR 模型来表示系统。
sampleTime = 5; IDdata = iddata(data,[],sampleTime,'OutputName',{'Tidal Depth'},'TimeUnit','minutes') trend = getTrend(IDdata,0); IDdata = detrend(IDdata,0); modelOrder = 8; sys = ar(IDdata,modelOrder);
IDdata = Time domain data set with 288 samples. Sample time: 5 minutes Outputs Unit (if specified) Tidal Depth
预测潮汐深度
使用 forecast
函数预测第二天的潮汐深度。由于实测潮深数据每 5 分钟更新一次,因此将预报数据的样本数设置为 288。yf
是预测模型响应,yf_sd
是输出的标准差。绘图前重新绘制数据趋势。
numSamples = 288; [yf,x0,sysf,yf_sd,x,x_sd] = forecast(sys,IDdata,numSamples); IDdata = retrend(IDdata,trend); yf = retrend(yf,trend);
绘制预测响应
绘制测量数据和预测潮汐数据。还绘制预测模型的不确定性的一个标准差。
figure; UpperBound = iddata(yf.OutputData+1*yf_sd,[],yf.Ts,'Tstart',yf.Tstart,'TimeUnit','minutes'); LowerBound = iddata(yf.OutputData-1*yf_sd,[],yf.Ts,'Tstart',yf.Tstart,'TimeUnit','minutes'); plot(IDdata(:,:,[]),'r',yf(:,:,[]),'b'); hold on plot(UpperBound,'k--',LowerBound,'k--'); legend({'measured','forecasted','1 sd uncertainty'},'Location','best'); xlabel('Time'); ylabel('Tidal depth (inches)'); title('Measured and Forecasted Tidal Wave Depths');
该图显示了测量和预测的系统响应以及一个标准偏差不确定性界限。