非线性曲线拟合问题的数学模型为
其中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。
即,希望最小化
式中,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值。
function F = myfun(x, xdata)
F = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;
然后,调用优化过程:
% 假设通过试验得到数据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有相同的大小。
计算结果为:
x =
0.2269 0.3385 0.3022
resnorm =
6.2950
残差非零,因为本例中数据还有一些噪声(试验误差)。