matlab-非线性拟合函数lsqcurvefit的使用和初值选取
所解决问题:
我们知道我们的表达式是y=A+B*exp(-x.^2)-C./log(x), 而且现在我们手里面有x与y对应的一大把数据。
我们需要根据x, y的值找出最佳的A、B、C值。则我们现在借助Matlab的函数lsqcurvefit,当然你也可以使用nlinfit、lsqnonlin甚至cftool拟合工具箱.其具体用法请自己用Matlab的帮助命令进行查看。这里仅简单介绍一下常用的函数lsqcurvefit。
正文:
格式:lsqcurvefit(f,a,x,y)
f: 符号函数句柄,如果是以m文件的形式调用的时候,别忘记加@.这里需要注意,f函数的返回值是和y匹对的,即拟合参数的标准是(f-y)^2取最小值,具体看下面的例子
a:最开始预估的值(预拟合的未知参数的估计值)。如上面的问题如果我们预估A为1,B为2,C为3,则a=[1 2 3]
x:我们已经获知的x的值
y:我们已经获知的x对应的y的值
例:
问题:对于函数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
[A,resnorm]=lsqcurvefit(f,a,x,y) %resnorm残差平方和 A是参数
答案是 A = 8.0000 12.0000 resnorm =7.7179e-20
问题:我们知道函数是 y=A+B*exp(-(x/C).^2), 以及x y的数据
xdata=[950;1150;1350];
ydata=[200;100;50];
fun1 = @(x,xdata)x(1)+x(2)*exp(-(xdata./x(3)).^2); %自定义函数类型
X0=[0,1120,740]; %初始参数
[X,resnorm]=lsqcurvefit(fun1,X0,xdata,ydata); %resnorm残差平方和 X是参数
disp(X) %得到所求参数 %画图
xi=800:1500;
yi=fun1(X,xi); %调用函数句柄
plot(xi,yi)
hold on
plot(xdata,ydata,'or')
关于这个问题,我们发现它的初值设置的非常巧妙,对于初值的选取,我在大佬的一篇文章(http://blog.163.com/shikang999@126/blog/static/172624896201463111856714/)阅读到:
拟合初值的选取问题
因为初值对拟合速度甚至结果有一定影响,因此这里就简单说一下确定数学模型后,拟合非线性问题时,初值的选取的问题。
1、如果已知数学模型,有一定物理意义,则建议根据物理意义选取。
2、当无法确定初值时,且你的数学模型有导数(如果求导模型很复杂甚至没有导数,则可进行简单的差分构造),则可以采用如下的办法进行
步骤:
(1)求出拟合函数的一阶导数【如果有必要可求更高阶导数】
(2)使用已知数据求出近似点的一阶导数
(3)代入一阶导数函数以及原函数求得初值近似值
例子:
已知一组数据x、y满足如下关系式,求拟合数据a、b、c、d的初始近似值
y = a + b * (x - c) ^ d
步骤:
(1) y' = b * d * (x - c) ^ (d - 1)
(2)因为已知x、y数据,则根据差分法( y'=(y2-y1)/(x2-x1) )求得一组x、y' 的近似值,这里记 f = y'
(3)将x、y' 代入(1)式的方程得到如下三个方程进而求解出b、c、d
f[1] = b * d * (x[1] - c) ^ (d - 1) ①
f[2] = b * d * (x[2] - c) ^ (d - 1) ②
f[3] = b * d * (x[3] - c) ^ (d - 1) ③
(4)取任意一组x、y然后将b、c、d一起代入原方程 y = a + b * (x - c) ^ d 进而可以求得近似值 a
(5)至此 a、b、c、d初始近似值确定完毕!
例:(多元的情况,注意看格式)
问题:我们已知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.5000 13.8000
matlab-非线性拟合函数lsqcurvefit的使用和初值选取的更多相关文章
- matlab的拟合函数polyfit()函数
matlab的多项式拟合: polyfit()函数 功能:在最小二乘法意义之上,求解Y关于X的最佳的N次多项式函数. clc;clear; close all; x=[ ]; y=[2.7 7.4 2 ...
- matlab最小二乘法数据拟合函数详解
定义: 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可 以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小. ...
- MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据)
MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在MATLAB中“fitgmdis ...
- matlab多项式拟合以及指定函数拟合
clc;clear all;close all;%% 多项式拟合指令:% X = [1 2 3 4 5 6 7 8 9 ];% Y = [9 7 6 3 -1 2 5 7 20]; % P= poly ...
- MATLAB中拟合算法刚入门
%%%1.拟合问题:(做预测,主要使用的范围是样本比较小,拟合效果会好,样本比较多,拟合的效果就不是很好) 1.应用预测的场景:已经知道10年的样本,预测第11年以内的数据 2.用拟合的到关系式:样本 ...
- [matlab] 1.拟合
x = [1 2 3 4 5 6 7 8 9 ]; y = [9 7 6 3 -1 2 5 7 20]; p=polyfit(x,y,3); %数字代表拟合函数的阶数 xi=0:0.01:10; yi ...
- 『转载』Matlab中fmincon函数获取乘子
Matlab中fmincon函数获取乘子 一.输出结构 [x,fval,exitflag,output,lambda] = fmincon(......) 二.结构说明 lambda结构 说 ...
- 非线性方程(组):MATLAB内置函数 solve, vpasolve, fsolve, fzero, roots [MATLAB]
MATLAB函数 solve, vpasolve, fsolve, fzero, roots 功能和信息概览 求解函数 多项式型 非多项式型 一维 高维 符号 数值 算法 solve 支持,得到全部符 ...
- Java 使用 Apache commons-math3 线性拟合、非线性拟合实例(带效果图)
Java 使用 CommonsMath3 的线性和非线性拟合实例,带效果图 例子查看 GitHub Gitee 运行src/main/java/org/wfw/chart/Main.java 即可查看 ...
随机推荐
- C#获取程序运行时间
需要用到System.Diagnostics名称空间中的Stopwatch类! Stopwatch类其中有一个属性ElapsedMilliseconds.该属性是获取当前运行时间,以毫秒为单位! 其中 ...
- LNMP(二)
第二十一课 LNMP(二) 目录 一.默认虚拟主机 二.Nginx用户认证 三.Nginx域名重定向 四.Nginx访问日志 五.Nginx日志切割 六.静态文件不记录日志和过期时间 七.Nginx防 ...
- es6新增 set
Set 基本用法 ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数,用来生成Set数据结构. var s = new Set(); [2, ...
- Msfvenom学习总结
1. –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...
- A Network-based End-to-End Trainable Task-oriented Dialogue System
abstract 让机器去和人类自然的交谈是具有挑战性的.最近的任务型对话系统需要创造几个部分并且通常这需要大量的人工干预,或者需要标注数据去解决各部分训练的问题.在这里我们提出了一种端到端的任务型对 ...
- 学号 20175223 《Java程序设计》第2周学习总结
学号 20175223 <Java程序设计>第2周学习总结 教材学习内容总结 第二章要点: 要点1:标识符与关键字 要点2:基本数据类型:逻辑类型boolean,整数类型int|byte| ...
- repeter 控制一行中显示几条内容
repeter 控制一行中显示几条内容 <asp:Repeater ID="Repeater1" runat="server" DataSourceID ...
- django 简易版搭建
1.根目录下创建mysql.cnf文件 [client]database = identimguser = rootpassword = roothost = 127.0.0.1port = 3306 ...
- 如何在 Windows 中设置 /3GB 启动开关
备注: 只有在下列操作系统中才支持 /3GB 开关: Windows 2000 Advanced Server Windows 2000 Datacenter Server Windows Serve ...
- CodeForces - 660D:Number of Parallelograms (问N个点多少个平行四边形)
pro:给定N个点,问多少个点组成了平行四边形.保证没有三点共线. sol:由于没有三点贡献,所以我们枚举对角线,对角线的中点重合的就是平行四边形.如果没说保证三点不共线就不能这么做,因为有可能4个点 ...