我正在尝试对分段二次拉格朗日进行编程,但我必须处理我试图评估的点所属的这些区间。所以,在我们应用公式之前,基本上你需要有一个 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;
}