防灾数学分享 http://blog.sciencenet.cn/u/fzmath 防灾科技学院数学教研室

博文

非线性拟合方法的MATLAB实现

已有 30942 次阅读 2016-10-26 22:13 |系统分类:教学心得| 非线性拟合

   对测量数据的拟合在科学研究和工程中具有广泛的应用,下面给出几种常用的拟合方法,及其如何在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}.$$




https://blog.sciencenet.cn/blog-292361-1011057.html

上一篇:Newton 插值及其MATLAB实现
下一篇:一个数列极限
收藏 IP: 27.189.48.*| 热度|

1 杨正瓴

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-22 00:42

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部