This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English version of the page.

Note: This page has been translated by MathWorks. Click here to see
To view all translated materials including this page, select Country from the country navigator on the bottom of this page.

Forecast Tidal Depths

This example shows how to forecast the tidal depth at Ockway Bay. Predicting tidal depths is vital: if you are not aware of the water depth, your boat can get easily stuck in the mud in a shallow bay.


To run this example, you must be logged in to a MathWorks Account that is licensed to use the System Identification Toolbox .

Read Data from the Ockway Bay Real-Time Tide Gauge

ThingSpeak™ channel 50289 contains data about tidal depth at Ockway Bay. The data is collected once every 5 minutes. Field 1 of the channel contains tidal depth data.

Read the data using the thingSpeakRead function from channel 50289 on a particular day, for example, July 01, 2016.


This example is designed to illustrate how an AR model is used to approximate a sinusoidal function such as tide level. The example is not designed as an alternative to sophisticated tidal forecasting techniques. MATLAB® functions that forecast tide levels using measured tidal data, such as UTide functions are available on MATLAB Central.

startDate = datetime(2016,07,01,0,0,0);
endDate = datetime(2016,07,02,0,0,0);
dateRange = startDate:endDate;
data = thingSpeakRead(50289,'DateRange',dateRange,'Fields',1);

Fit an AR Model to the Data

Use the iddata function to create an iddata object of the tidal depth data. As the tidal data is not zero mean, detrend the data to make the data zero mean. Since the tidal depth varies with time, use the ar function to fit a discrete-time autoregressive model to the data.

sampleTime = 5;
IDdata = iddata(data,[],sampleTime,'OutputName',{'Tidal Depth'},'TimeUnit','minutes')
IDdata =

Time domain data set with 288 samples.
Sample time: 5 minutes                 
Outputs           Unit (if specified)  
   Tidal Depth 
% Capture the offest before detrending
trend = getTrend(IDdata,0);
% Detrend the data to zero mean
IDdata = detrend(IDdata,0);
modelOrder = 8;
% Fit an AR model to represent the system
sys = ar(IDdata,modelOrder);

Forecast the Tidal Depth

Use the forecast function to forecast the tidal depth for the next day. Set the number of samples of the forecast data to be 288 as the measured tidal depth data is updated once every 5 minutes.

numSamples = 288;
% yf is the forecasted model response, and yf_sd is the standard deviation of the output. 
% x0 is the estimated value for initial states, and sysf is the forecasting state-space model. 
% Also returned are the state trajectory, x, and standard deviation of the trajectory, x_sd
[yf,x0,sysf,yf_sd,x,x_sd] = forecast(sys,IDdata,numSamples);
% Retrend data before plotting
IDdata = retrend(IDdata,trend);
yf = retrend(yf,trend);

Plot the Forecasted Response

Plot the measured data along with the forecasted tidal data.

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');
hold on
% Plot also the 1-std deviation of uncertainties of the forecasted model
legend({'measured','forecasted','1 sd uncertainty'},'Location','best');
ylabel('Tidal depth (inches)');
title('Measured and Forecasted Tidal Wave Depths');

This plot shows the measured and forecast system response along with one standard deviation uncertainty bounds.

See Also