cubic演算法
『壹』 TCP那些事兒
目錄:
以前我也認為TCP是相當底層的東西,我永遠不需要去了解它。雖然差不多是這樣,但是實際生活中,你依然可能遇見和TCP演算法相關的bug,這時候懂一些TCP的知識就至關重要了。( 本文也可以引申為,系統調用,操作系統這些都很重要,這個道理適用於很多東西 )
這里推薦一篇小短文, 人人都應該懂點TCP
使用TCP協議通信的雙方必須先建立TCP連接,並在內核中為該連接維持一些必要的數據結構,比如連接的狀態、讀寫緩沖區、定時器等。當通信結束時,雙方必須關閉連接以釋放這些內核數據。TCP服務基於流,源源不斷從一端流向另一端,發送端可以逐位元組寫入,接收端可以逐位元組讀出,無需分段。
需要注意的幾點:
TCP狀態(11種):
eg.
以上為TCP三次握手的狀態變遷
以下為TCP四次揮手的狀態變遷
伺服器通過 listen 系統調用進入 LISTEN 狀態,被動等待客戶端連接,也就是所謂的被動打開。一旦監聽到SYN(同步報文段)請求,就將該連接放入內核的等待隊列,並向客戶端發送帶SYN的ACK(確認報文段),此時該連接處於 SYN_RECVD 狀態。如果伺服器收到客戶端返回的ACK,則轉到 ESTABLISHED 狀態。這個狀態就是連接雙方能進行全雙工數據傳輸的狀態。
而當客戶端主動關閉連接時,伺服器收到FIN報文,通過返回ACK使連接進入 CLOSE_WAIT 狀態。此狀態表示——等待伺服器應用程序關閉連接。通常,伺服器檢測到客戶端關閉連接之後,也會立即給客戶端發送一個FIN來關閉連接,使連接轉移到 LAST_ACK 狀態,等待客戶端對最後一個FIN結束報文段的最後一次確認,一旦確認完成,連接就徹底關閉了。
客戶端通過 connect 系統調用主動與伺服器建立連接。此系統調用會首先給伺服器發一個SYN,使連接進入 SYN_SENT 狀態。
connect 調用可能因為兩種原因失敗:1. 目標埠不存在(未被任何進程監聽)護著該埠被 TIME_WAIT 狀態的連接佔用( 詳見後文 )。2. 連接超時,在超時時間內未收到伺服器的ACK。
如果 connect 調用失敗,則連接返回初始的 CLOSED 狀態,如果調用成功,則轉到 ESTABLISHED 狀態。
客戶端執行主動關閉時,它會向伺服器發送一個FIN,連接進入 TIME_WAIT_1 狀態,如果收到伺服器的ACK,進入 TIME_WAIT_2 狀態。此時伺服器處於 CLOSE_WAIT 狀態,這一對狀態是可能發生辦關閉的狀態(詳見後文)。此時如果伺服器發送FIN關閉連接,則客戶端會發送ACK進行確認並進入 TIME_WAIT 狀態。
流量控制是為了控制發送方發送速率,保證接收方來得及接收。
接收方發送的確認報文中的窗口欄位可以用來控制發送方窗口大小,從而影響發送方的發送速率。將窗口欄位設置為 0,則發送方不能發送數據。
如果網路出現擁塞,分組將會丟失,此時發送方會繼續重傳,從而導致網路擁塞程度更高。因此當出現擁塞時,應當控制發送方的速率。這一點和流量控制很像,但是出發點不同。 流量控制是為了讓接收方能來得及接收,而擁塞控制是為了降低整個網路的擁塞程度。
TCP 主要通過四種演算法來進行擁塞控制: 慢開始、擁塞避免、快重傳、快恢復。
在Linux下有多種實現,比如reno演算法,vegas演算法和cubic演算法等。
發送方需要維護一個叫做擁塞窗口(cwnd)的狀態變數,注意擁塞窗口與發送方窗口的區別:擁塞窗口只是一個狀態變數,實際決定發送方能發送多少數據的是發送方窗口。
為了便於討論,做如下假設:
發送的最初執行慢開始,令 cwnd=1,發送方只能發送 1 個報文段;當收到確認後,將 cwnd 加倍,因此之後發送方能夠發送的報文段數量為:2、4、8 ...
注意到慢開始每個輪次都將 cwnd 加倍,這樣會讓 cwnd 增長速度非常快,從而使得發送方發送的速度增長速度過快,網路擁塞的可能也就更高。設置一個慢開始門限 ssthresh,當 cwnd >= ssthresh 時,進入擁塞避免,每個輪次只將 cwnd 加 1。
如果出現了超時,則令 ssthresh = cwnd/2,然後重新執行慢開始。
在接收方,要求每次接收到報文段都應該對最後一個已收到的有序報文段進行確認。例如已經接收到 M1 和 M2,此時收到 M4,應當發送對 M2 的確認。
在發送方,如果收到三個重復確認,那麼可以知道下一個報文段丟失,此時執行快重傳,立即重傳下一個報文段。例如收到三個 M2,則 M3 丟失,立即重傳 M3。
在這種情況下,只是丟失個別報文段,而不是網路擁塞。因此執行快恢復,令 ssthresh = cwnd/2 ,cwnd = ssthresh,注意到此時直接進入擁塞避免。
慢開始和快恢復的快慢指的是 cwnd 的設定值,而不是 cwnd 的增長速率。慢開始 cwnd 設定為 1,而快恢復 cwnd 設定為 ssthresh。
發送端的每個TCP報文都必須得到接收方的應答,才算傳輸成功。
TCP為每個TCP報文段都維護一個重傳定時器。
發送端在發出一個TCP報文段之後就啟動定時器,如果在定時時間類未收到應答,它就將重發該報文段並重置定時器。
因為TCP報文段最終在網路層是以IP數據報的形式發送,而IP數據報到達接收端可能是亂序或者重復的。TCP協議會對收到的TCP報文進行重排、整理,確保順序正確。
TCP報文段所攜帶的應用程序數據按照長度分為兩種: 交互數據 和 成塊數據
對於什麼是粘包、拆包問題,我想先舉兩個簡單的應用場景:
對於第一種情況,服務端的處理流程可以是這樣的:當客戶端與服務端的連接建立成功之後,服務端不斷讀取客戶端發送過來的數據,當客戶端與服務端連接斷開之後,服務端知道已經讀完了一條消息,然後進行解碼和後續處理...。對於第二種情況,如果按照上面相同的處理邏輯來處理,那就有問題了,我們來看看 第二種情況 下客戶端發送的兩條消息遞交到服務端有可能出現的情況:
第一種情況:
服務端一共讀到兩個數據包,第一個包包含客戶端發出的第一條消息的完整信息,第二個包包含客戶端發出的第二條消息,那這種情況比較好處理,伺服器只需要簡單的從網路緩沖區去讀就好了,第一次讀到第一條消息的完整信息,消費完再從網路緩沖區將第二條完整消息讀出來消費。
第二種情況:
服務端一共就讀到一個數據包,這個數據包包含客戶端發出的兩條消息的完整信息,這個時候基於之前邏輯實現的服務端就蒙了,因為服務端不知道第一條消息從哪兒結束和第二條消息從哪兒開始,這種情況其實是發生了TCP粘包。
第三種情況:
服務端一共收到了兩個數據包,第一個數據包只包含了第一條消息的一部分,第一條消息的後半部分和第二條消息都在第二個數據包中,或者是第一個數據包包含了第一條消息的完整信息和第二條消息的一部分信息,第二個數據包包含了第二條消息的剩下部分,這種情況其實是發送了TCP拆,因為發生了一條消息被拆分在兩個包裡面發送了,同樣上面的伺服器邏輯對於這種情況是不好處理的。
我們知道tcp是以流動的方式傳輸數據,傳輸的最小單位為一個報文段(segment)。tcp Header中有個Options標識位,常見的標識為mss(Maximum Segment Size)指的是,連接層每次傳輸的數據有個最大限制MTU(Maximum Transmission Unit),一般是1500比特,超過這個量要分成多個報文段,mss則是這個最大限制減去TCP的header,光是要傳輸的數據的大小,一般為1460比特。換算成位元組,也就是180多位元組。
tcp為提高性能,發送端會將需要發送的數據發送到緩沖區,等待緩沖區滿了之後,再將緩沖中的數據發送到接收方。同理,接收方也有緩沖區這樣的機制,來接收數據。
發生TCP粘包、拆包主要是由於下面一些原因:
既然知道了tcp是無界的數據流,且協議本身無法避免粘包,拆包的發生,那我們只能在應用層數據協議上,加以控制。通常在制定傳輸數據時,可以使用如下方法:
寫了一個簡單的 golang 版的tcp伺服器實例,僅供參考:
例子
參考和推薦閱讀書目:
注釋:
eg.
『貳』 如何用matlab實現插值演算法
實例展示
1
先看一個實例,最後再來說明一維插值在matlab中的用法。實例如下圖,用13個節點作三種插值,並比較結果。
2
首先啟動matlab,選擇編輯器,再新建一個命令文件。
3
然後,在編輯器窗口中輸入本題的代碼。如下圖所示。並保存,此處命名為yiwei。
4
最後再命令行窗口處輸入yiwei,並敲入鍵盤上的enter建。最終得到的結果是插值與原來的13個數據點之間的比較圖,可以看出結果很好。
END
命令解釋
1
通過上面的例子,也知道了matlab進行一維插值的命令是interp1.
該命令的形式為y1=interp1(x0,y0,x1,'method').
功能:根據已知的數據(x0,y0),用method方法進行插值,然後計算x1對應的函數值y1.
2
其中的參數及其注意事項。
x0,y0是已知的數據向量,其中x應以升序或者降序排列,x1是插值點的自變數坐標向量;method是用來選擇插值演算法的,它可以取:『linear』(線性插值)、『cubic』(三次多項式插值)、『nearst』(最近插值)、『spline』(三次樣條插值)。
『叄』 雙三次樣條插值
在數值分析這個數學分支中,雙三次插值(英語:Bicubic interpolation)是二維空間中最常用的插值方法。在這種方法中,函數f在點 (x,y) 的值可以通過矩形網格中最近的十六個采樣點的加權平均得到,在這里需要使用兩個多項式插值三次函數,每個方向使用一個。
計算系數的過程依賴於插值數據的特性。如果已知插值函數的導數,常用的方法就是使用四個頂點的高度以及每個頂點的三個導數。一階導數與表示 x 與 y 方向的表面斜率,二階相互導數表示同時在 x 與 y 方向的斜率。這些值可以通過分別連續對 x 與 y 向量取微分得到。對於網格單元的每個頂點,將局部坐標(0,0, 1,0, 0,1 和 1,1) 帶入這些方程,再解這 16 個方程。
After bilinear interpolation, perhaps the most widely used technique is that of bicubic interpolation, certainly by computational geometers, if not GIS users. This makes use of the 16-term function:
Bicubic interpolation is the lowest order 2-D interpolation procere that maintains the continuity of the function and its first derivatives (both normal and tangential) across cell boundaries (Russell, 1995). As we want the function to be valid over the grid cell of the interpolated point, we need to consider which 16 values to use to derive the coefficients. The common approach is to use the height at the four vertices, together with three derivatives at each vertex. The first derivativesh'xandh'yexpress the slope of the surface in thexandydirections, while the second (cross) derivativeh''xyrepresents the slope in bothxandy. In terms of solving the coefficients of [9], these values can be expressed by differentiating thexandyvectors independently, and then consecutively. For each of the vertices of the grid cell, the local coordinates (at 0,0, 1,0, 0,1 and 1,1) can be input into these equations to generate the 16 equations to solve [9]. Press et al., (1988) present algorithms for piecewise cubic, bicubic polynomial and bicubic spline interpolation. Methods for determining the slope estimates or partial derivatives are presented in Section 3.10.
A simpler approach described by Schut (1976) is to use the 12-term incomplete bicubic polynomial:
In this instance the cross-derivativeh''xyis not required, leaving the four corner elevations and eight first-order derivatives sufficient to compute the parameters. While the total surface is continuous, it is only smooth at the nodes.
『肆』 什麼是網格演算法
網格化是解釋流程中構造成圖的比較重要的一步,演算法種類也比較多。在SMT中就列出了許多種演算法供選擇,當然每種演算法有自己的特點和適應性,所以在真正網格化操作時為了提高預測的精度需要選擇合適的演算法。如下為SMT中提供的幾種演算法簡單對比。
Collocated Cokriging
協克里金演算法
層位、斷層、網格、XYZ數據、層段屬性、鑽井分層(較好用於井數據與地震屬性匹配)
Cubic Spline
樣條插值
三維的層位、網格、斷層、XYZ數據
Flex Gridding
彈性網格化
層位、斷層、網格、XYZ數據、層段屬性、鑽井分層
Gradient Projection
梯度投影
二維、三維的層位、網格、斷層、等值線、XYZ數據(較好用於構造數據)
Inverse Distance to a Power
反距離加權
二維、三維的層位、網格、斷層、等值線、XYZ數據、層段屬性、鑽井分層(較好用於速度成圖)
Natural Neighbor
自然鄰點插值
XYZ數據、層段屬性、鑽井分層(較好用於非地震類數據)
Ordinary Kriging
普通克里金插值
XYZ數據、層段屬性、鑽井分層(較好用於滲透率成圖)
Simple Kriging
簡單克里金插值
XYZ數據、層段屬性、鑽井分層(較好用於滲透率成圖)
Universal Kriging
廣義克里金
XYZ數據、層段屬性、鑽井分層(較好用於滲透率圖件和有整體變化趨勢的數據)
這里對兩種演算法做個介紹:
1、SMT8.2版本中新出現的Flex Gridding 彈性網格化演算法
該演算法利用差分方程系統原理,產生的網格節點處數值需要滿足以下兩種原則:
. 內插面與實際數據產生的趨勢面一致或者很接近;
. 該面的RMS曲率值盡可能小。
如果在一個節點處應用每一種方程都計算差分的話,而且將鄰近點都考慮在內的話,其結果會形成一個組合,但越遠的點影響越弱、越不直接。因此,在計算時都假設鄰近節點為常數,每個方程就會得到一個網格數值。如此重復應用於其它節點處。這樣可以解決單個節點的問題,我們將方程稱為「調和器」。該方法產生的曲率面會趨於最小,而且逼近實際數據。
由於每個節點在進行調和濾波計算時都需要一個局部的調和器,網格節點多時就會有許多次迭代計算過程。迭代次數差不多為N的e次方(N為數據列/行數)。因此初始網格一般時非常小的。
2、Collocated Cokriging 協克里金插值
協克里金插值與克里金演算法原理基本一樣,都是通過差異比較來計算網格數值,同時產生方差圖,但是該方法假設事件都是多屬性的,可以利用第二種協數據(如層位)輔助第一種主數據進行稀疏數據點(如井控制點)的內插。
協克里金插值利用第二種協數據指導主數據的網格化,可以提高克里金插值的准確性。該演算法中斷層可以參與運算。在使用時用稀疏數據(如井數據)作為主數據,另外一種密集分布數據作為協數據。
在具體計算中網格點處主數據有值的地方都用主數據的值,如果網格點處沒有值時則用協數據作為輔助進行計算。並且會同時產生一個方差模型。
最終的協方差網格結果為主數據進行克里金插值,同時受協數據影響。
因此,如果主數據為密集分布的數據,計算產生的網格也會接近主數據。例如,數據中包括測井解釋的孔隙度數據(稀疏分布),從地震屬性中預測的偽孔隙度數據(密集分布)。數據單位是一致的,但來源可能不一樣。
對於這種情況下協克里金插值就是一種很好的網格演算法,還可以建立起振幅與孔隙度之間的關系。
在應用時有以下注意事項:
1)在主數據為稀疏分布,協數據偽密集分布時應用效果最好。
2)如果主數據與協數據之間有一定聯系的話效果最好。
3)數據類型最好一致。
『伍』 擁塞演算法
基於包丟失檢測的 Reno、NewReno 或者 cubic 為代表,其主要問題有 Buffer bloat 和長肥管道兩種。和這些演算法不同,bbr 演算法會以時間窗口內的最大帶寬 max_bw 和最小 RTT min_rtt,並以此計算發送速率和擁塞窗口
RTProp : round-trip propagation time BtlBW : bottleneck bandwidth,bbr 演算法關於擁塞窗口的核心就是計算 BtlBW 和 RTprop,根據這兩者值計算 BDP
bbr 演算法輸出 pacing_rate 和 cwnd 兩個數據。pacing_rate 決定發包速率,cwnd 為窗口大小
TCP Tahoe 和 Reno
這兩個演算法是根據其第一次加入到4.3BSD的時間回溯命名的,兩個名字對應自其第一次出現時BSD的代號,而代號分別取自太浩湖(Lake Tahoe)和其附近的城市裡諾市
• Tahoe:如果收到三次重復確認——即第四次收到相同確認號的分段確認,並且分段對應包無負載分段和無改變接收窗口——的話,Tahoe演算法則進入快速重傳,將慢啟動閾值改為當前擁塞窗口的一半,將擁塞窗口降為1個MSS,並重新進入慢啟動階段
• Reno:如果收到三次重復確認,Reno演算法則進入快速重傳,只將擁塞窗口減半來跳過慢啟動階段,將慢啟動閾值設為當前新的擁塞窗口值,進入一個稱為「快速恢復」的新設計階段
Fast recovery
是Reno演算法新引入的一個階段,在將丟失的分段重傳後,啟動一個超時定時器,並等待該丟失分段包的分段確認後,再進入擁塞控制階段。如果仍然超時,則回到慢啟動階段
TCP Vegas
至1990年代中期,TCP量度延遲和RTT都是以傳輸緩存中最後一個被傳送的分段包為准。vegas通過度量傳輸緩存中每個傳送分段包來代替只量度一個分段包,通過每次度量的平均值來增加擁塞窗口。該演算法取名自內華達州最大的城市拉斯維加斯。不過由於一些資源公平性原因,該演算法並沒有在彼得森的實驗室之外廣泛部署。一些研究認為該演算法和其他擁塞演算法混合使用,可能會導致性能競爭不及其他演算法。在各種TCP擁塞演算法的比較研究中,Vegas被認為是最平滑的控制演算法,其次為CUBIC
TCP New Reno
TCP New Reno是對TCP Reno中快速恢復階段的重傳進行改善的一種改進演算法,其定義於RFC 6582,覆蓋了原有在RFC 3782和RFC 2582的舊定義。
在Reno的快速恢復中,一旦出現3次重復確認,TCP發送方會重發重復確認對應序列號的分段並設置定時器等待該重發分段包的分段確認包,當該分段確認包收到後,就立即退出快速恢復階段,進入擁塞控制階段,但如果某個導致重復確認的分段包到遇到重復確認期間所發送的分段包存在多個丟失的話,則這些丟失只能等待超時重發,並且導致擁塞窗口多次進入擁塞控制階段而多次下降。而New Reno的快速恢復中,一旦出現3次重復確認,TCP發送方先記下3次重復確認時已發送但未確認的分段的最大序列號,然後重發重復確認對應序列號的分段包。如果只有該重復確認的分段丟失,則接收方接收該重發分段包後,會立即返回最大序列號的分段確認包,從而完成重發;但如果重復確認期間的發送包有多個丟失,接收方在接收該重發分段後,會返回非最大序列號的分段確認包,從而發送方繼續保持重發這些丟失的分段,直到最大序列號的分段確認包的返回,才退出快速恢復階段。
New Reno在低錯誤率時運行效率和「選擇確認」(Selective ACKnowledgement,SACK)相當,在高錯誤率仍優於Reno
TCP Hybla
TCP Hybla旨在消除由於高延遲地面線路或者衛星無線鏈路下導致的RTT過長而對TCP鏈接的影響。它通過對擁塞窗口動態分析來修改,來減少對RTT的性能依賴
TCP BIC 和 CUBIC
TCP BIC(Binary Increase Congestion control)旨在優化高速高延遲網路(即根據RFC 1072所定義的「長肥網路」(long fat network,LFN))的擁塞控制,其擁塞窗口演算法使用二分搜索演算法嘗試找到能長時間保持擁塞窗口最大值的值。Linux內核在2.6.8至2.6.18使用該演算法作為默認TCP擁塞演算法。
CUBIC則是比BIC更溫和和系統化的分支版本,其使用三次函數代替二分演算法作為其擁塞窗口演算法,並且使用函數拐點作為擁塞窗口的設置值。Linux內核在2.6.19後使用該演算法作為默認TCP擁塞演算法
TCP Westwood和Westwood+
TCP Westwood改良自New Reno,不同於以往其他擁塞控制演算法使用丟失來測量,其通過對確認包測量來確定一個「合適的發送速度」,並以此調整擁塞窗口和慢啟動閾值。其改良了慢啟動階段演算法為「敏捷探測(Agile Probing)」,和設計了一種持續探測擁塞窗口的方法來控制進入「敏捷探測」,使鏈接盡可能地使用更多的帶寬。Westwood+使用更長的帶寬估計間隔和優化的濾波器來修正Westwood對ACK壓縮場景對帶寬估計過高的問題。通過以上改良,TCP Westwood系列演算法在有線網路和無線網路的擁塞控制上獲取平衡,尤其研究中針對於無線通信網路上
Compound TCP
復合TCP(Compound TCP)是微軟自己實現的TCP擁塞控制演算法,通過同時維護兩個擁塞窗口,來實現在長肥網路有較好的性能而又不損失公平性。該演算法在Windows Vista和Windows Server 2008開始廣泛部署,並通過補丁的方式回溯支持到Windows XP和Windows Server 2003。在Linux上也有一個舊版本的移植實現
TCP PRR
TCP PRR(TCP Proportional Rate Rection )是旨在恢復期間提高發送數據的准確性。該演算法確保恢復後的擁塞窗口大小盡可能接近慢啟動閾值。在Google進行的測試中,能將平均延遲降低3~10%,恢復的超時減少5%。PRR演算法之後作為Linux內核3.2版本的默認擁塞演算法
TCP BBR
TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google設計,於2016年發布的擁塞演算法。以往大部分擁塞演算法是基於丟包來作為降低傳輸速率的信號,而BBR則基於模型主動探測。該演算法使用網路最近出站數據分組當時的最大帶寬和往返時間來創建網路的顯式模型。數據包傳輸的每個累積或選擇性確認用於生成記錄在數據包傳輸過程和確認返回期間的時間內所傳送數據量的采樣率。該演算法認為隨著網路介面控制器逐漸進入千兆速度時,與緩沖膨脹相關的延遲相比丟包更應該被認為是識別擁塞的主要決定因素,所以基於延遲模型的擁塞控制演算法(如BBR)會有更高的吞吐量和更低的延遲,可以用BBR來替代其他流行的擁塞演算法,例如CUBIC
QUIC Quick UDP Internet Connections
QUIC旨在提供幾乎等同於TCP連接的可靠性,但延遲大大減少。它主要通過兩個理解HTTP流量的行為來實現這一點:
第一個變化是在連接創建期間大大減少開銷。由於大多數HTTP連接都需要TLS,因此QUIC使協商密鑰和支持的協議成為初始握手過程的一部分。 當客戶端打開連接時,伺服器響應的數據包包括將來的數據包加密所需的數據。
QUIC使用UDP協議作為其基礎,不包括丟失恢復。相反,每個QUIC流是單獨控制的,並且在QUIC級別而不是UDP級別重傳丟失的數據。這意味著如果在一個流中發生錯誤,協議棧仍然可以獨立地繼續為其他流提供服務
QUIC包括許多其他更普通的更改,這些更改也可以優化整體延遲和吞吐量
每個數據包是單獨加密的,因此加密數據時不需要等待部分數據包。 在TCP下通常不可能這樣做,其中加密記錄在位元組流中,並且協議棧不知道該流中的更高層邊界。這些可以由運行在更上層的協議進行協商,但QUIC旨在通過單個握手過程完成這些
QUIC的另一個目標是提高網路切換期間的性能,例如當移動設備的用戶從WiFi熱點切換到移動網路時發生的情況。 當這發生在TCP上時,一個冗長的過程開始了:每個現有連接一個接一個地超時,然後根據需要重新創建。期間存在較高延遲,因為新連接需要等待舊連接超時後才會創建。 為解決此問題,QUIC包含一個連接標識符,該標識符唯一地標識客戶端與伺服器之間的連接,而無論源IP地址是什麼。這樣只需發送一個包含此ID的數據包即可重新創建連接,因為即使用戶的IP地址發生變化,原始連接ID仍然有效
QUIC在應用程序空間中實現,而不是在操作系統內核中實現。當數據在應用程序之間移動時,這通常會由於上下文切換而調用額外的開銷。 但是在QUIC下協議棧旨在由單個應用程序使用,每個應用程序使用QUIC在UDP上託管自己的連接
Chromium的網路堆棧同時打開QUIC和傳統TCP連接,並在QUIC連接失敗時以零延遲回退到TCP連接
『陸』 Matlab中插值函數
MATLAB中的插值函數為interp1,其調用格式為: yi= interp1(x,y,xi,'method') 其中x,y為插值點,yi為在被插值點xi處的插值結果;x,y為向量, 'method'表示採用的插值方法,MATLAB提供的插值方法有幾種: 'method'是最鄰近插值, 'linear'線性插值; 'spline'三次樣條插值; 'cubic'立方插值.預設時表示線性插值。 注意:所有的插值方法都要求x是單調的,並且xi不能夠超過x的范圍。 例:在一 天24小時內,從零點開始每間隔2小時測得的環境溫度數據分別為 12,9,9,10,18 ,24,28,27,25,20,18,15,13 問題:推測中午12點(即13點)時的溫度. 功能 一維數據插值(表格查找)。該命令對數據點之間計算內插值。它找出一元函數f(x)在中間點的數值。其中函數f(x)由所給數據決定。 x:原始數據點 Y:原始數據點 xi:插值點 Yi:插值點 (1)yi = interp1(x,y,xi,method) 用指定的演算法計算插值: 』nearest』:最近鄰點插值,直接完成計算; 』linear』:線性插值(預設方式),直接完成計算; 』spline』:三次樣條函數插值。 』cubic』:該方法保留單調性與數據的外形; 功能 二維數據內插值 (1)ZI = interp2(X,Y,Z,XI,YI,method) 返回矩陣ZI,其元素包含對應於參量XI 與YI(可以是向量、或同型矩陣) 的元素, 即Zi(i,j) ←[Xi(i,j),yi(i,j)]。用戶可以輸入行向量和列向量Xi 與Yi,此時,輸出向量Zi 與矩陣meshgrid(xi,yi)是同型的。 (2)ZI = interp2(Z,XI,YI) 預設地,X=1:n、Y=1:m,其中[m,n]=size(Z)。再按第一種情形進行計算。 用指定的演算法method 計算二維插值: 』linear』:雙線性插值演算法(預設演算法); 』nearest』:最臨近插值; 』spline』:三次樣條插值; 』cubic』:雙三次插值。 (4)VI = interp3(X,Y,Z,V,XI,YI,ZI,method) 找出由參量X,Y,Z決定的三元函數V=V(X,Y,Z)在點(XI,YI,ZI)的值。 %用指定的演算法method 作插值計算: 『linear』:線性插值(預設演算法); 『cubic』:三次插值; 『spline』:三次樣條插值; 『nearest』:最鄰近插值。 功能 數據格點 (1)ZI = griddata(x,y,z,XI,YI,method) 用二元函數z=f(x,y)的曲面擬合有不規則的數據向量x,y,z。griddata 將返回曲面z 在點(XI,YI)處的插值。曲面總是經過這些數據點(x,y,z)的輸入參量(XI,YI)通常是規則的格點(像用命令meshgrid 生成的一樣)。 用指定的演算法method 計算: 『linear』:基於三角形的線性插值(預設演算法); 『cubic』: 基於三角形的三次插值; 『nearest』:最鄰近插值法; 『v4』:MATLAB 4 中的griddata 演算法。 功能 三次樣條數據插值 格式 (1)yy = spline(x,y,xx) 功能 生成用於畫三維圖形的矩陣數據 格式 [X,Y] = meshgrid(x,y) 將由向量x,y(可以是不同方向的)指定的區域[min(x),max(x) , min(y) , max(y)] 用直線x=x(i),y=y(j) ( i=1,2,…,length(x) ,j=1,2,…,length(y))進行劃分。這樣,得到了length(x)*length(y)個點, 這些點的橫坐標用矩陣X 表示,X 的每個行向量與向量x 相同;這些點的縱坐標用矩陣Y 表示,Y 的每個列向量與向量y 相同。其中X,Y可用於計算二元函數z=f(x,y)與三維圖形中xy 平面矩形定義域的劃分或曲面作圖。 [X,Y] = meshgrid(x) %等價於[X,Y]=meshgrid(x,x)。 [X,Y,Z] = meshgrid(x,y,z) %生成三維陣列X,Y,Z,用於計算三元函數v=f(x,y,z)或三維容積圖。『柒』 三次均勻B樣條插值演算法
三次樣條插值(Cubic Spline Interpolation)簡稱Spline插值,是通過一系列形值點的一條光滑曲線,數學上通過求解三彎矩方程組得出曲線函數組的過程。
實際計算時還需要引入邊界條件才能完成計算。一般的計算方法書上都沒有說明非扭結邊界的定義,但數值計算軟體如Matlab都把非扭結邊界條件作為默認的邊界條件。