对于我的任务,我必须为区间[0,1]上定义的Bernstein多项式实现算法。
我的实验需要包含以下函数:f(x)= | ax |,为了简单起见我的代码我让a = 1.在实现算法时,我使用了本书中的Matlab代码(第一张图片)以及教授在他的笔记中定义的方式(第二张图片):matlab code professors defines in his notes
我的输出具有相同的数字,我认为问题是我不确定公式中需要的值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;
}
为什么我的输出具有相同的数字,可能是什么问题?
答案 0 :(得分:1)
bernstein(f,n,t)
的 f
返回在symsum(nchoosek(n,k)*t^k*(1-t)^(n-k)*f(k/n),k,0,n)
点评估的n阶Bernstein多项式t
。此多项式在f
区间内近似函数[0,1]
。
实施例:
带有符号表达式或函数bernstein(g,n,t)
的{{1}}返回n阶Bernstein多项式,在点g
处求值。此语法将t
视为由g
确定的变量的单变量函数。
如果任何参数是符号的,bernstein会将除函数句柄之外的所有参数转换为符号,并将函数句柄的结果转换为符号。
答案 1 :(得分:1)
我执行程序以及您如何说输出具有相同的结果。您的帖子后,您是否在此计划中进行了一些更改?我很有意思,因为我在家里有关于伯恩斯坦多项式的作业。