# Matlab - curve fitting

## Lines

`lsline` superimposes the least squares line on each line object.

## Polynomials

`polyfit` finds the coefficients of a best-fit polynomial
of any required degree. The following tries to fit a degree 5 polynomial
to a sin curve

x=1:10; y=sin(x); [P,S] = polyfit(x,y,5); yfit= polyval(P,x); %Now compare y with yfit plot(x,y,x,yfit);

If you want to force the best-fit line to pass through certain points, look at MatlabCentral's Polynomial Fitting with Added Constraints.

## Arbitrary Functions

If you know the form of the required function you can use `fminsearch`
to
find the best coefficients. Suppose that you think that some
data should conform to a relation of the form `a*x+b*sin(x)+c`.
To be able to use `fminsearch` you need to write a matlab function
that for given values of a, b and
c, calculates the square of the disparity. Its first argument is a
vector of coefficients, its last argument is a vector of the given data
values. The other arguments (in this case, just one) are vectors of
free variables. You can put this function into its own file or (as here)
make it into a subfunction. If you put the following code into a file
called `fitting.m`, then run it, you should see how good to fit is.

function fitting x=1:10; y=sin(x); bestcoeffs=fminsearch(@fun,[1 1 1],[],x,y); yfit=bestcoeffs(1)*x +bestcoeffs(2)*sin(x) + bestcoeffs(3); %Now compare y with yfit plot(x,y,x,yfit); function out=fun(coeff,X,Y) a = coeff(1); b = coeff(2); c = coeff(3); Y_fun = a .* X + b .* sin(X)+c; DIFF = Y_fun - Y; SQ_DIFF = DIFF.^2; out = sum(SQ_DIFF);

Note that the `[1 1 1]` argument to
`fminsearch` provides the starting values for a, b and c. The choice
of starting values can affect the speed of the search.

An example of fitting a function of 2 values is in Mathworks' Solution Search (Solution 1484)

## Surfaces

Available solutions depend on the toolboxes you have, and why you want the equation of the surface.

- There's
`dblquad`, but it's not trivial to use. - At matlabcentral there are some free add-ons which might do the job.
- I think
`lsqcurvefit`is able to find the best-fit function of 2 variables for a surface. Following the links from the Optimization Toolbox documentation gives the most information. - See Mathworks' Solution Search (Solution 6388) for an example of using CURVEFIT from the Optimization Toolbox.
- There's also the Curve Fitting Toolbox