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