Main Content

Polynomial models for curves are given by

$$y={\displaystyle \sum _{i=1}^{n+1}{p}_{i}{x}^{n+1-i}}$$

where *n* + 1 is the *order* of
the polynomial, *n* is the *degree* of
the polynomial, and 1 ≤ *n* ≤ 9. The
order gives the number of coefficients to be fit, and the degree gives
the highest power of the predictor variable.

In this guide, polynomials are described in terms of their degree. For example, a third-degree (cubic) polynomial is given by

$$\gamma ={p}_{1}{x}^{3}+{p}_{2}{x}^{2}+{p}_{3}x+{p}_{4}$$

Polynomials are often used when a simple empirical model is
required. You can use the polynomial model for interpolation or extrapolation,
or to characterize data using a global fit. For example, the temperature-to-voltage
conversion for a Type J thermocouple in the 0 to 760^{o} temperature
range is described by a seventh-degree polynomial.

**Note**

If you do not require a global parametric fit and want to maximize the flexibility of the fit, piecewise polynomials might provide the best approach. Refer to Nonparametric Fitting for more information.

The main advantages of polynomial fits include reasonable flexibility for data that is not too complicated, and they are linear, which means the fitting process is simple. The main disadvantage is that high-degree fits can become unstable. Additionally, polynomials of any degree can provide a good fit within the data range, but can diverge wildly outside that range. Therefore, exercise caution when extrapolating with polynomials.

When you fit with high-degree polynomials, the fitting procedure
uses the predictor values as the basis for a matrix with very large
values, which can result in scaling problems. To handle this, you
should normalize the data by centering it at zero mean and scaling
it to unit standard deviation. Normalize data by selecting the **Center and scale** check box in the Curve Fitting
app.

Open the Curve Fitting app by entering

`cftool`

. Alternatively, click Curve Fitting on the Apps tab.In the Curve Fitting app, select curve or surface data.

If you select curve data (

**X data**and**Y data**, or just**Y data**against index), Curve Fitting app creates the default curve fit,`Polynomial`

.If you select surface data (

**X data**,**Y data**, and**Z data**), Curve Fitting app creates the default surface fit,`Interpolant`

. Change the model type from`Interpolant`

to`Polynomial`

.

For *curves*, the `Polynomial`

model
fits a polynomial in **x**.

For *surfaces*, the `Polynomial`

model
fits a polynomial in **x** and **y**.

You can specify the following options:

The degree for the

**x**and**y**inputs:For curves, degree of

**x**can be up to`9`

.For surfaces, degree of

**x**and**y**can be up to`5`

.The degree of the polynomial is the maximum of

**x**and**y**degrees. See Defining Polynomial Terms for Polynomial Surface Fits.

The robust linear least-squares fitting method to use (

`Off`

,`LAR`

, or`Bisquare`

). For details, see`Robust`

on the`fitoptions`

reference page.Set bounds or exclude terms by clicking

**Fit Options**. You can exclude any term by setting its bounds to 0.Look in the

**Results**pane to see the model terms, the values of the coefficients, and the goodness-of-fit statistics.

**Tip**

If your input variables have very different scales, select and
clear the **Center and scale** check box to see the
difference in the fit. Messages in the **Results** pane
prompt you when scaling might improve your fit.

For an example comparing various polynomial fits, see Compare Fits in Curve Fitting App.

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'`

.

**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' );

fitpoly2 = Linear model Poly2: fitpoly2(x) = p1*x^2 + p2*x + p3 Coefficients (with 95% confidence bounds): p1 = 0.006541 (0.006124, 0.006958) p2 = -23.51 (-25.09, -21.93) p3 = 2.113e+04 (1.964e+04, 2.262e+04)

**Create a Cubic Curve**

Fit a cubic polynomial `'poly3'`

.

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

Warning: Equation is badly conditioned. Remove repeated data points or try centering and scaling. fitpoly3 = Linear model Poly3: fitpoly3(x) = p1*x^3 + p2*x^2 + p3*x + p4 Coefficients (with 95% confidence bounds): p1 = 3.855e-06 (-4.078e-06, 1.179e-05) p2 = -0.01532 (-0.06031, 0.02967) p3 = 17.78 (-67.2, 102.8) p4 = -4852 (-5.834e+04, 4.863e+04)

**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)

fit3 = Linear model Poly3: fit3(x) = p1*x^3 + p2*x^2 + p3*x + p4 where x is normalized by mean 1890 and std 62.05 Coefficients (with 95% confidence bounds): p1 = -0.4619 (-1.895, 0.9707) p2 = 25.01 (23.79, 26.22) p3 = 77.03 (74.37, 79.7) p4 = 62.81 (61.26, 64.37)

To find out what parameters you can set for the library model `'poly3'`

, use the fitoptions function.

```
fitoptions poly3
```

ans = Normalize: 'off' Exclude: [] Weights: [] Method: 'LinearLeastSquares' Robust: 'Off' Lower: [1x0 double] Upper: [1x0 double]

**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

gof = struct with fields: sse: 149.7687 rsquare: 0.9988 dfe: 17 adjrsquare: 0.9986 rmse: 2.9682

**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 )

popFuture = 276.9632 305.4420 335.5066

Compute 95% confidence bounds on the prediction for the population in the future, using the predint method.

```
ci = predint( fit4, cdateFuture, 0.95, 'observation' )
```

ci = 267.8589 286.0674 294.3070 316.5770 321.5924 349.4208

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)

Linear model Poly44: fitsurface(x,y) = p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2 + p30*x^3 + p21*x^2*y + p12*x*y^2 + p03*y^3 + p40*x^4 + p31*x^3*y + p22*x^2*y^2 + p13*x*y^3 + p04*y^4 where x is normalized by mean 1982 and std 868.6 and where y is normalized by mean 0.4972 and std 0.2897 Coefficients (with 95% confidence bounds): p00 = 0.3471 (0.3033, 0.3909) p10 = -0.1502 (-0.1935, -0.107) p01 = -0.4203 (-0.4637, -0.377) p20 = 0.2165 (0.1514, 0.2815) p11 = 0.1717 (0.1175, 0.2259) p02 = 0.03189 (-0.03351, 0.09729) p30 = 0.02778 (0.00749, 0.04806) p21 = 0.01501 (-0.002807, 0.03283) p12 = -0.03659 (-0.05439, -0.01879) p03 = 0.1184 (0.09812, 0.1387) p40 = -0.07661 (-0.09984, -0.05338) p31 = -0.02487 (-0.04512, -0.004624) p22 = 0.0007464 (-0.01948, 0.02098) p13 = -0.02962 (-0.04987, -0.009366) p04 = -0.02399 (-0.0474, -0.0005797)

All fitting methods have the default properties` Normalize`

, `Exclude`

, `Weights`

,
and `Method`

. For an example, see Specifying Fit Options at the Command Line.

Polynomial models have the `Method`

property
value `LinearLeastSquares`

, and the additional fit
options properties shown in the next table. For details on all fit
options, see the `fitoptions`

reference
page.

Property | Description |
---|---|

| Specifies the robust linear least-squares fitting method
to use. Values are |

| A vector of lower bounds on the coefficients to be fitted.
The default value is an empty vector, indicating that the fit is unconstrained
by lower bounds. If bounds are specified, the vector length must equal
the number of coefficients. Individual unconstrained lower bounds
can be specified by |

| A vector of upper bounds on the coefficients to be fitted.
The default value is an empty vector, indicating that the fit is unconstrained
by upper bounds. If bounds are specified, the vector length must equal
the number of coefficients. Individual unconstrained upper bounds
can be specified by |

You can control the terms to include in the polynomial surface
model by specifying the degrees for the x and y inputs. If *i* is
the degree in x and *j* is the degree in y, the total
degree of the polynomial is the maximum of *i* and *j*.
The degree of x in each term is less than or equal to *i*,
and the degree of y in each term is less than or equal to *j*.
The maximum for both *i* and *j* is
five.

For example:

poly21 Z = p00 + p10*x + p01*y + p20*x^2 + p11*x*y

poly13 Z = p00 + p10*x + p01*y + p11*x*y + p02*y^2 + p12*x*y^2 + p03*y^3

poly55 Z = p00 + p10*x + p01*y +...+ p14*x*y^4 + p05*y^5

For example, if you specify an x degree
of `3`

and a y degree of `2`

, the
model name is `poly32`

. The model terms follow the
form in this table.

Degree of Term | 0 | 1 | 2 |
---|---|---|---|

0 | 1 | y | y^{2} |

1 | x | xy | xy^{2} |

2 | x^{2} | x^{2}y | N/A |

3 | x^{3} | N/A | N/A |

The total degree of the polynomial cannot exceed the maximum
of *i* and *j*. In this example,
terms such as x^{3}y and x^{2}y^{2} are
excluded because
their degrees sum to more than `3`

. In both cases,
the total degree is `4`

.

`fit`

| `fittype`

| `fitoptions`

| Polynomial Model Names and Equations