非线性曲线拟合问题

非线性曲线拟合问题的数学模型为

\[{min}_{x}\frac{1}{2}{\left\| F(x,xdata)-ydata \right\|}_{2}^{2}-\frac{1}{2}\sum_{i} {(F(x,xdat{a}_{i})-ydat{a}_{i}{)}^{2}}\]

其中xdata和ydata为矢量,F(x, xdata)为矢量值函数。

MATLAB用lsqcurvefit函数进行非线性曲线的拟合。其算法与lsqnonlin函数的算法相同。设置该函数的目的是提供一个更方便于进行数据拟合的方法。

用lsqcurvefit函数求解最小二乘意义上的非线性曲线拟合(数据拟合)问题。即根据输入数据xdata和得到的输出数据ydata, 找到与方程F(x, xdata)最佳的拟合系数。该函数的调用格式为:

lsqcurvefit求解非线性数据拟合问题。lsqcurvefit需要一个用户定义函数来计算矢量值函数F(x, xdata)。用户定义的函数的矢量的大小必须与ydata的大小相同。

x = lsqcurvefit(fun, x0, xdata, ydata) 初值为x0,求非线性函数fun(x, xdata)与数据ydata在最小二乘意义上的拟合系数x。ydata的大小必须与fun函数返回的F矢量或矩阵的大小相同。

x = lsqcurvefit(fun, x0, xdata, ydata, lb, ub) 定义解x的一系列下界lb和上界ub,使得总有lb <= x <= ub。

x = lsqcurvefit(fun, x0, xdata, ydata, lb, ub, options) 用options参数指定的优化参数进行最小化。

[x,resnorm] = lsqcurvefit(...) 返回x处残差的平方和范数值:

sum{(fun(x, xdata)ydata).^2}

[x, resnorm, residual] = lsqcurvefit(...) 返回解x处的残差值:fun(x, xdata)-ydata。

[x, resnorm, residual, exitflag] = lsqcurvefit(...) 返回描述退出条件的exitflag参数。

[x, esnorm, residual, exitflag, output] = lsqcurvefit(...) 返回包含优化参数的输出结构参数output。

[x, resnorm, residual, exitflag, output, lambda] = lsqcurvefit(...) 返回包含解x处拉格朗日乘子的结构参数lambda。

[x, resnorm, residual, exitflag, output, lambda, jacobian] = lsqcurvefit(...) 返回解x处的雅可比矩阵。

【例22】 数据矢量xdata和ydata的长度为n。要求找到拟合方程的最佳系数x。

\[ydata(i)=x(1)•xdata(i{)}^{2}•x(2)•\operatorname{sin}{(}xdata(i))+x(3)•xdata(i{)}^{3}\]

即,希望最小化

\[{min}_{x}\frac{1}{2}\sum_{i=1}^{n} {(F(x,xdat{a}_{i})-ydat{a}_{i}{)}^{2}}\]

式中,F(x, xdata) = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3,初值为x0 = [0.3, 0.4, 0.1]。

首先编写一个M文件lsqcurvefito.m,返回有2个元素的F值。

code.matlab
function F = myfun(x, xdata)
F = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;

然后,调用优化过程:

code.matlab
% 假设通过试验得到数据xdata和ydata
>> xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
>> ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
>> x0 = [10, 10, 10];                    %初值
>> [x,resnorm] = lsqcurvefit(@lsqcurvefito, x0, xdata, ydata)

注意,当lsqcurvefit被调用时,假设存在xdata和ydata并且是相同大小的矢量。它们的大小必须是相同的,因为fun函数返回的F值必须与ydata有相同的大小。

计算结果为:

code.matlab
x =
    0.2269    0.3385    0.3022
resnorm =
    6.2950

残差非零,因为本例中数据还有一些噪声(试验误差)。