# lspoly

Calculates a set of coefficients for a weighted least squares polynomial fit to the given data.

## Prototype

function lspoly ( x : numeric, y : numeric, wgt : numeric, n [1] : integer ) return_val : float or double

## Arguments

*x*

Abscissa values of the data.

This can be one-dimensional or multi-dimensional. If one-dimensional,
it must be the same length as the rightmost dimension of *y*.
If multi-dimensional, it must be the same dimensionality
as *y*.

*y*

Ordinate values of the data.

This can be one-dimensional or multi-dimensional. If one-dimensional,
it must be the same length as the rightmost dimension of *x*.
If multi-dimensional, it must be the same dimensionality
as *x*.

*wgt*

Weights for a weighted least squares model. If all data values are to be assigned equal weights, then setting the argument equal to a scalar 1.0 will result in all the weights being set to 1.0. Note: if x or y is equal to _FillValue (if present), the weight will be set to 0.0 for that coordinate pair.

*n*

The number of coefficients desired (i.e., *n*-1 will be
the degree of the polynomial). Due to the computational method used,
*n* should be less than or equal to five.

## Return value

The return array will have the same dimensionality as *y*,
except the rightmost dimension will be of length *n*.

If either *x* or *y* are of type double, then the return
array is returned as double. Otherwise, the returned coefficients
are returned as type float.

## Description

Given a set of data (x(i),y(i)), i = 1,...,m,
**lspoly** calculates a set of coefficients for a
weighted least squares polynomial fit to the given data. It is
necessary that the number of data points) be greater than
*n* (the number of coefficients).

Accuracy: for lower order polynomials (*n* .le. 5),
**lspoly** can be expected to give satisfactory
results.

Algorithm: **lspoly** forms the normal and solves the
resulting square linear system using gaussian elimination with full
pivoting.

**Note:** In NCL versions 6.1.2 and earlier, this function would
fail in certain cases where the input data were "scaled" down. We
replaced this routine with
a SLATEC version. It takes
the same arguments, but uses a different algorithm under the hood.
You can get the "old" (pre NCL V6.2.0) version of lspoly by using
"lspoly_old", but we don't recommend it for regular use.

Note: for NCL versions 6.4.0 and earlier, the SLATEC version of this function had a bug that caused this function to potentially return the wrong coefficients in cases where you had multiple leftmost dimensions. This has been fixed in NCL V6.5.0.

Use **lspoly_n** if you want to specify which
dimension(s) to do the calculation across.

## See Also

**lspoly_n**,
**regCoef**, **regline**,
**regcoef**, **reg_multlin**

## Examples

**Example 1**

x = (/-4.5, -3.2, -1.4, 0.8, 2.5, 4.1/) y = (/ 0.7, 2.3, 3.8, 5.0, 5.5, 5.6/) n = 4 c =The 3rd degree polynomial islspoly(x,y, 1, n) ; all weights are set to one

Y = c(0) + c(1)*x + c(2)*x^2 + c(3)*x^3The coefficients (which agree with those returned from

*Mathematica*) are:

(0) 4.66863 (1) 0.489392 (2) -0.0742387 (3) 0.00267663