www.gusucode.com > matlab 案例源码 matlab代码程序 > matlab/CurveFittingViaOptimizationExample.m

    %% 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
%
% $$y(t) = A\exp(-\lambda t),$$
%
% where $y(t)$ is the response at time $t$, and $A$ and $\lambda$ are the
% parameters to fit. Fitting the curve means finding parameters $A$ and
% $\lambda$ that minimize the sum of squared errors
%
% $$\sum_{i=1}^n \left ( y_i - A\exp(-\lambda t_i)\right )^2,$$
%
% where the times are $t_i$ and the responses are $y_i, i = 1,\ldots,n$.
% 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 $A = 40$ and $\lambda = 0.5$, with
% normally distributed pseudorandom errors.
rng default % for reproducibility
tdata = 0:0.1:10;
ydata = 40*exp(-0.5*tdata) + randn(size(tdata));
%% Write Objective Function
% Write a function that accepts parameters |A| and |lambda| and data
% |tdata| and |ydata|, and returns the sum of squared errors for the model
% $y(t)$. Put all the variables to optimize (|A| and |lambda|) in a single
% vector variable (|x|). For more information, see <docid:matlab_math.bsgpq6p-10>.
%
% <include>sseval.m</include>
%
% Save this objective function as a file named |sseval.m| on your MATLAB(R)
% path.
%
% The |fminsearch| solver applies to functions of one variable, |x|.
% However, the |sseval| function has three variables. The extra variables
% |tdata| and |ydata| are not variables to optimize, but are data for the
% optimization. Define the objective function for |fminsearch| as a
% function of |x| alone:
fun = @(x)sseval(x,tdata,ydata);
%%
% For information about including extra parameters such as |tdata| and
% |ydata|, see <docid:matlab_math.bsgprpq-5>.
%% Find the Best Fitting Parameters
% Start from a random positive set of parameters |x0|, and have
% |fminsearch| find the parameters that minimize the objective function.
x0 = rand(2,1);
bestx = fminsearch(fun,x0)
%%
% The result |bestx| is reasonably near the parameters that generated the
% data, |A = 40| and |lambda = 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,'*');
hold on
plot(tdata,yfit,'r');
xlabel('tdata')
ylabel('Response Data and Curve')
title('Data and Best Fitting Exponential Curve')
legend('Data','Fitted Curve')
hold off