声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2513|回复: 1

[编程技巧] 非线性拟合方法的MATLAB实现

[复制链接]
发表于 2022-6-24 15:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
对测量数据的拟合在科学研究和工程中具有广泛的应用,下面给出几种常用的拟合方法,及其如何在MATLAB环境中实现。

在MATLAB中有用于拟合的命令polyfit、lsqcurvefit、nlinfit和曲线拟合工具cftool,解决一般的工程拟合问题足够了。下面给出几个常用函数。

1、多项式拟合

p=polyfit(x,y,n) 完成数据的多项式拟合,得到多项式系数p,按降幂排列,其中参数x,y是数据(xi,yi)(i=1,2,⋯,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

即拟合方程为
1.png
多项式拟合可以化为线性拟合问题求解,但是非线性拟合问题大多数情形不能化为线性拟合问题,需要直接使用求解非线性最小二乘算法,下面给出几个。

2、lsqnonlin() 函数

lsqnonlin() 函数是求解非线性最小二乘问题
2.png
使用格式为

[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矩阵。

例如:解非线性方程组
3.png
取初始点
4.png
>> 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矩阵。

例如:已知数据
5.png
满足Michaelis-Menten方程
6.png
求参数p1p2

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

即拟合函数为
7.png

4、nlinfit() 函数

nlinfit() 是非线性回归函数,使用格式为

[beta,r,J,Sigma,mse] = nlinfit(X,y,fun,beta0)


参数X为设计矩阵;y为响应变量;fun为回归(拟合)函数;beta0为初始参数;beta为最优回归参数;r为残差;J为Jacobi矩阵;SIGMA为参数的协方差矩阵;mse为均方误差。

例如:已知数据
8.png
满足Michaelis-Menten方程
9.png
求参数p1p2

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

即拟合函数为
10.png
来源:本文来自王福昌科学网博客,作者:王福昌。

回复
分享到:

使用道具 举报

发表于 2023-11-7 15:10 | 显示全部楼层
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-27 21:00 , Processed in 0.139427 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表