2013-07-04 68 views
4

如何在FORTRAN中實現二維插值,其數據如下所示。 x和y是兩個座標並且z是取決於它們的值 x是均勻間隔的,但y不是均勻間隔的,並且對應於x的均勻值的最大值保持增加。 不失accuracy-2D插值不規則柵格fortran

  • 多什麼是獲得基於給定X 和y的Z值的最簡單的方法?
  • 什麼是基於給定x和y的 獲取z值的最快方法?

感謝 SM

x y z 
----------- 
0 0  - 
0 0.014 - 
0 0.02 - 

..... 
.... 

0.1 0  - 
0.1 0.02 - 
0.1 0.03 - 

....... 
..... 

1.0 0  - 
1.0 0.05 - 
1.0 0.08 - 

....... 
....... 

回答

6

我會假設你已經讀過您的數據到一個數組的N×3,以下你給的格式。我假設你事先並不知道X間距是多少 - 你肯定不知道Y間距的變化。因此,我會推薦以下策略:

  • 找出X間距:從第一行開始,並遍歷X元素,直到看到值的變化。你現在知道XSTART和XSTEP - 你以後會用到它們。
  • 做一個二進制搜索您的數組值X中,直到找到一個值XFOUND這樣XFOUND < X < XFOUND + XSTART
  • 假設你正在指向「某處列表」,找到相應的Y值 - 取決於它是大於還是小於您需要的值,您可以向上或向下搜索數組,直到找到第一個條目< Y.相應的值爲X11,Y11,Z11。數組中的下一行有X12 Y12和Z12。
  • 在插值之前,您還需要兩個點 - 重複此過程,查找「下一個較大的X值」。這會給你XYZ21和XYZ22
  • 現在你可以考慮計算插值Z值。 「最近鄰居」:找到最近點,並使用它的Z值(最簡單,最不準確)
  • 「線性插值」:找到三個最接近的點,並根據相對距離對值進行線性插值:「高階估計」:爲此,您通常需要創建網格點的完整連通性映射,因此您可以執行樣條插值並獲得平滑插值通常在網格點之間的點處更準確(假設樣本描述的函數實際上是平滑函數!)

我的FORTRAN有點生疏 - 希望這是一些幫助。

PS - 可能更簡單的方法是使用X值已經均勻分佈的事實。這可以讓你做出更好的插值。看到這樣的畫面:

enter image description here

+0

感謝您的回答。我一直在努力實現這一點。但問題是如何轉換爲矩形網格?我擁有的數據幾乎是拋物線,其中x是均勻間隔的,但是y從0變化到最大值,然後是0. – user1117812

+0

你是說y數據沒有排序? – Floris

+0

是的Y數據沒有排序,我不認爲它可以是因爲y的值是依賴於x像y^2 = 4 * a * x(不盡然)。 – user1117812

6

之前找到解決這個問題的最快方法,我建議找解決問題方式。簡而言之,我會建議:

1)找到(x,y)點的Delaunay三角剖分。例如,執行此操作的Fortran代碼位於GEOMPACK中。

2)要進行插值,給定Delaunay三角剖分,找到包含插值點的三角形,然後根據點相對於每個三角形頂點的位置插值z值。 (編輯)我已經忘記了方法的名稱(如果我知道的話),但是,由於@Floris,一個插入三角形的好方法被稱爲barycentric interpolation,該方法根據比率三個較小三角形中的區域,可以通過從大三角形內的點到三角形的每個角繪製線來分割大三角形。每個小三角形的面積可以使用Heron's formula從三角形的每邊的長度找到。

如果需要提高速度,我認爲它們可以主要通過找到一個快速找到包含插值點的三角形來獲得,但我想在選擇要優化的代碼的哪些位之前剖析一些測試運行。

+0

對於三維空間中的[x,y,z]點,在2-D [x1,y1] [x2,y2] [x3,y3] Delaunay內[x,y,zi]點的重心插值如果z值是高程,那麼方面等同於三維Delaunay面上的確切位置,是的?這是假設沒有垂直重疊的方面。 –

+0

@AdamErickson:沒錯。 – Simon