Curve Fitting via Optimization
This example shows how to fit a nonlinear function to data. For this example, the nonlinear function is the standard exponential decay curve
where is the response at time , and and are the parameters to fit. Fitting the curve means finding parameters and that minimize the sum of squared errors
where the times are and the responses are . The sum of squared errors is the objective function.
Create Sample Data
Usually, you have data from measurements. For this example, create artificial data based on a model with and , with normally distributed pseudorandom errors.
rngdefault% for reproducibilitytdata = 0:0.1:10; ydata = 40*exp(-0.5*tdata) + randn(size(tdata));
Write Objective Function
Write a function that accepts parametersA
andλ
and datatdata
andydata
, and returns the sum of squared errors for the model
. Put all the variables to optimize (A
andλ
) in a single vector variable (x
). For more information, seeMinimizing Functions of Several Variables.
typesseval
函数sse = sseval (x, tdata ydata) = x (1);λ= x(2); sse = sum((ydata - A*exp(-lambda*tdata)).^2);
Save this objective function as a file namedsseval.m
on your MATLAB® path.
Thefminsearch
solver applies to functions of one variable,x
. However, thesseval
function has three variables. The extra variablestdata
andydata
are not variables to optimize, but are data for the optimization. Define the objective function forfminsearch
as a function ofx
alone:
fun = @(x)sseval(x,tdata,ydata);
For information about including extra parameters such astdata
andydata
, seeParameterizing Functions.
Find the Best Fitting Parameters
Start from a random positive set of parametersx0
, and havefminsearch
find the parameters that minimize the objective function.
x0 = rand(2,1); bestx = fminsearch(fun,x0)
bestx =2×140.6877 0.4984
The resultbestx
is reasonably near the parameters that generated the data,A = 40
andλ= 0.5
.
Check the Fit Quality
To check the quality of the fit, plot the data and the resulting fitted response curve. Create the response curve from the returned parameters of your model.
A = bestx(1); lambda = bestx(2); yfit = A*exp(-lambda*tdata); plot(tdata,ydata,'*'); holdonplot(tdata,yfit,'r'); xlabel(“tdata”) ylabel('Response Data and Curve') title('Data and Best Fitting Exponential Curve') legend('Data','Fitted Curve') holdoff
Related Topics
- Optimizing Nonlinear Functions
- Nonlinear Data-Fitting(Optimization Toolbox)
- Nonlinear Regression(Statistics and Machine Learning Toolbox)