%% Fit Polynomials Using the Fit Function
%
% This example shows how to use the |fit| function to fit polynomials to
% data. The steps fit and plot polynomial curves and a surface, specify
% fit options, return goodness of fit statistics, calculate predictions,
% and show confidence intervals.
%
% The polynomial library model is an input argument to the fit and fittype
% functions. Specify the model type |poly| followed by the degree in x (up to
% 9), or x and y (up to 5). For example, you specify a quadratic curve with
% |'poly2'| , or a cubic surface with |'poly33'| .

% Copyright 2015 The MathWorks, Inc.


%% Create and Plot a Quadratic Polynomial Curve
% Load some data and fit a quadratic polynomial. Specify a quadratic, or
% second-degree polynomial, with the string |'poly2'| .
load census;
fitpoly2=fit(cdate,pop,'poly2')
% Plot the fit with the plot method.
plot(fitpoly2,cdate,pop)
% Move the legend to the top left corner.
legend('Location','NorthWest' );

%% Create a Cubic Curve
% Fit a cubic polynomial |'poly3'|.

fitpoly3=fit(cdate,pop,'poly3')
plot(fitpoly3,cdate,pop)

%% Specify Fit Options
% The cubic fit warns that the equation is badly conditioned, so you
% should try centering and scaling by specifying the |'Normalize'| option.
% Fit the cubic polynomial with both center and scale and robust fitting
% options. Robust |'on'| is a shortcut equivalent to |'Bisquare'| , the
% default method for robust linear least-squares fitting method.

fit3=fit(cdate, pop,'poly3','Normalize','on','Robust','on')
plot(fit3,cdate,pop)
%% 
% To find out what parameters you can set for the library model |'poly3'| ,
% use the fitoptions function.

fitoptions poly3

%% Get Goodness of Fit Statistics
% Specify the |'gof'| output argument to get the goodness-of-fit statistics
% for the cubic polynomial fit.
[fit4, gof]=fit(cdate, pop,'poly3','Normalize','on');
gof

%% Plot the Residuals to Evaluate the Fit
% To plot residuals, specify |'residuals'| as the plot type in the plot
% method.
plot(fit4,cdate, pop,'residuals');

%% Examine a Fit Beyond the Data Range
% By default, the fit is plotted over the range of the data. To plot a fit
% over a different range, set the x-limits of the axes before plotting the
% fit. For example, to see values extrapolated from the fit, set the upper
% x-limit to 2050.

plot( cdate, pop, 'o' );
xlim( [1900, 2050] );
hold on
plot( fit4 );
hold off

%% Plot Prediction Bounds
% To plot prediction bounds, use |'predobs'| or |'predfun'| as the plot
% type.
plot(fit4,cdate,pop,'predobs')
%% 
% Plot prediction bounds for the cubic polynomial up to year 2050.
plot( cdate, pop, 'o' );
xlim( [1900, 2050] )
hold on
plot( fit4, 'predobs' );
hold off

%% Get Confidence Bounds at New Query Points
% Evaluate the fit for some new query points.
cdateFuture = (2000:10:2020).';
popFuture = fit4( cdateFuture ) 

%% 
% Compute 95% confidence bounds on the prediction for the population in the
% future, using the predint method.
ci = predint( fit4, cdateFuture, 0.95, 'observation' )
%% 
% Plot the predicted future population, with confidence intervals, against
% the fit and data.
plot(cdate, pop, 'o');
xlim([1900, 2040])
hold on
plot(fit4)
h = errorbar(cdateFuture,popFuture,popFuture-ci(:,1),ci(:,2)-popFuture,'.');
hold off
legend('cdate v pop','poly3','prediction','Location','NorthWest')

%% Fit and Plot a Polynomial Surface
% Load some surface data and fit a fourth-degree polynomial in x and y.
load franke;
fitsurface=fit([x,y],z, 'poly44','Normalize','on')
plot(fitsurface, [x,y],z)



