貝塞爾 C++ 插值


插值是一種估計介於已知值之間的未知值的技術。 插值是構建離散已知資料點範圍內的全新資料點的過程。

使用插值的一個應用或理由是它能降低計算成本。當計算特定值的公式(函式)過於複雜或代價高昂時,我們傾向於使用插值。使用原始函式計算幾個資料點,其餘資料點則可以使用插值進行估計。這些資料點可能並不會完全準確,但相當接近!

因此,基本上這裡的降低計算成本和簡易性比插值誤差帶來的損失更重要。

貝塞爾插值公式

f(u) = {(f(0)+f(1))/2} + {u - ½}𝛥f(0) + {u(u-1)/2!}{(𝛥2 f(-1) + 𝛥2 f(0))/2} + {u(u-1)(u - ½)/3!}𝛥3f(-1) + {u(u+1)(u-1)(u-2)/4!}{(𝛥4f(-2) + 𝛥4f(-1))/2}+..

其中,

f(0) 為原點,通常是中點。

u = x - f(0) / h,gh 為差分間隔

例項

說明貝塞爾插值的程式 −

 線上演示

#include <iostream>
using namespace std;
float calU(float u, int n){
   if (n == 0)
      return 1;
   float result = u;
   for (int i = 1; i <= n / 2; i++)
      result = result*(u - i);
   for (int i = 1; i < n / 2; i++)
      result = result*(u + i);
   return result;
}
int factorial(int n){
   if(n == 1)
      return 1;
   return n * factorial(n-1);
}
int main(){
   int n = 6;
   float x[] = { 50, 51, 52, 53, 54, 55 };
   float y[n][n];
   y[0][0] = 8.000;
   y[1][0] = 7.746;
   y[2][0] = 7.674;
   y[3][0] = 7.571;
   y[4][0] = 7.469;
   y[5][0] = 7.231;
   for (int i = 1; i < n; i++)
      for (int j = 0; j < n - i; j++)
         y[j][i] = y[j + 1][i - 1] - y[j][i - 1];
   float value = 53.2;
   float sum = (y[2][0] + y[3][0]) / 2;
   int index;
   if (n % 2)
      index = n/2;
   else
      index = n/2 - 1;
   float u = (value - x[index]) / (x[1] - x[0]);
   for (int i = 1; i < n; i++) {
      if (i % 2)
         sum+= (((u-(0.5))*calU(u, i - 1)*y[index][i])/factorial(i));
      else
         sum+= ((calU(u, i)*(y[index][i]+y[-- index][i])/(factorial(i)*2)));
   }
   cout<<"Value at "<<value<<" found using Bessels's interpolation is "<<sum;
   return 0;
}

輸出

Value at 53.2 found using Bessels's interpolation is 7.54985

更新於: 06-08-2020

1K+ 瀏覽次數

啟動你的 職業

完成課程並取得認證

開始
廣告
© . All rights reserved.