贝塞尔 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
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP