分段二次拉格朗日

计算科学 数值分析
2021-12-15 08:00:23

我正在尝试对分段二次拉格朗日进行编程,但我必须处理我试图评估的点所属的这些区间。所以,在我们应用公式之前,基本上你需要有一个 if 语句,这是它的图片。拉格朗日

我不确定如何编写 if 语句,如果有人可以帮助我,我将不胜感激,这是我到目前为止的代码:

/*Your experiments should include the following functions on [−1, 1]:
 * f(x) = |ax|
 * f(x) = |ax| + x/2 - x^2 
 * f(x) = 1/(1+ ax^2) 
 */

#include <iostream>
#include <math.h>

using namespace std;

// Piecewise linear Lagrange --- Lagrange Form
float LagrangeQuad(float x[], float x_eval, float f[], int n);



int main() {
    int n = 100;

    // 100 x points
    float x[n+1];
    // Step size for interval [-1,1]
    float h = (1.0 - (-1.0))/100.0;
    for(int i = 0; i <= n; i++){
        x[i] = -1 + i*h;
    }

    //Function values single
    float alpha = 1.0;
    float f_0[n+1], f_1[n+1], f_2[n+1];
    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));
    }

    // Create new set of x values that we will use to compare the interpolation
    float x_test[n+1];
    float h_test = (1.0 - (-1.0))/1000.0;
    for(int i = 0; i <= n; i++){
        x_test[i] = -1 + i*h_test;
    }

    // Compute the Lagrange polynomial single
    float f0_eval[n+1];
    float f1_eval[n+1]; 
    float f2_eval[n+1];
    for(int i = 0; i <= n; i++){
        f0_eval[i] = LagrangeQuad(x,x_test[i],f_0,n);
        cout << f0_eval[i] << endl;
    }

    return 0;
}

float LagrangeQuad(float x[], float x_eval, float f[], int n){
    float fun;
    float fun1;
    float fun2;
    float xdiff;
    float xdiff1;
    float xdiff2;
    float xdiff3;
    float xdiff4;
    float xdiff5;
    float result;

    for(int i = 0; i < n; i++){
        if(x_eval >= x[i] && x_eval <= x[i+1] ){
        fun = f[i];
        fun1 = f[i+1];
        fun2 = f[i+2];
        xdiff = (x_eval - x[i+1])*(x_eval - x[i+2]);
        xdiff1 = (x[i] - x[i+1])*(x[i] - x[i+2]);
        xdiff2 = (x_eval - x[i])*(x_eval - x[i+2]);
        xdiff3 = (x[i+1] - x[i])*(x[i+1] - x[i+2]);
        xdiff4 = (x[i+2] - x[i])*(x[i+2] - x[i+1]);
        }
    }
    result = fun*(xdiff/xdiff1) + fun1*(xdiff2/xdiff3) + fun2*(xdiff4/xdiff5);

    return result;
}
1个回答

好的,在您的 Langrange 函数中,应该是:

for(int i = 0; i < (n-1)/2; i++){
    if(x_eval >= x[2*i] && x_eval <= x[2*i+2] ){
        fun = f[2*i];
        fun1 = f[2*i+1];
        fun2 = f[2*i+2];
        xdiff = (x_eval - x[2*i+1])*(x_eval - x[2*i+2]);
        xdiff1 = (x[2*i] - x[2*i+1])*(x[2*i] - x[2*i+2]);
        xdiff2 = (x_eval - x[2*i])*(x_eval - x[2*i+2]);
        xdiff3 = (x[2*i+1] - x[2*i])*(x[2*i+1] - x[2*i+2]);
        xdiff4 = (x_eval - x[2*i])*(x_eval - x[2*i+1]);
        xdiff5 = (x[2*i+2] - x[2*i])*(x[2*i+2] - x[2*i+1]);
    }
}

另外,我认为您想要奇数个点,例如 [x0, x1, x2, x3, x4] 这样就有偶数个间隔(在本例中为 2)。在它说的问题中n必须是偶数,但我认为这可能指的是间隔数而不是点数?不过我可能是错的。

编辑 我想我现在明白你做了什么。您使 n=100 (偶数),但数组的长度为 n+1 (奇数),这很好。只要确保你调用你的 langrange 函数,如:

LagrangeQuad(x,x_test[i],f_0,n+1);   //make sure its n+1, not n
                                     //your arrays are of length n+1 remember!