## nonlinearfit_minsse.m

October 10, 2011 at 01:09 PM | categories: data analysis | View Comments

## Contents

```
function main
```

% y = x^a close all; clear all; clc x = [0 1.1 2.3 3.1 4.05 6]; y = [0.0039 1.2270 5.7035 10.6472 18.6032 42.3024];

## Plot the raw data

the data appears to be polynomial or exponential. In this case, a must be greater than 1, since the data is clearly not linear.

plot(x,y,'ko ') xlabel('x') ylabel('y')

## getting an initial guess

The best a will minimize the summed squared error between the model and the fit. At the end, we define two nested functions: one is the model function that gives the predicted y-values from an arbitrary a parameter, and the x data, and the second computes the summed squared error between the model and data for a value of a. Here we plot the summed squared error function as a function of a.

arange = linspace(1,3,20); sse = arrayfun(@errfunc,arange); plot(arange,sse) xlabel('a') ylabel('\Sigma (y-y_{pred})^2')

## Minimization of the summed squared error

based on the graph above, you can see a minimum in the summed squared error near a = 2.1. We use that as our initial guess

pars = fminsearch(@errfunc,2.1) figure; hold all plot(x,y,'bo ') plot(x,model(pars,x)) xlabel('x') ylabel('y') legend('data','fit')

pars = 2.0901

## summary

We can do nonlinear fitting by directly minimizing the summed squared error between a model and data. This method lacks some of the features of nlinfit, notably the simple ability to get the confidence interval. However, this method is more flexible and powerful than nlinfit, and may work in times where nlinfit fails.

## nested functions

function yp = model(pars,X) a = pars(1); yp = X.^a; % predicted values end function sse = errfunc(pars) % calculates summed squared error pred_y = model(pars,x); err = pred_y - y; sse = sum(err.^2); end

end % categories: data analysis