Computer >> Máy Tính >  >> Lập trình >> C ++

Nội suy Bessel trong C ++

Nội suy là một loại kỹ thuật ước tính giá trị không xác định nằm giữa các giá trị đã biết. Nội suy là quá trình xây dựng các điểm dữ liệu mới giữa phạm vi của một tập hợp các điểm dữ liệu đã biết rời rạc.

Một ứng dụng hoặc lý do để sử dụng phép nội suy là nó có thể giảm chi phí tính toán. Khi công thức (hàm) để tính toán các giá trị nhất định quá phức tạp hoặc tốn kém để tính toán, chúng tôi thích sử dụng nội suy hơn. Một vài điểm dữ liệu được tính toán bằng cách sử dụng hàm gốc, phần còn lại có thể được ước tính bằng cách sử dụng nội suy. Những điều này có thể không hoàn toàn chính xác nhưng khá gần gũi!

Vì vậy, về cơ bản ở đây, chi phí tính toán giảm và tính đơn giản lớn hơn mất mát do lỗi nội suy.

Công thức nội suy của Bessel

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}+..

đây,

f (0) là điểm gốc thường là điểm giữa.

u =x - f (0) / h, gh là khoảng chênh lệch

Ví dụ

Chương trình minh họa phép nội suy của Bassel -

#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;
}

Đầu ra

Value at 53.2 found using Bessels's interpolation is 7.54985