## Curve and Surface Fitting

The problem of curve fitting may be stated as follows:

Given a tabulated set of data values {xi, yi} and the general form of a mathematical model (a function f(x) with unspecified parameters), determine the parameters of the model that minimize an error criterion. The problem of surface fitting involves tabulated data of the form {xi, yi, zi} and a function f(x, y) of two spatial dimensions.

For example, we can use the CURVEFIT routine to determine the parameters A and B of a user-supplied function f(x), such that the sums of the squares of the residuals between the tabulated data {xi, yi} and function are minimized. We will use the following function and data:

f (x) = a (1 -e-bx)

xi = [0.25, 0.75, 1.25, 1.75, 2.25]

yi = [0.28, 0.57, 0.68, 0.74, 0.79]

First we must provide a procedure written in IDL to evaluate the function, f, and its partial derivatives with respect to the parameters a0 and a1:

```PRO funct, X, A, F, PDER
F = A[0] * (1.0 - EXP(-A[1] * X))
; If the function is called with four parameters,
; calculate the partial derivatives:
IF N_PARAMS() GE 4 THEN BEGIN
; PDER's column dimension is equal to the number of
; elements in xi and its row dimension is equal to
; the number of parameters in the function F:
pder = FLTARR(N_ELEMENTS(X), 2)
; Compute the partial derivatives with respect to
; a0 and place in the first row of PDER:
pder[*, 0] = 1.0 - EXP(-A[1] * X)
; Compute the partial derivatives with respect to
; a1 and place in the second row of PDER:
pder[*, 1] = A[0] * x * EXP(-A[1] * X)
ENDIF
END
```

 Note
The function will not calculate the partial derivatives unless it is called with four parameters. This allows the calling routine (in this case CURVEFIT) to avoid the extra computation in cases when the partial derivatives are not needed.

Next, we can use the following IDL commands to find the function's parameters:

```;Define the vectors of tabulated:
X = [0.25, 0.75, 1.25, 1.75, 2.25]
;data values:
Y = [0.28, 0.57, 0.68, 0.74, 0.79]
;Define a vector of weights:
W = 1.0 / Y
;Provide an initial guess of the function's parameters:
A = [1.0, 1.0]
;Compute the parameters a0 and a1:
yfit = CURVEFIT(X, Y, W, A, SIGMA_A, FUNCTION_NAME = 'funct')
;Print the parameters, which are returned in A:
PRINT, A
```

IDL prints:

```  0.787386  1.71602
```

Thus the nonlinear function that best fits the data is:

f (x) = 0.787386 ( 1 --e-1.71602x )

### Routines for Curve and Surface Fitting

Below is a brief description of IDL routines for curve and surface fitting.

 Fits paired data using one of six common filtering functions. Computes the length of a curve. Fits multivariate data with a user-supplied function. Fits a 2D elliptical Gaussian equation to rectilinearly gridded data. Fits the sum of a Gaussian and a quadratic. Uses thin plate splines to interpolate a set of values over a regular 2D grid, from irregularly sampled data values. Interpolates set of points using kriging. Fits paired data using least absolute deviation method. Fits by minimizing the Chi-square error statistic. Does a non-linear least squares fit. Interpolates points with a minimum curvature surface or a thin-plate-spline surface. Useful with CONTOUR. Performs a least-square polynomial fit. Computes fit using multiple linear regression. Performs polynomial fit to a surface. Multivariate least squares fit using SVD method. Interpolates irregularly-gridded data to a regular grid from a triangulation.