精密星历卫星钟差插值程序
生活随笔
收集整理的這篇文章主要介紹了
精密星历卫星钟差插值程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
???? 本程序采用VB.net語言編寫。
???? 本程序采用插值算法,來完成對精密星歷鐘差文件(.clk)的加密工作。如可以將30S鐘差間隔的鐘差文件加密到15s、10s、2s、1s等。 程序中寫有四種經典的插值算法,分別是Lagrange插值算法、Newton插值算法、三次樣條插值算法、分段線性插值算法等,這幾種算法的正確性以得到過驗證。
??? 首先導入精密星歷鐘差文件,根據導入的鐘差文件進行判斷,將其信息進行整理并繪制可視化圖表以顯示24H內每顆衛星的鐘差變化趨勢。
??? 導入文件之后,可以根據用戶自身的插值需求將鐘差文件加密到更小的鐘差間隔,如導入的精密星歷衛星鐘差文件為5min鐘差間隔,用戶可以將其加密到30s、15s、10s以及更小的鐘差間隔,并根據結果生成相應的clk文件。
插值算法:
Lagrange插值:
Public Function Lagrange(X() As Double, Y() As Double, xx As Double)Dim yy As Double = 0 '最后返回的多項式值Dim ll(X.Length - 1) As Double '中間變量For i = 0 To X.Length - 1Dim l1 As Double = 1 '多項式系數分子Dim l2 As Double = 1 '多項式系數分母For j = 0 To X.Length - 1If i <> j Thenl1 = l1 * (xx - X(j))l2 = l2 * (X(i) - X(j))ElseContinue ForEnd IfNextll(i) = l1 / l2NextFor i = 0 To X.Length - 1yy = yy + ll(i) * Y(i)NextReturn yyEnd FunctionNewton插值:
Public Function Newton(X() As Double, Y() As Double, xx As Double)Dim yy As Double = 0 '最后返回的多項式值Dim n As Integer = UBound(X) '節點數Dim A(n, n) As Double '差商表Dim dx(n) As Double '牛頓多項式中(x-x0)項'計算差商表For i = 0 To nA(i, 0) = Y(i)NextFor i = 1 To nFor j = 1 To iA(i, j) = (A(i, j - 1) - A(i - 1, j - 1)) / (X(i) - X(i - j))NextNext'計算II(x-xi)dx(0) = 1For i = 1 To ndx(i) = dx(i - 1) * (xx - X(i - 1))Next'計算牛頓多項式For i = 0 To nyy = yy + A(i, i) * dx(i)NextReturn yyEnd Function三次樣條插值:
Public Function CubicSpline(X As Double(), Y As Double(), xx() As Double)Dim yy(xx.Length - 1) As Double '函數返回的對應xx 的插值Dim n As Integer = UBound(X)Dim S2(n, 0), m(n, 0), AA(n, n) As Double '用于矩陣運算,即AA*M=S2Dim h(n - 1) As Double '計算步長,即X(i+1)-X(i)Dim dy(n - 1) As Double 'y的微分For i = 0 To n - 1h(i) = X(i + 1) - X(i)dy(i) = (Y(i + 1) - Y(i)) / h(i)Next'自然邊界型三次樣條,二階導數兩個端點值為0S2(0, 0) = 0 : S2(n, 0) = 0For i = 1 To n - 1S2(i, 0) = 6.0 * (dy(i) - dy(i - 1))Next'確定系數陣AAAA(0, 0) = 1AA(n, n) = 1For i = 1 To n - 1AA(i, i - 1) = h(i - 1)AA(i, i) = 2 * (h(i - 1) + h(i))AA(i, i + 1) = h(i)Next'求二次微分陣mm = Multiply(Inv(AA), S2)'求多項式Dim a, b, c, d, dx As DoubleFor j = 0 To xx.Length - 1For i = 0 To nIf (xx(j) > X(i) Or xx(j) = X(i)) And (xx(j) < X(i + 1) Or xx(j) = X(i + 1)) Thena = Y(i)b = (Y(i + 1) - Y(i)) / h(i) - h(i) / 2.0 * m(i, 0) - h(i) * (m(i + 1, 0) - m(i, 0)) / 6c = m(i, 0) / 2d = (m(i + 1, 0) - m(i, 0)) / (6.0 * h(i))dx = xx(j) - X(i)yy(j) = a + b * dx + c * dx ^ 2 + d * dx ^ 3Exit ForElseContinue ForEnd IfNextNextReturn yyEnd Function線性插值:
Public Function PiecewiseLinearity(X As Double(), Y As Double(), xx As Double)Dim yy As Double '函數返回的對應xx 的插值For i = 1 To X.Length - 1If xx >= X(i - 1) And xx <= X(i) Thenyy = (xx - X(i)) / (X(i - 1) - X(i)) * Y(i - 1) + (xx - X(i - 1)) / (X(i) - X(i - 1)) * Y(i)Exit ForElseContinue ForEnd IfNextReturn yyEnd Function源程序與exe文件下載地址:精密星歷衛星鐘差插值程序
畢業答辯PPT:https://download.csdn.net/download/weixin_44705612/85820126
歡迎喜歡vb語言的朋友一起交流探討。 本人VB.NET語言水平尚可,有需要代寫程序可以私信我。
總結
以上是生活随笔為你收集整理的精密星历卫星钟差插值程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “约见”面试官系列之常见面试题第十八篇之
- 下一篇: 网络通信基础(局域网、广域网、IP地址、