伯恩斯坦多项式插值

Bernstein Polynomial Interpolation

本文关键字:插值 多项式 伯恩斯坦      更新时间:2023-10-16

对于我的作业,我必须实现在区间[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

的例子:带有符号表达式或函数gbernstein(g,n,t)返回n阶Bernstein多项式,在点t处求值。此语法将g视为由symvar(g,1)确定的变量的单变量函数。

如果任何实参是符号型的,bernstein将除函数句柄外的所有实参转换为符号型,并将函数句柄的结果转换为符号型。

我执行程序,您说输出结果是相同的。你离职后对这个项目做了什么改变吗?我对它很感兴趣,因为我家里有一个关于bernstein多项式的作业