潮位分析中高低潮位数据的处理
潮位分析中高低潮位數據的處理
- 基于高低潮數據的潮位插值方法
- 三角波(分段線性)插值
- 原理
- Matlab實現
- 正弦波插值
- 原理
- Matlab實現
- 結果對比
基于高低潮數據的潮位插值方法
由于在傳統的調和分析中,需要輸入等間距的潮位數據集,但許多地區的長系列潮位資料仍是以高低潮的形式記錄的,即所有數據點為實測高/低潮位,以及對應的出現時間。
故我需要把這樣的高低潮數據經過處理(插值法),生成等間距的潮位時間序列。
以下三角波插值和正弦波插值方法參考楊鋒的碩士論文《基于高低潮數據的潮汐調和分析方法研究及應用》1。
所用數據集來自中國南部某潮位測站的實測潮位記錄。
三角波(分段線性)插值
原理
對于已知節點 (x0,y0)和 (x1,y1),在區間[x0,x1]內構造線性函數L(x)以逼近區間內的函數值。
L(x)=y0+y1?y0x1?x0(x?x0)L(x) = y_{0} + \frac{y_{1}-y_{0}}{x_{1}-x_{0}} (x-x_{0}) L(x)=y0?+x1??x0?y1??y0??(x?x0?)
在每一個區間內構建諸如上式的方程,即分段構造線性插值函數。
Matlab實現
選擇某測站1月份某9天的實測數據進行插值。
% data_time & data_z : 已知高低潮位數據(時間和潮位) x1 = linspace(0,9,9*24*60+1); y1 = interp1(data_time,data_z,x1); %分段線性插值 plot(data_time,data_z,'+',x1,y1), xlabel Time(d), ylabel Height(m); axis([-0.5 9.5,-1.5,1]); legend('實測高低潮','三角波插值','fontsize',14);正弦波插值
原理
正弦波插值是以三角函數為插值函數的一種適用于周期函數的插值方法。潮位方程是一個以2k為周期的函數,令潮位方程為y = f(x),則x1,x2,…,xn對應函數值為f(x1),f(x2),…,f(xn)。根據Lagrange插值原理,存在一個多項式pn(x),滿足
p(xk)=f(xk)p(x_{k}) = f(x_{k}) p(xk?)=f(xk?)
pn(x)為三角函數插值多項式,其次數小于等于n。
取一個n階三角多項式
tk(x)=sinx?x02?sinx?xk?12sinx?xk+12?sinx?xn2sinxk?x02?sinxk?xk?12sinxk?xk+12?sinxk?xn2,0≤k≤2nt_{k}(x) = \frac{sin\frac{x-x_{0}}{2} \cdots sin\frac{x-x_{k-1}}{2}sin\frac{x-x_{k+1}}{2} \cdots sin\frac{x-x_{n}}{2}}{sin\frac{x_{k}-x_{0}}{2} \cdots sin\frac{x_{k}-x_{k-1}}{2}sin\frac{x_{k}-x_{k+1}}{2} \cdots sin\frac{x_{k}-x_{n}}{2}} , 0 \le k \le 2n tk?(x)=sin2xk??x0???sin2xk??xk?1??sin2xk??xk+1???sin2xk??xn??sin2x?x0???sin2x?xk?1??sin2x?xk+1???sin2x?xn???,0≤k≤2n
可簡寫成
tk(x)=∑l=0,l≠k2nsinx?xl2sinxk?xl2,0≤k≤2nt_{k}(x)=\sum_{l=0,l \ne k} ^{2n} \frac{sin\frac{x-x_{l}}{2}}{sin\frac{x_{k}-x_{l}}{2}}, 0 \le k \le 2n tk?(x)=l=0,l?=k∑2n?sin2xk??xl??sin2x?xl???,0≤k≤2n
可知,tk(x)滿足
tk(x)=δkll,k=0,1,2…2nt_{k}(x) = \delta _{kl} \space \space l,k=0,1,2 \dots 2n tk?(x)=δkl???l,k=0,1,2…2n
pn(x)=∑k=02nf(xk)tk(x)p_{n}(x) = \sum_{k=0}^{2n} f(x_{k})t_{k}(x) pn?(x)=k=0∑2n?f(xk?)tk?(x)
令x = xk ,則有p(xk)=f(xk)。
由潮汐現象的特征可知,一年高低潮數據大概有1400多個,鑒于潮位所受影響因素太多,如果將所有節點都納入計算的話,函數復雜程度和計算量太大,擬合精度得不到保障,并且毫無必要。當只選取相鄰兩個節點進行正弦波插值時,插值效果和精度都較為適宜,故最終n取2。即只選擇相鄰點為端點,采用一階三角波插值函數p1(x)作整個區間的插值函數。
也有,在區間[xi,xi+1]上
p1(x)={yi+1?yi2sin[πxi+1?xi(x?xi+1+xi2)]+yi+1+yi2if?yi≤yi+1yi?yi+12sin[πxi+1?xi(x?(xi?xi+1?xi2))]+yi+1+yi2if?yi>yi+1p_{1} (x)= \begin{cases} {\frac{y_{i+1}-y_{i}}{2} sin[\frac{\pi}{x_{i+1}-x_{i}}(x-\frac{x_{i+1}+x_{i}}{2})]+ \frac{y_{i+1}+y_{i}}{2}} &\text{if } y_i \le y_{i+1} \\ {\frac{y_{i}-y_{i+1}}{2} sin[\frac{\pi}{x_{i+1}-x_{i}}(x-(x_i- \frac{x_{i+1}-x_{i}}{2}))]+ \frac{y_{i+1}+y_{i}}{2}} &\text{if } y_i > y_{i+1} \end{cases} p1?(x)={2yi+1??yi??sin[xi+1??xi?π?(x?2xi+1?+xi??)]+2yi+1?+yi??2yi??yi+1??sin[xi+1??xi?π?(x?(xi??2xi+1??xi??))]+2yi+1?+yi???if?yi?≤yi+1?if?yi?>yi+1??
推導過程如下所示。
或將上述兩個分段函數表達式整合成如下形式:
p1(x)=abs(yi?yi+1)2sin[πx?xixi+1?xi+(0.5+q)π]+yi+1+yi2p_{1}(x) = \frac{ abs(y_{i} - y_{i+1}) } {2} sin [\pi \frac{x - x_{i}}{x_{i+1} - x_{i}} + (0.5+q) \pi ] +\frac{y_{i+1}+y_{i}}{2} p1?(x)=2abs(yi??yi+1?)?sin[πxi+1??xi?x?xi??+(0.5+q)π]+2yi+1?+yi??
式中
q={1if?yi≤yi+10if?yi>yi+1q = \begin{cases} {1} &\text{if } y_i \le y_{i+1} \\ {0} &\text{if } y_i > y_{i+1} \end{cases} q={10?if?yi?≤yi+1?if?yi?>yi+1??
Matlab實現
%正弦波(一階)插值 % data_time & data_z : 已知高低潮位數據(時間和潮位) %三角函數插值d1 = size(data_time,1);x1 = linspace(0,9,9*24*60+1);% x1為待插值點的x坐標(時間點),數據集包含9天的數據,故從0~9day,每隔1min生成一個點 d2 = size(x1,2); y1 = zeros(1,d2);for i = 1:d2 flag = 1;for j = 1:d1 %判斷時間點 x1(i) 屬于數據集的哪個區間if(x1(i)<data_time(j))flag = j;break;endendxi = data_time(flag-1);xif = data_time(flag); %x1(i)屬于[xi , xif]dx = xif - xi;cx = 0.5 * (xi + xif);fxi = data_z(flag-1);fxif = data_z(flag);dfx = abs(fxif - fxi);cy = 0.5 * (fxi + fxif);%求解分段函數if(fxi<=fxif)y1(i) = 0.5*dfx*sin(pi*(x1(i)-cx)/dx) + cy;elsey1(i) = 0.5*dfx*sin(pi*(x1(i)-xi+0.5*dx)/dx) + cy;end endplot(data_time,data_z,'+',x1,y1,'r'), xlabel Time(d), ylabel Height(m); axis([-0.5 9.5,-1.5,1]); legend('實測高低潮','正弦波插值','fontsize',14);結果對比
http://cdmd.cnki.com.cn/Article/CDMD-10319-1017280624.html ??
總結
以上是生活随笔為你收集整理的潮位分析中高低潮位数据的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浪潮之巅读后摘录
- 下一篇: 【Android】实现自定义标题栏