1. 程式人生 > >三次樣條擬合典型例項

三次樣條擬合典型例項

1設計目的、要求

   對龍格函式在區間[-1,1]上取的等距節點,分別作多項式插值、三次樣條插值和三次曲線擬合,畫出及各逼近函式的圖形,比較各結果。

2設計原理

(1)   多項式插值:利用拉格朗日多項式插值的方法,其主要原理是拉格朗日多項式,即:

表示待插值函式的個節點,

,其中;

(2)   三次樣條插值:三次樣條插值有三種方法,在本例中,我們選擇第一邊界條件下的樣條插值,即兩端一階導數已知的插值方法:

(3)三次曲線擬合:本題中採用最小二乘法的三次多項式擬合。最小二乘擬合是利用已知的資料得出一條直線或者曲線,使之在座標系上與已知資料之間的距離的平方和最小。在本題中,n= 10,故有11個點,以這11個點的和值為已知資料,進行三次多項式擬合,設該多項式為,該擬合曲線只需的值最小即可。

3採用軟體、裝置

   計算機、matlab軟體

4設計內容

1、多項式插值:

在區間上取的等距節點,帶入拉格朗日插值多項式中,求出各個節點的插值,並利用matlab軟體建立m函式,畫出其圖形。

在matlab中建立一個lagrange.m檔案,裡面程式碼如下:

%lagrange 函式

functiony=lagrange(x0,y0,x)

n=length(x0);m=length(x);

for i=1:m

    z=x(i);

    s=0.0;

    for k=1:n

        p=1.0;

        for j=1:n

            if j~=k

                p=p*(z-x0(j))/(x0(k)-x0(j));

            end

        end

        s=p*y0(k)+s;

    end

    y(i)=s;

end

建立一個polynomial.m檔案,用於多項式插值的實現,程式碼如下:

%lagrange插值

x=[-1:0.2:1];

y=1./(1+25*x.^2);

x0=[-1:0.02:1];

y0=lagrange(x,y,x0);

y1=1./(1+25*x0.^2);

plot(x0,y0,'--r')

%插值曲線

hold on

%原曲線

plot(x0,y1,'-b')

執行duoxiangshi.m檔案,得到如下圖形:

 

2、三次樣條插值:

所謂三次樣條插值多項式是一種分段函式,它在節點分成的每個小區間上是3次多項式,其在此區間上的表示式如下:

因此,只要確定了的值,就確定了整個表示式,的計算方法如下:

令:

則滿足如下個方程:

對於第一種邊界條件下有

如果令那麼解就可以為

求函式的二階導數:

>> syms x

>> f=sym(1/(1+25*x^2))

f =

1/(1+25*x^2)

>> diff(f)

ans =

-(50*x)/(25*x^2 + 1)^2

將函式的兩個端點,代入上面的式子中:

f’(-1)= 0.0740

f’(1)=-0.0740

求出從-1到1的n=10的等距節點,對應的x,y值

 對應m檔案程式碼如下:

for x=-1:0.2:1

   y=1/(1+25*x^2)

end

y =

得出

x=-1 -0.8  -0.6  -0.4 -0.2  0  0.2 0.4  0.6  0.8  1

y=0.0385 0.0588  0.1  0.2 0.5  1  0.5 0.2  0.1  0.0588 0.0385

編寫m檔案Three_Spline.m

x=linspace(-1,1,11);

y=1./(1+25*x.^2);

[m,p]=scyt1(x,y,0.0740,-0.0740);

hold on

x0=-1:0.01:1;

y0=1./(1+25*x0.^2);

plot(x0,y0,'--b')

得到如下影象:

.

其中藍色曲線為原圖,紅色曲線為擬合後的影象。

3、三次曲線擬合:

這裡我們使用最小二乘法的3次擬合

建立一個Three_fitting .m檔案,程式碼如下

%主要程式碼

x=[-1-0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1];

y=[0.03850.0588 0.1 0.2 0.5 1 0.5 0.2 0.1 0.0588 0.0385];

a=polyfit(x,y,3);

x1=[-1:0.01:1];

y1=a(4)+a(3)*x1+a(2)*x1.^2+a(1)*x1.^3;

x0=[-1:0.01:1];

y0=1./(1+25*x0.^2)

%原曲線

plot(x0,y0,'-r')

holdon

%三次擬合曲線

plot(x1,y1,'-b')

上圖中,藍色部分為三次擬合曲線,紅色部分為原曲線

6結果分析

拉格朗日插值的優點是對於某一區域,不限於被估計點周圍,公式簡單易實施。一般認為n的次數越高,逼近的精度就越好,但在本題中,對龍格函式,中間部分插值效果比較好,而對於兩端,插值結果是非常不理想的,即龍格現象。樣條函式可以給出光滑的插值曲線,從本題中就能體現出來。從以上圖形可以看出,三次樣條插值的圖形是比較逼近於原圖的,收斂性相對而言是非常好的,但在本題中,僅將原區間分成10個等距區間,因此,逼近效果還不是特別理想,當我們將n增大時,插值後的曲線越逼近於原曲線。總的來說,三次樣條插值的穩定性比較好,收斂性比較強。

在這三種方法中,三次曲線擬合的效果是最差的,所得的圖形與原曲線差距甚遠。最小二乘法中,並不要求擬合後的曲線經過所有已知的點,只需要擬合多項式上的點在某種標準上與定點之間的差距最小即可,因此與原曲線的逼近程度是最差的。最小二乘法的多項式擬合只適用於多項式,而本題中的函式並不是一個多項式,因此,不建議使用最小二乘法擬合。

參考文獻:

[1] 李慶揚 王能超等.數值分析[M].清華大學出版社

[2] 吳振遠.科學計算實驗指導書 基於MATLAB數值分析[M]. 中國地質大學出版社

[3] 宋葉志. MATLAB數值分析與應用[M].機械工業出版社 , 2009.07

附錄

三次樣條插值主要程式碼:

function [m,p]=scyt1(x,y,df0,dfn)

n=length(x);

r=ones(n-1,1);

u=ones(n-1,1);

d=ones(n,1);

r(1)=1;

d(1)=6*((y(2)-y(1))/(x(2)-x(1))-df0)/(x(2)-x(1));

u(n-1)=1;

d(n)=6*(dfn-(y(n)-y(n-1))/(x(n)-x(n-1)))/(x(n)-x(n-1));

for k=2:n-1                  

   u(k-1)=(x(k)-x(k-1))/(x(k+1)-x(k-1)); r(k)=(x(k+1)-x(k))/(x(k+1)-x(k-1));

   d(k)=6*((y(k+1)-y(k))/(x(k+1)-x(k))-(y(k)-y(k-1))/(x(k)-x(k-1)))/(x(k+1)-x(k-1));

end

A=eye(n,n)*2;

for k=1:n-1

   A(k,k+1)=r(k);

   A(k+1,k)=u(k);

end

m=A\d;

ft=d(1);

syms t

for k=1:n-1           %求s(x)即插值多項式

   p(k,1)=m(k)/(6*(x(k+1)-x(k)));

   p(k,2)=m(k+1)/(6*(x(k+1)-x(k)));

   p(k,3)=(y(k)-m(k)*(x(k+1)-x(k))^2/6)/(x(k+1)-x(k));

   p(k,4)=(y(k+1)-m(k+1)*(x(k+1)-x(k))^2/6)/(x(k+1)-x(k));

 sx(k)=p(k,1)*(x(k+1)-t)^3+p(k,2)*(t-x(k))^3+p(k,3)*(x(k+1)-t)+p(k,4)*(t-x(k));

end

kmax=1000;

xt=linspace(x(1),x(n),kmax);

for i=1:n-1                   %出點xt對應的y值

   for k=1:kmax

     if x(i)<=xt(k)&xt(k)<=x(i+1)

        fx(k)=subs(sx(i),xt(k));

   end

end

end

plot(xt,fx,'r');  xlabel('x');

ylabel('y');  title('f');

text(x(fix(n/2)),y(fix(n/2)),'f')

hold on

plot(x,y,'*')

hold off

相關推薦

典型例項

1設計目的、要求    對龍格函式在區間[-1,1]上取的等距節點,分別作多項式插值、三次樣條插值和三次曲線擬合,畫出及各逼近函式的圖形,比較各結果。 2設計原理 (1)   多項式插值:利用拉格朗日多項式插值的方法,其主要原理是拉格朗日多項式,即: 表示待插值函式的個節點

fortran插值程式例項

Program testspline implicit none integer :: i integer, parameter :: n = 50, m = 100, dp = 8 real(dp) :: x(n), y

Matlab法插值

end for 直接 mat wid tla 文獻 nbsp 出現 以N方向為例: 1、將N方向數據導入Matlab,將十進制年轉化為年積日 2、重新排序,將缺失數據的天數以NaN補齊 3、尋找出NaN所在的天數 nxx = find( isnan(n) ); 4、

【 MATLAB 】MATLAB 實現模擬訊號取樣後的重建()應用函式spline實現內插

前三篇博文講了三種方法進行內插重建訊號: 這篇文章使用三次樣條函式spline來實現內插重建,並分析重建誤差。 採用的案例依然是上篇博文中的案例: 模擬訊號: 對該訊號使用兩種不

MATLAB 插值原始碼

MATLAB 原始碼: function yy = Interpolation_Spline0(x, y, xx) %{ 函式功能:三次樣條插值法; 輸入: x:已知點橫座標; y:已知點縱座標; xx:插值點; 輸出: yy:插值點的函式值; 示例: clear; clc; x

數值分析用matlab求解插值多項式

數值分析用matlab求解三次樣條插值多項式 時間真快,2018年只剩下2天,2019年即將來臨! 今晚整理筆記本中的資料,看了下之前給朋友解答的一個《數值分析》實驗題目,還是有點意思。不管怎樣,分享給需要的朋友,希望有所幫助! 給定函式,及節點如下: 求其三次樣條插值多項式(

插值演算法的C++實現

標頭檔案: /* * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), [email protected] * * This program is free software; you can redistri

曲線座標系與直角座標系轉換(二)——基礎:插值原理(cubic spline)

一、引入 上一篇提到插值多項式,幾次函式就稱為幾次樣條函式如, 二次樣條函式為:f(x) = a*x^2 + b*x + c 三次樣條函式為:f(x) = a*x^3 + b^x^2 + c*x +d x=[1,3,5,7,9]; y=[2,4,6,8,10];有5個節點,4個區

採用Cardinal法構造插枝分段曲線 : 實戰篇

本文由timewolf完成,首發於CSDN,作者保留版權。未經許可,不得使用於任何商業用途。如需聯絡請發郵件:karla9(AT)eyou(dot)com 下面會給出一個簡單的例子: 在視窗上用滑鼠點8個點,然後就會將這8個點的座標畫出來~~~, 我共總用了3

採用Cardinal法構造插枝分段曲線 : 程式碼篇

說明:Spline類就是Cardinal樣條曲線了,這個類裡面記錄了4個控制點:m_startControlPoint, m_startPoint, m_endPoint, m_endControlPoint, 分別按順序對應Pk-1, Pk, Pk+1, Pk+2, 由於C

Cubic spline(插值)(轉載)

轉自:http://blog.csdn.net/lsxpu/article/details/38849775 自己以前上過數值分析這門課,用的是[1]這本教材,三次樣條插值這一節,當時似乎看明白了,但在實際碰到它時,總覺得很神祕,也很心虛。過了好幾年之後,想徹底理解這個

用matlab程式實現求解插值

X =[ 0,0.2,0.4,0.6,0.8,1.0]; Y=[1.0, 0.818732, 0.670320, 0.548812, 0.449329, 0.367879]; cs = csapi(

Matlab之畫圖和表示式

    這一題是得到資料點(0,3),(1,5),(2,4),(3,1)並得到它的三次樣條表示式和畫出三次樣條後的圖圖形。     以及對資料點(-1,3),(0,5),(3,1),(4,1),(5,1)並得到它的三次樣條表示式和畫出三次樣條後的圖圖形。     用函

Matlab 插值多項式表示

Matlab Spline pp.coefs 如何運用MATLAB 三次樣條插值的問題,今天做作業,突然想用Matlab搞搞。 題目如下: 清華大學出版社的《數值分析(第5版)》 P49,20題。 x=[0.25 0.3 0.39 0.45 0.53]; y=[ 0

C++實現插值演算法

程式中函式說明: 用float f(int x1, int x2, int x3)來寫函式; 用void cal_m(int n)來解係數; 用void printout(int n)來確定次數。 三次樣條插值演算法(壓緊樣條)原始碼: //#incl

Opencv 曲線(Cubic Spline)插值

1.樣條曲線簡介 樣條曲線(Spline)本質是分段多項式實函式,在實數範圍內有:S:[a,b]→R,在區間[a,b]上包含k個子區間[ti−1,ti],且有: a=t0<t1<⋯<tk−1<tk=b(1) 對應每一段區

交換機靜態路由&VLAN配置例項(華為)

/*telnet配置請回顧之前的部落格*/ LSW1 vlan batch 2 to 3 12            //2 和 3 為PC1和PC2 的VLAN  12為LSW1與LSW2的直連VLAN interface Vlanif2        

Matlab學習手記——二多項式曲面

二次多項式曲面公式     總共有6個係數。     繪製曲面圖形時,一般給定x和y的取值(一維陣列),然後對x和y網格化成二維陣列X和Y,將X和Y代入公式,即可得到曲面的數值,最後用surf函式顯示。 例項         給定一個二次多項式模型,然後成圖 x

Matlab工具箱(Spline ToolBox)與曲線

MATLAB 樣條工具箱可以通過節點獲得樣本函式值,但不能根據x求y或z,也不能求得樣本曲線方程。例如:ctrlpoints=[    0    -1.2   -1.6   -1.4   -1    -0.5  -0.35  -0.6  -1.6 -0.2    -0.5  

(27)插值曲線

三次插值樣條曲線在靈活性和計算速度之間進行了合理的折中。與更高次樣條相比,三次插值樣條只需較少的計算和儲存,且較穩定。與二次插值樣條相比,三次插值樣條在模擬任意形狀時顯得更靈活。 三次插值樣條曲線由