Main Content

通过优化拟合曲线

此示例说明如何使用非线性函数对数据进行拟合。在本示例中,非线性函数是标准指数衰减曲线

y(t)=Aexp(-λt),

其中,y(t) 是时间 t 时的响应,Aλ 是要拟合的参数。对曲线进行拟合是指找出能够使误差平方和最小化的参数 Aλ

i=1n(yi-Aexp(-λti))2,

其中,时间为 ti,响应为 yi,i=1,,n。误差平方和为目标函数。

创建样本数据

通常,您要通过测量获得数据。在此示例中,请基于 A=40λ=0.5 且带正态分布伪随机误差的模型创建人工数据。

rng default % for reproducibility
tdata = 0:0.1:10;
ydata = 40*exp(-0.5*tdata) + randn(size(tdata));

编写目标函数

编写一个函数,该函数可接受参数 Alambda 以及数据 tdataydata,并返回模型 y(t) 的误差平方和。将要优化的所有变量(Alambda)置入单个向量变量 (x)。有关详细信息,请参阅求多元函数的最小值

type sseval
function sse = sseval(x,tdata,ydata)
A = x(1);
lambda = x(2);
sse = sum((ydata - A*exp(-lambda*tdata)).^2);

将此目标函数保存为 MATLAB® 路径上名为 sseval.m 的文件。

fminsearch 求解器适用于一个变量 x 的函数。但 sseval 函数包含三个变量。额外变量 tdataydata 不是要优化的变量,而是用于优化的数据。将 fminsearch 的目标函数定义为仅含有一个变量 x 的函数:

fun = @(x)sseval(x,tdata,ydata);

有关包括额外参数(例如 tdataydata)的信息,请参阅参数化函数

求最优拟合参数

从随机正参数集 x0 开始,使用 fminsearch 求使得目标函数值最小的参数。

x0 = rand(2,1);
bestx = fminsearch(fun,x0)
bestx = 2×1

   40.6877
    0.4984

结果 bestx 与生成数据的参数 A = 40lambda = 0.5 相当接近。

检查拟合质量

要检查拟合质量,请绘制数据和生成的拟合响应曲线。根据返回的模型参数创建响应曲线。

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

Figure contains an axes object. The axes object with title Data and Best Fitting Exponential Curve, xlabel tdata, ylabel Response Data and Curve contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Fitted Curve.

相关主题