# Nonlinear Curve Fitting with `lsqcurvefit`

`lsqcurvefit` enables you to fit parameterized nonlinear functions to data easily. You can also use `lsqnonlin`; `lsqcurvefit` is simply a convenient way to call `lsqnonlin` for curve fitting.

In this example, the vector `xdata` represents 100 data points, and the vector `ydata` represents the associated measurements. Generate the data for the problem.

```rng(5489,'twister') % reproducible xdata = -2*log(rand(100,1)); ydata = (ones(100,1) + .1*randn(100,1)) + (3*ones(100,1)+... 0.5*randn(100,1)).*exp((-(2*ones(100,1)+... .5*randn(100,1))).*xdata);```

The modeled relationship between `xdata` and `ydata` is

`${ydata}_{i}={a}_{1}+{a}_{2}\mathrm{exp}\left(-{a}_{3}\phantom{\rule{0.16666666666666666em}{0ex}}{xdata}_{i}\right)+{\epsilon }_{i}.$`

The code generates `xdata` from 100 independent samples of an exponential distribution with mean 2. The code generates `ydata` from its defining equation using `a = [1;3;2]`, perturbed by adding normal deviates with standard deviations `[0.1;0.5;0.5]`.

The goal is to find parameters ${\underset{}{\overset{ˆ}{a}}}_{i}$, $i$ = 1, 2, 3, for the model that best fit the data.

In order to fit the parameters to the data using `lsqcurvefit`, you need to define a fitting function. Define the fitting function `predicted` as an anonymous function.

`predicted = @(a,xdata) a(1)*ones(100,1)+a(2)*exp(-a(3)*xdata); `

To fit the model to the data, `lsqcurvefit` needs an initial estimate `a0` of the parameters.

`a0 = [2;2;2];`

Call `lsqcurvefit` to find the best-fitting parameters ${\underset{}{\overset{ˆ}{a}}}_{i}$.

```[ahat,resnorm,residual,exitflag,output,lambda,jacobian] =... lsqcurvefit(predicted,a0,xdata,ydata);```
```Local minimum possible. lsqcurvefit stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance. ```

Examine the resulting parameters.

`disp(ahat)`
``` 1.0169 3.1444 2.1596 ```

The fitted values `ahat` are within 8% of `a = [1;3;2]`.

If you have the Statistics and Machine Learning Toolbox™ software, use the `nlparci` function to generate confidence intervals for the `ahat` estimate.