1

ネビルのアルゴリズムを実装しようとしています。

sin(x) 関数を表す 32 個のポイントがあります。

int N=32,Nx=10000;
step = 1.0 / (N-1);
for (ii = 0; ii < N; ii++){ 
    px[ii] = ii*step*PI;
    py[ii] = sin(px[ii]);}

多項式を評価するための入力ベクトルがあります。

for (ii = 0; ii < Nx; ii++)
   x[ii] = 2.0 * rand() / (double) RAND_MAX; // 0 < x[ii] <= 2

これは私のネビルのブロックです:

double y[Nx];
for (kk=0;kk<Nx;kk++){// for each x[]'s element
    for (jj=1;jj<N-1;jj++){
        for (ii=0;ii<N-1-jj;ii++)
           s[ii]=(((px[jj]-x[kk])*py[ii])+((x[kk]-px[ii])*py[ii]))/(px[jj]-px[ii]);
    }
y[kk]=s[0];//insert in the output array the value just calculated
}

問題はs[ii]、このカウントが正しいかどうかわからないことです。

4

1 に答える 1

2

Neville の方法では、近似する x の値を選択する必要がありますf(x)。これは x 配列の値とは異なります。どの x 値を使用していたかはわかりませんが、x[]配列のすべての値を使用しようとしていた可能性があります。

実装に 1D 出力配列が必要かどうかはわかりませんが、2D 出力配列でこのアルゴリズムを使用した実装例を次に示します。

この例では1. a.、同じページの問題を使用しています。

int i, j;
int n = 4;
double X; //X will be used to approximate f(X).
double x[n]; //The x values.
double y[n]; //The y or f(x) values.
double Q[n][n]; //The output table.

for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
        Q[i][j] = 0.0; //Initializing the Q matrix to 0.

//Hardcoding the x and y values from problem 1. a.
x[0] = 8.1;
x[1] = 8.3;
x[2] = 8.6;
x[3] = 8.7;
y[0] = 16.94410;
y[1] = 17.56492;
y[2] = 18.50515;
y[3] = 18.82091;

X = 8.4; //Want to approximate f(X), or f(8.4).

for (i = 0; i < n; i++)
    Q[i][0] = y[i]; //Setting the first column of Q to y[0] through y[3].

//Neville's method.
for (i = 1; i < n; i++) {
    for (j = 1; j <= i; j++) {
        Q[i][j] = ((X - x[i - j])*(Q[i][j - 1]) 
                        - (X - x[i])*(Q[i - 1][j - 1]))/(x[i] - x[i - j]);
    }
}

printf("Resultant Q matrix:\n");
for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
        printf("%9f ", Q[i][j]);
    }
    printf("\n");
}

答え はf(8.4)、表の右下の数字17.877143です。と とがこれら 2 つの値の間にあるためf(8.3) = 17.56492、もっともらしいです。f(8.6) = 18.5051517.877143

于 2013-01-08T09:14:58.257 に答える