伯恩斯坦多项式插值
Bernstein Polynomial Interpolation
对于我的作业,我必须实现在区间[0,1]上定义的Bernstein多项式的算法。
我的实验需要包括以下函数:f(x) = |ax|,为了简单起见,在我的代码中我让a = 1。在实现算法时,我使用了我们书中的Matlab代码(第一张图)和教授在他的笔记中定义的方式(第二张图):教授在他的笔记中定义的Matlab代码
我的输出都是相同的数字,我认为问题是我不确定k
需要从公式中得到什么值。下面是我的代码:
#include <iostream>
#include <math.h>
using namespace std;
int combinations(int n, int k);
int fact(int n);
// Bernstein polynomial single precision
float Bernstein(float x[], float f[], int k, int n);
// Bernstein polynomial double precision
//float Bernstein(double x[], double k, int n);
//-------------------------------------------------------------
int main() {
int n,k;
cout << "Enter the degree: " << endl;
cin >> n;
cout << "Enter the k parameter: " << endl;
cin >> k;
float x[n];
double x_0[n];
// stepsize for interval [0,1]
double h = (1.0 - 0)/10.0;
for(int i = 0; i < n; i++){
x[i] = 0 + i*h;
x_0[i] = 0 + i*h;
}
// Compute the f(x_i) = y_i values single precision
float f_0[n], f_1[n], f_2[n];
float alpha = 1.0;
for(int i = 0; i < n; i++){
f_0[i] = fabs(alpha*x[i]);
f_1[i] = fabs(alpha*x[i]) + x[i]/2 - pow(x[i],2);
f_2[i] = 1/(1 + alpha*pow(x[i],2));
}
// Compute the f(x_i) = y_i values double precision
double alpha1 = 1.0;
double f0[n], f1[n], f2[n];
for(int i = 0; i < n; i++){
f0[i] = fabs(alpha1*x_0[i]);
f1[i] = fabs(alpha1*x_0[i]) + x_0[i]/2 - pow(x_0[i],2);
f2[i] = 1/(1 + alpha1*pow(x_0[i],2));
}
for(int i = 0; i < n; i++){
cout << Bernstein(x,f_0,k,n) << endl;
}
return 0;
}
//----------------------------------------------------------
float Bernstein(float x[], float f[], int k, int n){
int C;
float B;
if(k == 0){
C = 1;
}else{
C = combinations(n,k);
}
int t = n - k;
for(int i = 0; i < n; i++){
B = C*pow(x[i],k)*pow((1 - x[i]),t)*f[i];
}
return B;
}
int combinations(int n, int k){
return fact(n) / (fact(k) * fact(n - k));
}
int fact(int n){
int result = 1;
for (int i =1; i <= n; i++){
result = result*i;
}
return result;
}
问题:
为什么我的输出都是相同的数字,可能是什么问题?
bernstein(f,n,t)
与函数句柄f
返回n阶Bernstein多项式symsum(nchoosek(n,k)*t^k*(1-t)^(n-k)*f(k/n),k,0,n)
,在点t
处求值。这个多项式在区间[0,1]
上近似于函数f
。
的例子:带有符号表达式或函数g
的bernstein(g,n,t)
返回n阶Bernstein多项式,在点t
处求值。此语法将g
视为由symvar(g,1)
确定的变量的单变量函数。
如果任何实参是符号型的,bernstein将除函数句柄外的所有实参转换为符号型,并将函数句柄的结果转换为符号型。
我执行程序,您说输出结果是相同的。你离职后对这个项目做了什么改变吗?我对它很感兴趣,因为我家里有一个关于bernstein多项式的作业
相关文章:
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 将使用太多的纹理插值器 - 带旋转的着色器
- 升压插值条件变量可以虚假唤醒吗?
- 如何获得插值极坐标?
- 如何线性插值到不恒定的目的地
- 向心Catmull-Rom样条曲线插值alpha参数
- 使用 OpenGL 插值数据缓冲区?
- 缩放和插值数组
- 骨骼动画:变换矩阵(collada)之间的插值
- 从一组点C++平面插值
- 从 C++14 到 C++98 的端口字符串插值
- 将矢量的数据扩展到指定大小(插值)
- 双线性插值实现的错误
- 如何避免线性插值"trap"?
- 使用 DirectX 11 插值背景颜色?
- OpenGL 缺陷 - 不需要的插值
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- 将 N 个公式替换为一个(字符串插值)
- 如何使用gsl_interp获得多项式插值系数
- 伯恩斯坦多项式插值