伯恩斯坦多项式插值

时间:2015-10-06 19:12:57

标签: c++ algorithm

对于我的任务,我必须为区间[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;
}

问题:

为什么我的输出具有相同的数字,可能是什么问题?

2 个答案:

答案 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)

我执行程序以及您如何说输出具有相同的结果。您的帖子后,您是否在此计划中进行了一些更改?我很有意思,因为我在家里有关于伯恩斯坦多项式的作业。