||
对测量数据的拟合在科学研究和工程中具有广泛的应用,下面给出几种常用的拟合方法,及其如何在MATLAB环境中实现。
在MATLAB中有用于拟合的命令 polyfit,lsqcurvefit,nlinfit 和曲线拟合工具cftool.解决一般的工程拟合问题足够了。下面给出几个常用函数。
1. 多项式拟合
p = polyfit(x,y,n) 完成数据的多项式拟合,得到多项式系数 p,按降幂排列,其中参数 x,y 是数据 $(x_i,y_i)(i=1,2,\cdots,n)$ 构成的向量,n 为多项式次数。例如
x=[1, 3, 4, 6, 7];
y = [-2.1,-0.9,-0.6, 0.6, 0.9] ;
p = polyfit(x,y,1)
p =
0.5053 -2.5421
即拟合方程为
$$y = 0.5053{}x -2.5421.$$
多项式拟合可以化为线性拟合问题求解,但是非线性拟合问题大多数情形不能化为线性拟合问题,需要直接使用求解非线性最小二乘算法,下面给出几个。
2. lsqnonlin() 函数
lsqnonlin() 函数是求解非线性最小二乘问题$\|\boldsymbol{f}(\boldsymbol{x})\|_2^2 = \sum\limits_{i=1}^{m}[f_i(\boldsymbol{x})]^2$, 使用格式为
[x, resnorm, residual, exitflag, output, lambda, jacobian] = lsqnonlin(fun,x0,lb,ub,options)
fun 为向量函数; x0 为初始点,lb,ub 分别为变量的下界和上界; options 为参数的选择项,由函数optimset 设置。 因变量~x 为非线性最小二乘问题的极小点; resnorm 为 x 处的残差平方和; residual为 x 处的残差值; exitflag 为退出条件; output 为输出求解信息; lambda 为上下界约束的Lagrange 乘子; Jacobian 为 x 处的 Jacobi 矩阵.
例如:
解非线性方程组
$\begin{cases} f_1(\textbfsymbol{x}) = x_1^2 + x_2^2 - 1=0.\\ f_2(\textbfsymbol{x}) = x_1^3-x_2=0.\\ \end{cases}$ , 取初始点~$\boldsymbol{x}^{(0)}=[-0.8,\,0.6]^T$.
>> equs = @(x)[x(1)^2+x(2)^2-1; x(1)^3-x(2)]; x0 = [-0.8;0.6];
[x, resnorm, residual, exitflag, output, lambda, jacobian] = lsqnonlin(equs,x0)
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
<stopping criteria details>
x =
-0.8260
-0.5636
resnorm =
5.7708e-27
residual =
1.0e-13 *
0.3397
-0.6795
exitflag =
1
output =
firstorderopt: 1.9521e-13
iterations: 9
funcCount: 30
cgiterations: 0
algorithm: 'trust-region-reflective'
stepsize: 1.7483e-07
message: 'Local minimum found.…'
lambda =
lower: [2x1 double]
upper: [2x1 double]
jacobian =
(1,1) -1.6521
(2,1) 2.0470
(1,2) -1.1272
(2,2) -1.0000
3. lsqcurvefit() 函数
lsqnonlin() 是非线性最小二乘拟合函数, 使用格式为
[x, resnorm, residual, exitflag, output, lambda, jacobian] = lsqnonlin(fun,x0,xdata,ydata,lb,ub,options)
fun 为向量函数; x0 为初始点; xdata,ydata 是拟合点; lb,ub 分别为变量的下界和上界; options 为参数的选择项,由函数 optimset 设置。 因变量 x 为非线性最小二乘问题的极小点; resnorm 为x 处的残差平方和; residual为 x 处的残差值; exitflag 为退出条件; output 为输出求解信息; lambda 为上下界约束的 Lagrange 乘子; Jacobian 为~x 处的~Jacobi 矩阵.
例如
已知数据
$\begin{array}{c|cccccc} \hline x_i&0.02& 0.02&0.06&0.06&0.11 &0.11\\ y_i&76& 47&97&107&123&139\\ \hline \hline x_i&0.22&0.22&0.56&0.56&1.10&1.10 \\ y_i&159&152&191&201&207&200\\ \hline \end{array}$
满足Michaelis-Menten方程
$y = \dfrac{\,p_1x\,}{p_2+x}$, 求参数 $p_1,p_2$.
xdata = [0.02, 0.02,0.06,0.06,0.11 ,0.11,0.22,0.22,0.56,0.56,1.10,1.10 ];
ydata = [76, 47,97,107,123,139,159,152,191,201,207,200];
fun = @(p,xdata)(p(1)*xdata./(p(2)+xdata)); x0 = [200;0.1];
p = lsqcurvefit(fun,x0,xdata,ydata)
运行后可得
p =
212.6836
0.0641
即拟合函数为$$y = \dfrac{\,212.6836x\,}{0.0641+x}.$$
4. nlinfit() 函数
nlinfit() 是非线性回归函数, 使用格式为
[beta,r,J,Sigma,mse] = nlinfit(X,y,fun,beta0)
参数 X 为设计矩阵; y 为响应变量; fun 为回归(拟合)函数; beta0 为初始参数; beta 为最优回归参数; r 为残差; J 为 Jacobi 矩阵; SIGMA 为参数的协方差矩阵; mse 为均方误差.
例如
已知数据
$\begin{array}{c|cccccc} \hline x_i&0.02& 0.02&0.06&0.06&0.11 &0.11\\ y_i&76& 47&97&107&123&139\\ \hline \hline x_i&0.22&0.22&0.56&0.56&1.10&1.10 \\ y_i&159&152&191&201&207&200\\ \hline \end{array}$
满足Michaelis-Menten方程
$ y = \dfrac{\,p_1x\,}{p_2+x}$, 求参数$p_1,p_2$.
x = [0.02, 0.02,0.06,0.06,0.11 ,0.11,0.22,0.22,0.56,0.56,1.10,1.10 ];
y = [76, 47,97,107,123,139,159,152,191,201,207,200];
fun = @(beta,x)(beta(1)*x./(beta(2)+x)); beta0 = [200;0.1];
beta = nlinfit(x,y,fun,beta0)
beta =
212.6836
0.0641
即拟合函数为$$y = \dfrac{\,212.6836x\,}{0.0641+x}.$$
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 00:42
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社