特定式子的非线性拟合(使用于数据较少的的时候)
来源:互联网 发布:出库软件哪个好 编辑:程序博客网 时间:2024/06/03 12:43
问题:有些时候我们需要拟合一些非线性的表达式。
比如:我们知道一个表达式的式子是y=A*sin(x).*exp(x)-B./log(x),现在我们手里面有x与y对应的一大把数据。我们如何根据x,y的值找出最佳的A、B值。则我们现在借助Matlab的函数lsqcurvefit、nlinfit,当然你也可以使用lsqnonlin.其具体用法请自己用Matlab的帮助命令进行查看。这里仅简单介绍一下常用的方式。
注意:如果对初值比较敏感,涉及到初值设置的问题;以及拟合表达式包含积分表达式或者微分项等问题;以及一些拟合降维的问题,可以参看我的另一篇博文《数据拟合遇见》
PS:如果使用Matlab以上函数拟合不出理想的结果的话,可以尝试使用我自己写的《数学计算器》里的nlinFit、nlinFit2、nlinFit4、nlinFitDE、nlinFitGA、nlinFitLM、nlinFitPSO、nlinFitPSO2、nlinFitPSO3函数
格式:lsqcurvefit(f,a,x,y)、nlinfit(x,y,f,a)
f:符号函数句柄,如果是以m文件的形式调用的时候,别忘记加@.这里需要注意,f函数的返回值是和y匹对的,即拟合参数的标准是(f-y)^2取最小值,具体看下面的例子
a:最开始预估的值(预拟合的未知参数的估计值)。如上面的问题如果我们预估A为1,B为2,则a=[1 2]
x:我们已经获知的x的值
y:我们已经获知的x对应的y的值
例子1:
问题:对于函数y=a*sin(x)*exp(x)-b/log(x)我们现在已经有多组(x,y)的数据,我们要求最佳的a,b值
%针对上面的问题,我们可以来演示下如何使用这个函数以及看下其效果
x=2:10;
y=8*sin(x).*exp(x)-12./log(x);
%上面假如是我们事先获得的值
a=[1 2];
f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);
%第一种方法使用lsqcurvefit
lsqcurvefit(f,a,x,y)
ans =
7.999999999999987 11.999999999988997%和我们预期的值8和12结合得非常好
%第二种方法使用nlinfit
nlinfit(x,y,f,a)
ans =
8.000000000000000 11.999999999999998
%************************
%另一种方法,假如我们写了一个如下的m文件
function f=test(a,x)
f=a(1)*sin(x).*exp(x)-a(2)./log(x);
end
%则在上面lsqcurvefit函数调用如下,不要忘记那个@
lsqcurvefit(@test,a,x,y)
例子2:(多元的情况,注意看格式)
问题:我们已知z=a*(exp(y)+1)-sin(x)*b且有多组(x,y,z)的值,现在求最佳系数a,b
x=2:10;
y=10*sin(x)./log(x);
z=4.5*(exp(y)+1)-sin(x)*13.8;
f=@(a,x)a(1)*(exp(x(2,:))+1)-sin(x(1,:))*a(2);
%第一种方法使用lsqcurvefit
lsqcurvefit(f,[1 2],[x;y],z)%注意这里面的[x;y],这里的[1 2]表示我们设置f函数里的初始值a(1)=1,,a(2)=2
ans =
4.499999999999999 13.800000000000024
%第二种方法使用nlinfit
nlinfit([x;y],z,f,[1 2])
ans =
4.500000000000000 13.799999999999956
>
例子3:
%编写M文件(curvefun.m)
function f = curvefun(x,tdata)
f = x(1) +x(2)*exp(-0.02*x(3)*tdata); %其中x(1) = a;x(2) = b;x(3) = k;
%编写程序
tdata = linspace(100,1000,10);
cdata = 1e-05.*[454 499 535 565 590 610 626 639 650 659];
x0 = [0.2,0.05,0.05];
opts = optimset(‘lsqcurvefit’);
opts = optimset(opts,’PrecondBandWidth’,0)
x = lsqcurvefit(’curvefun’,x0,tdata,cdata,[],[],opts)
f = curvefun(x,tdata)
plot(tdata,cdata,’o’,tdata,f,’r-‘)
xlabel(‘时间/s’)
ylabel(‘浓度/(mg.cm^-3)’)
- 特定式子的非线性拟合(使用于数据较少的的时候)
- 特定函数的数据拟合
- (iOS开发)当tableView数据较少的时候,隐藏下面,并显示白色
- 椭圆拟合的函数式子以及绘制外接矩形
- matlab非线性拟合所碰到的问题
- BP神经网络的非线性函数拟合
- 正则表达式子的使用
- 一些常用的 正则表达式,区别于网上其他式子。
- 关于采用matlab进行指定非线性方程拟合的问题
- 插值、拟合、线性和非线性的区别
- 有错误较少的房间。
- 曲率的基本概念 (式子记住!)
- 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
- 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
- 数据拟合---使用自定义函数进行非线性拟合 -在Origin。matlab拟合工具箱cftool
- 获取listview的所有子目录高度(使用item较少情况)
- 线性、非线性分类器&数据的线性、非线性
- 关于括号式子的计数
- protocol .proto文件转.java文件
- Unity_NGUI基础控件_ScrollView_042
- Hive集合数据类型
- linux zip,linux下打包zip文件
- red_black_tree的一个实现(c/c++)
- 特定式子的非线性拟合(使用于数据较少的的时候)
- 查看进程所消耗的内存脚本
- Keras实现一个简单的Regression回归
- 模板方法模式--大步骤一样小实现不同
- 手把手叫你如何集成高德地图,实现地图显示、定位蓝点、大头针显示、获取周围地点信息等
- “多进程”,你不知道的事(下)
- Window系统中MySql 5.7.19 忘记密码该怎么改回来
- HTML-子div在父div中垂直居中
- python002 Python3 基础语法