第三章数据拟合 用插值的方法对一函数进行近似,要求所得到的 插值多项式经过已知插值节点;在n比较大的情 况下插值多项式往往是高次多项式,这也就容 易出现振荡现象(龙格现象),即虽然在插值 节点上没有误差,但在插值节点之外插值误差变 得很大,从“整体”上看,插值逼近效果将变得 “很差”。 所谓数据拟合是求一个简单的函数,例如是一个 低次多项式,不要求通过已知的这些点,而是要 求在整体上“尽量好”的逼近原函数。这时,在 每个已知点上就会有误差数据拟合就是从整体 上使误差尽量的小一些
第三章 数据拟合 • 用插值的方法对一函数进行近似,要求所得到的 插值多项式经过已知插值节点;在n比较大的情 况下,插值多项式往往是高次多项式,这也就容 易出现振荡现象(龙格现象),即虽然在插值 节点上没有误差,但在插值节点之外插值误差变 得很大,从“整体”上看,插值逼近效果将变得 “很差”。 • 所谓数据拟合是求一个简单的函数,例如是一个 低次多项式,不要求通过已知的这些点,而是要 求在整体上“尽量好”的逼近原函数。这时,在 每个已知点上就会有误差,数据拟合就是从整体 上使误差,尽量的小一些
3.1多项式拟合 n次多项式:8(x)=Cx"+C2x”+…+Cn+1 曲线与数据点的残差为: F=-8(x)2i=1,2,…,L 残差的平方和为: R ,2 为使其最小化,可令R关于C的偏导数为零, 即 OR 0,j=1,2,…,n+1
3.1 多项式拟合 • n次多项式: • 曲线与数据点的残差为: • 残差的平方和为: • 为使其最小化,可令R关于 的偏导数为零, 即: 1 1 2 1 ( ) n n n g x c x c x c − = + + + + ( ), 1,2, , i i i r y g x i L = − = 2 1 L i i R r = = j c 0, 1,2, , 1 j R j n c = = +
或 c1=∑xy,k=1,2…,n+1 或矩阵形式: ∑x2∑x2n.∑ ∑xy ∑xy n+1 y
• 或 • 或矩阵形式: 1 2 2 1 1 1 1 ( ) , 1,2, , 1 n L L n j k n k i j i i j i i x c x y k n + + − − + − = = = = = + 2 2 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 0 1 1 1 . . . . . . . . . . . L L L L n n n n i i i i i i i i i L L L n n n i i i i i i i L L L n n i i i i i i x x x x y c x x x y c c x x y − = = = = − − − = = = + = = = =
多项式拟合 MATLAB命令: polyfit 格式:p= polyfit(x,y,n) 其中: c和y为原始的样本点构成的向量 n为选定的多项式阶次 P为多项式系数按降幂排列得出的行向量
多项式拟合MATLAB命令:polyfit 格式:p=polyfit(x,y,n)
例已知的数据点来自f(x)=(x2-3x+5)-5xsin 用多项式拟合的方法在不同的阶次下进行拟合 拟合该数据的3次多项式 >>X0=0.1:1;y0=(x0.2-3*x0+5).eXp(-5*xO).*sin(xO) > p3=polyfit(]0, yo 3); vpa(pol oly2sym(p3),10) 6可以如下显示多项式 ans 2.839962923*x^3 4.789842696*x^2+1.943211631*x+.5975248921e-1
>> 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); >>yl-polyval(p3, x); plot(x,y l, x, ya, 0, y0, o) 0.15 006 00.10.20.3040.50.60.70.80.9
• 绘制拟合曲线: >> 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(0, y0, 8); y4-polyval(p8, x) > plot(x, ya, ]0, yo,o, x, y2, x, y3, x, y4 025 02 °0120a4006700
• 就不同的次数进行拟合: >> 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,ya,x0,y0,'o',x,y2,x,y3,x,y4)
拟合最高次数为8的多项式: vpa(poly sym(p8), 5) ans 8.2586*x^8+43.566*x^7-101.98*x^6+140.22*x^5 125.29*x^4+74450*x^3- 27672*x^2+4.9869*x+.42037e-6 Taylor幂级数展开: > syms x; y=(x2-3*x+5 )*exp(-5*x) *sin(x) > vpa(taylor(y, 9),5) ans 5.*x-28*x^2+77667*x^3-142.*x^4+192.17*x^5- 204.96*x^6+179.13*x7-131.67*x^8 多项式表示数据模型是不唯一的,即是两个多项式 函数完全不同。在某一区域内其曲线将特别近似
• 拟合最高次数为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.450*x^3- 27.672*x^2+4.9869*x+.42037e-6 • Taylor幂级数展开: >> syms x; y=(x^2-3*x+5)*exp(-5*x)*sin(x); >> vpa(taylor(y,9),5) ans = 5.*x-28.*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 • 多项式表示数据模型是不唯一的,即是两个多项式 函数完全不同。在某一区域内其曲线将特别近似
例对f(x)=1/(1+25x2),-1≤x≤1进行多项式拟合 多项式拟合的效果并不一定总是很精确的 >x0=1+2*[0:1010,y0=1.(1+25*x0.~2); >>x=-1:01:1;ya=1./(1+25*x:^2); >>p3=polyfit(xo, y0, 3) >> y1=polyval(p3, x); p5=polyfit(0, y0, 5) > y2=polyval(p5, x) p8-polyfit(x0, y0, 8) > y3=polyval(p8, x) > p10=polyfit(0, y0, 10) > y4=-polyval(p10, x) .80.6040200.2040.60.81 plot(x,ya, x,yl,x,y
多项式拟合的效果并不一定总是很精确的。 >> 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*/2); p=taylor(y, x, 10 p 1-25*x^2+625*x^4-15625*x6+390625*x^8 多项式拟合效果 >>1=-1:0.01:1; ya=1./(1+25*x1.2) 3 25 y1=subs(p, x, x1); > plot(x1, ya, -,x1,y1)s 0.5 0 180.6.40200.20.40.60.8
• 用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)