matlab之数据拟合
拟合介绍:
所谓数据拟合是求一个简单的函数,例如是一个低次多项式,不要求通过已知的这些点,而是要求在整体上“尽量好”的逼近原函数。这时,在每个已知点上就会有误差,数据拟合就是从整体上使误差,尽量的小一些。
多项式拟合
n次多项式:g(x)=c1xn+c2xn−1+⋯+cn+1g(x)=c1xn+c2xn−1+⋯+cn+1g(x) = {c_1}{x^n} + {c_2}{x^{n - 1}} + \cdots + {c_{n + 1}}
曲线与数据点的残差为:ri=yi−g(xi),i=1,2,⋯,Lri=yi−g(xi),i=1,2,⋯,L{r_i} = {y_i} - g({x_i}),\quad i = 1,2, \cdots ,L
残差的平方和为:R=∑i=1Lr2iR=∑i=1Lri2R = \sum\limits_{i = 1}^L {r_i^2}
为使其最小化,可令R关于cjcj{c_j}的偏导数为零,即:∂R∂cj=0,j=1,2,⋯,n+1∂R∂cj=0,j=1,2,⋯,n+1\frac{{\partial R}}{{\partial {c_j}}} = 0,\quad j = 1,2, \cdots ,n + 1
或:
∑j=1n+1(∑i=1Lx2n+2−j−ki)cj=∑i=1Lxn+1−kiyi,k=1,2,⋯,n+1∑j=1n+1(∑i=1Lxi2n+2−j−k)cj=∑i=1Lxin+1−kyi,k=1,2,⋯,n+1\sum\limits_{j = 1}^{n + 1} {(\sum\limits_{i = 1}^L {x_i^{2n + 2 - j - k}} } ){c_j} = \sum\limits_{i = 1}^L {x_i^{n + 1 - k}} {y_i},\;k = 1,2, \cdots ,n + 1
或矩阵形式:
[∑i=1Lx2ni∑i=1Lx2n−1i.∑i=1Lxni ∑i=1Lx2n−1i..∑i=1Lxn−1i .... ∑i=1Lxni..∑i=1Lx0i]⎡⎣⎢⎢⎢c1c2.cn+1⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∑i=1Lxniyi∑i=1Lxn−1iyi.∑i=1Lyi⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥[∑i=1Lxi2n∑i=1Lxi2n−1.∑i=1Lxin∑i=1Lxi2n−1..∑i=1Lxin−1....∑i=1Lxin..∑i=1Lxi0][c1c2.cn+1]=[∑i=1Lxinyi∑i=1Lxin−1yi.∑i=1Lyi]\left[ {\begin{array}{*{20}{c}} {\sum\limits_{i = 1}^L {x_i^{2n}} }^L {x_i^{2n - 1}} }&.^L {x_i^n} }\ {\sum\limits_{i = 1}^L {x_i^{2n - 1}} }&.&.^L {x_i^{n - 1}} }\ .&.&.&.\ {\sum\limits_{i = 1}^L {x_i^n} }&.&.^L {x_i^0} } \end{array}} \right]\left[ {\begin{array}{*{20}{c}} {{c_1}}\\ {{c_2}}\\ .\\ {{c_{n + 1}}} \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {\sum\limits_{i = 1}^L {x_i^n} {y_i}}\\ {\sum\limits_{i = 1}^L {x_i^{n - 1}{y_i}} }\\ .\\ {\sum\limits_{i = 1}^L {y_i^{}} } \end{array}} \right]
多项式拟合MATLAB命令:polyfit
**格式:**p=polyfit(x,y,n)
例1:已知的数据点来自f(x)=(x2−3x=5)e−5xsinxf(x)=(x2−3x=5)e−5xsinxf(x) = ({x^2} - 3x = 5){e^{ - 5x}}\sin x,用多项式拟合的方法在不同的阶次下进行拟合。
拟合该数据的3次多项式:
>> x0=0:.1:1; y0=(x0.^2-3*x0+5).*exp(-5*x0).*sin(x0);
>> p3=polyfit(x0,y0,3); vpa(poly2sym(p3),10) % 可以如下显示多项式
ans =
2.839962923*x^3-4.789842696*x^2+1.943211631*x+.5975248921e-1
绘制拟合曲线:
>> x=0:.01:1;
>>ya=(x.^2-3*x+5).*exp(-5*x).*sin(x);
>> y1=polyval(p3,x);
>>plot(x,y1,x,ya,x0,y0,'o')
就不同的次数进行拟合:
p4=polyfit(x0,y0,4); y2=polyval(p4,x);
p5=polyfit(x0,y0,5); y3=polyval(p5,x);
p8=polyfit(x0,y0,8); y4=polyval(p8,x);
plot(x,y0,x0,y0,'o',x,y2,'r',x,y3,'g',x,y4,'k')
拟合最高次数为8的多项式:
>> vpa(poly2sym(p8),5)
ans =- 8.2586*x^8 + 43.566*x^7 - 101.98*x^6 + 140.22*x^5 - 125.29*x^4 + 74.45*x^3 - 27.672*x^2 + 4.9869*x + 4.2037e-7
Taylor幂级数展开:
不能运行
>> syms x; y=(x^2-3*x+5)*exp(-5*x)*sin(x);
>> vpa(taylor(y,9),5)
ans =
9.*x-29.*x^2+77.667*x^3-142.*x^4+192.17*x^5-204.96*x^6+179.13*x^7-131.67*x^8
多项式表示数据模型是不唯一的,即是两个多项式函数完全不同。在某一区域内其曲线可能特别近似。
例2:对f(x)=1/(1+25x2),−1≤x≤1f(x)=1/(1+25x2),−1≤x≤1f(x) = 1/(1 + 25x2), - 1 \le x \le 1进行多项式拟合,
多项式拟合的效果并不一定总是很精确的。
>> x0=-1+2*[0:10]/10; y0=1./(1+25*x0.^2);
>> x=-1:.01:1; ya=1./(1+25*x.^2);
>> p3=polyfit(x0,y0,3);
>> y1=polyval(p3,x);
>> p5=polyfit(x0,y0,5);
>> y2=polyval(p5,x);
>> p8=polyfit(x0,y0,8);
>> y3=polyval(p8,x);
>> p10=polyfit(x0,y0,10);
>> y4=polyval(p10,x);
>> plot(x,ya,x,y1,x,y2,'-.',x,y3,'--',x,y4,':')
用Taylor幂级数展开效果将更差
>> syms x; y=1/(1+25*x^2); p=taylor(y,x,10)
p =
1-25*x^2+625*x^4-15625*x^6+390625*x^8
多项式拟合效果
>> x1=-1:0.01:1;
>> ya=1./(1+25*x1.^2);
>> y1=subs(p,x,x1);
>> plot(x1,ya,'--‘,x1,y1)
函数线性组合的曲线拟合方法
已知某函数的线性组合为:g(x)=c1f1(x)+c2f2(x)+c3f3(x)+....+cnfn(x)g(x)=c1f1(x)+c2f2(x)+c3f3(x)+....+cnfn(x)g(x) = {c_1}{f_1}(x) + {c_2}{f_2}(x) + {c_3}{f_3}(x) + .... + {c_n}{f_n}(x)
其中f1(x)f2(x)f3(x).....fn(x)f1(x)f2(x)f3(x).....fn(x){f_1}(x){f_2}(x){f_3}(x).....{f_n}(x)为已知函数
c1,c2c3.....cnc1,c2c3.....cn{c_1},{c_2}{c_3}.....{c_n}为待定系数
假设已经测出数据(x1,y1),(x2,y2),.....(xM,yM)(x1,y1),(x2,y2),.....(xM,yM)({x_1},{y_1}),({x_2},{y_2}),.....({x_M},{y_M})
则可建立如下的线性方程
Ac=yAc=yAc = y
例3:
直接拟合ci参数:
>> x=[0,0.2,0.4,0.7,0.9,0.92,0.99,1.2,1.4,1.48,1.5]';
>> y=[2.88;2.2576;1.9683;1.9258;2.0862;2.109; 2.1979;2.5409;2.9627;3.155;3.2052];
>> A=[ones(size(x)),exp(-3*x), cos(-2*x).*exp(-4*x) ,x.^2];
>> c=A\y; c1=c'
c1 =1.2200 2.3397 -0.6797 0.8700
例4:
>> x=[1.1052,1.2214,1.3499,1.4918,1.6487,1.8221,2.0138,...2.2255,2.4596,2.7183,3.6693];
>> y=[0.6795,0.6006,0.5309,0.4693,0.4148,0.3666,0.3241,...0.2864,0.2532,0.2238,0.1546];
>> plot(x,y,x,y,'*')
分别对x,y进行对数变换:
>> x1=log(x); y1=log(y); plot(x1,y1)
>> A=[x1', ones(size(x1'))]; c=[A\y1']
c =-1.2339 -0.2630
>> exp(c(2))
ans =0.7687
例5:
>> x=[0:0.1:1]'; y=(x.^2-3*x+5).*exp(-5*x).*sin(x); n=8; A=[];
>> for i=1:n+1, A(:,i)=x.^(n+1-i); end
>> c=A\y; vpa(poly2sym(c),5)
ans =
-9.2586*x^8+43.566*x^7-101.98*x^6+140.22*x^5-129.29*x^4+74.450*x^3-27.672*x^2+4.9869*x+.42037e-6
最小二乘曲线拟合
格式: [a, jm]=lsqcurvefit(Fun,a0,x,y)
例6:
由下面语句生成一组数据,其中ai为待定系数,
>> x=0:.1:10;
>> y=0.12*exp(-0.213*x)+0.54*exp(-0.17*x).*sin(1.23*x);
>> f=inline('a(1)*exp(-a(2)*x)+a(3)*…
exp(-a(4)*x).*sin(a(5)*x)','a','x');
得出待定系数向量:
>> [xx,res]=lsqcurvefit(f,[1,1,1,1,1],x,y); xx',res
Optimization terminated successfully:Relative function value changing by less than OPTIONS.TolFunans =0.12000.21300.54000.17001.2300
res =1.7927e-16
修改最优化选项:
不能运行
>> ff=optimset; ff.TolFun=1e-20; ff.TolX=1e-15; % 修改精度限制
>> [xx,res]=lsqcurvefit(f,[1,1,1,1,1],x,y,[],[],ff); xx‘,res % []变量界
Optimization terminated successfully:Relative function value changing by less than OPTIONS.TolFun
ans =0.12000.21300.54000.17001.2300
res =9.5035e-021
例7:
>> x=0.1:0.1:1;
>> y=[2.3201,2.6470,2.9707,3.2885,3.6008,3.9090,4.2147,4.5191,
4.8232,9.1275];
function y=c8f3(a,x)
y=a(1)*x+a(2)*x.^2.*exp(-a(3)*x)+a(4);
求解
a=lsqcurvefit('c8f3',[1;2;2;3],x,y); a'
Maximum number of function evaluations exceeded;increase options.MaxFunEvals
ans =2.4575 2.4557 1.4437 2.0720
绘制曲线:
>> y1=c8f3(a,x); plot(x,y,x,y1,’o’)
跑出图片
matlab之数据拟合相关推荐
- 用MATLAB求解数据拟合问题
一.什么是拟合问题? 很多时候,我们在数学建模时,会遇到下面这样的情况 已知平面上有n个数据点 希望寻求某个函数 ,使 在某种准则下与所有数据点最为接近,称为此类数学问题为 数据拟合问题 我们 ...
- Matlab做数据拟合中的(Results,SSE,R-square,Adjusted R-square,RMSE)
做Curve Fitting的时候通常会有以下信息,大家不解其意,在此做简单介绍. Results :显示当前拟合的详细结果, 包括拟合类型 (模型.样条或插值函数).拟合系数以及参数匹配的95% 置 ...
- MATLAB之数据拟合(附实例+代码)
数据拟合 引例--人口预测问题 解决思路: 找一个函数,去逼近这些数据,然后再根据找到的函数,计算预测点的值.polyfit() x=1790:10:2010; y=[3.9,5.3,7.2,9.6, ...
- 【MATLAB】数据拟合_阶数的确定
多项式阶数N的确定 我们在拟合数据的过程中,事先不知道要拟合的数据是几阶的,那我们如何确定给定的拟合阶数N最终为多少呢? 阶数确定方法一: 这种方法是最常用的确定方法,一般情况下,我们拟合函数的目的, ...
- Matlab中数据拟合函数lsqcurvefit的使用方法与常见问题
一. lsqcurvefit()使用方法 1.lsqcurvefit使用形式如下几种 x = lsqcurvefit(fun,x0,xdata,ydata) x = lsqcurvefit(fun,x ...
- Matlab建模---数据拟合
一.多项式拟合函数---polyfit和polyval 1.polyfit函数 调用格式: p=polyfit(x,y,n); [p,s]=polyfit(x,y,n); [p,s,mu]=polyf ...
- matlab中用数据拟合圆心,拟合圆并求圆心(matlab)
clc clear all I=imread('a003.bmp'); [m,n,p]=size(I); I=im2bw(I); se=strel('square',3); Ia=imerode(I, ...
- MATLAB在数学建模中的应用 随手笔记(二)----- 数据拟合方法
声明:本篇文章只是个人知识点归纳总结,不代表全书内容,望各位大佬不喜勿喷.梳理顺序是按照书籍的实际顺序梳理. 作者:sumjess 目前内容:第一章 数学建模常规方法及其MATLAB实现---数据拟合 ...
- 基于MATLAB的多项式数据拟合方法研究-毕业论文
摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...
- MATLAB,Python,Pytorch实现数据拟合
目录 1.MATLAB实现数据拟合 2.纯python实现数据拟合 3.pytorch实现数据拟合 1.MATLAB实现数据拟合 %MATLAB 数据拟合 x=linspace(-1,1,100); ...
最新文章
- 顶配12699 元、没有5G,“浴霸三摄”的iPhone你会买吗?
- python对英语和数学的帮助-文科女生学Python:学过初中数学和英语就能懂的编程逻辑...
- Express 的简单使用
- 前端文件上传-javascript-ajax
- android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid
- 折半查找判定树及平均查找长度
- vue-cli脚手架中webpack配置基础文件详解
- 详解Objective-C中委托和协议
- PTA19、通过两个列表构建字典 (10 分)
- android之ScrollView里嵌套ListView(转)
- iOS - Card Identification 银行卡号识别
- 第六节 静态的(static)和单例模式
- 纽微特纪事:傅某为何要内斗吾?各位应该注意什么?
- 微信接口_收货地址共享
- 短视频源码开发,短视频系统源码搭建,从短视频系统起播过程入手
- android停止补间动画,android 帧动画,补间动画,属性动画的简单总结
- 你知道吗?计算机界也有诺贝尔奖!
- cad布局教程_10+篇CAD三维模型一键出工程图,你掌握了?
- 较于微信红包,支付宝AR红包是个好产品吗?
- 动手学习深度学习——Pytorch版教程系列汇总(长期更新版)
热门文章
- SQL语法基础篇 —— 常用的SQL标准
- ContactsProvider系统源码导入配置AndroidStudio编译环境
- C与指针——指针(一)
- 搜集的几个超高难度的数独题
- excel怎么设置自动计算_Excel工作进度表,自动甘特进度图,函数计算简单实用...
- winxp关闭系统音频服务器,xp系统显示没有音频设备怎么办 xp系统音频驱动异常或者未安装如何解决...
- 计算机辅助翻译技术工具,浅析计算机辅助翻译技术对译者的影响
- 微软应用商店应用无法联网_微软,诺基亚应用商店-即将开业!
- C语言程序设计第五版谭浩强课后答案 第四章习题答案
- 分享一个自己写的QT小游戏-玛丽奥医生