拟合介绍:

所谓数据拟合是求一个简单的函数,例如是一个低次多项式,不要求通过已知的这些点,而是要求在整体上“尽量好”的逼近原函数。这时,在每个已知点上就会有误差,数据拟合就是从整体上使误差,尽量的小一些。

多项式拟合

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−5xsin⁡xf(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之数据拟合相关推荐

  1. 用MATLAB求解数据拟合问题

    一.什么是拟合问题? 很多时候,我们在数学建模时,会遇到下面这样的情况 已知平面上有n个数据点     希望寻求某个函数 ,使 在某种准则下与所有数据点最为接近,称为此类数学问题为 数据拟合问题 我们 ...

  2. Matlab做数据拟合中的(Results,SSE,R-square,Adjusted R-square,RMSE)

    做Curve Fitting的时候通常会有以下信息,大家不解其意,在此做简单介绍. Results :显示当前拟合的详细结果, 包括拟合类型 (模型.样条或插值函数).拟合系数以及参数匹配的95% 置 ...

  3. MATLAB之数据拟合(附实例+代码)

    数据拟合 引例--人口预测问题 解决思路: 找一个函数,去逼近这些数据,然后再根据找到的函数,计算预测点的值.polyfit() x=1790:10:2010; y=[3.9,5.3,7.2,9.6, ...

  4. 【MATLAB】数据拟合_阶数的确定

    多项式阶数N的确定 我们在拟合数据的过程中,事先不知道要拟合的数据是几阶的,那我们如何确定给定的拟合阶数N最终为多少呢? 阶数确定方法一: 这种方法是最常用的确定方法,一般情况下,我们拟合函数的目的, ...

  5. Matlab中数据拟合函数lsqcurvefit的使用方法与常见问题

    一. lsqcurvefit()使用方法 1.lsqcurvefit使用形式如下几种 x = lsqcurvefit(fun,x0,xdata,ydata) x = lsqcurvefit(fun,x ...

  6. Matlab建模---数据拟合

    一.多项式拟合函数---polyfit和polyval 1.polyfit函数 调用格式: p=polyfit(x,y,n); [p,s]=polyfit(x,y,n); [p,s,mu]=polyf ...

  7. matlab中用数据拟合圆心,拟合圆并求圆心(matlab)

    clc clear all I=imread('a003.bmp'); [m,n,p]=size(I); I=im2bw(I); se=strel('square',3); Ia=imerode(I, ...

  8. MATLAB在数学建模中的应用 随手笔记(二)----- 数据拟合方法

    声明:本篇文章只是个人知识点归纳总结,不代表全书内容,望各位大佬不喜勿喷.梳理顺序是按照书籍的实际顺序梳理. 作者:sumjess 目前内容:第一章 数学建模常规方法及其MATLAB实现---数据拟合 ...

  9. 基于MATLAB的多项式数据拟合方法研究-毕业论文

    摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...

  10. MATLAB,Python,Pytorch实现数据拟合

    目录 1.MATLAB实现数据拟合 2.纯python实现数据拟合 3.pytorch实现数据拟合 1.MATLAB实现数据拟合 %MATLAB 数据拟合 x=linspace(-1,1,100); ...

最新文章

  1. 顶配12699 元、没有5G,“浴霸三摄”的iPhone你会买吗?
  2. python对英语和数学的帮助-文科女生学Python:学过初中数学和英语就能懂的编程逻辑...
  3. Express 的简单使用
  4. 前端文件上传-javascript-ajax
  5. android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid
  6. 折半查找判定树及平均查找长度
  7. vue-cli脚手架中webpack配置基础文件详解
  8. 详解Objective-C中委托和协议
  9. PTA19、通过两个列表构建字典 (10 分)
  10. android之ScrollView里嵌套ListView(转)
  11. iOS - Card Identification 银行卡号识别
  12. 第六节 静态的(static)和单例模式
  13. 纽微特纪事:傅某为何要内斗吾?各位应该注意什么?
  14. 微信接口_收货地址共享
  15. 短视频源码开发,短视频系统源码搭建,从短视频系统起播过程入手
  16. android停止补间动画,android 帧动画,补间动画,属性动画的简单总结
  17. 你知道吗?计算机界也有诺贝尔奖!
  18. cad布局教程_10+篇CAD三维模型一键出工程图,你掌握了?
  19. 较于微信红包,支付宝AR红包是个好产品吗?
  20. 动手学习深度学习——Pytorch版教程系列汇总(长期更新版)

热门文章

  1. SQL语法基础篇 —— 常用的SQL标准
  2. ContactsProvider系统源码导入配置AndroidStudio编译环境
  3. C与指针——指针(一)
  4. 搜集的几个超高难度的数独题
  5. excel怎么设置自动计算_Excel工作进度表,自动甘特进度图,函数计算简单实用...
  6. winxp关闭系统音频服务器,xp系统显示没有音频设备怎么办 xp系统音频驱动异常或者未安装如何解决...
  7. 计算机辅助翻译技术工具,浅析计算机辅助翻译技术对译者的影响
  8. 微软应用商店应用无法联网_微软,诺基亚应用商店-即将开业!
  9. C语言程序设计第五版谭浩强课后答案 第四章习题答案
  10. 分享一个自己写的QT小游戏-玛丽奥医生