0

我正在尝试用 C++实现本文中给出的 PASCAL 代码,我的尝试是

#include <iostream>
using namespace std;

int GenFact(int a, int b)
{                               // calculates the generalised factorial
                                // (a)(a-1)...(a-b+1)
    int gf = 1;
    for (int jj = (a - b + 1); jj < a + 1; jj++)
    {
        gf = gf * jj;
    }
    return (gf);
}                               // end of GenFact function

double GramPoly(int i, int m, int k, int s)
{                               // Calculates the Gram Polynomial ( s = 0 ),
                                // or its s'th
    // derivative evaluated at i, order k, over 2m + 1 points

    double gp_val;

    if (k > 0)
    {
        gp_val = (4.0 * k - 2.0) / (k * (2.0 * m - k + 1.0)) *
              (i * GramPoly(i, m, k - 1, s) +
                 s * GramPoly(i, m, k - 1.0, s - 1.0)) -
              ((k - 1.0) * (2.0 * m + k)) /
              (k * (2.0 * m - k + 1.0)) *
              GramPoly(i, m, k - 2.0, s);
    }
    else
    {
        if ((k == 0) && (s == 0))
        {
            gp_val = 1.0;
        }
        else
        {
            gp_val = 0.0;
        }                       // end of if k = 0 & s = 0
    }                           // end of if k > 0

    return (gp_val);

}                               // end of GramPoly function

double Weight(int i, int t, int m, int n, int s)
{                               // calculates the weight of the i'th data
                                // point for the t'th Least-square
    // point of the s'th derivative, over 2m + 1 points, order n

    double sum = 0.0;

    for (int k = 0; k < n + 1; k++)
    {
        sum += (2.0 * k + 1.0) *
               GenFact(2.0 * m + k + 1.0, k + 1.0) *
               GramPoly(i, m, k, 0) * GramPoly(t, m, k, s);
    }                           // end of for loop

    return (sum);

}                               // end of Weight function

int main()
{
    double z;
    z = Weight(-2, -2, 2, 2, 0);
    cout << "The result is " << z;
    return 0;
}

但是,当我运行代码时,输​​出为 1145,而根据等式 12 和论文中给出的表格,我期望 31/35 = 0.88571。我的错误在哪里?

4

3 回答 3

1

你的Weight功能是错误的 - 缺少一个术语......试试这个:

double Weight( int i , int t , int m , int n , int s )
{ // calculates the weight of the i'th data point for the t'th Least-square
  // point of the s'th derivative, over 2m + 1 points, order n

    double sum = 0.0 ;
    for ( int k = 0 ; k <= n ; k++ )
    {
        sum += (2*k+1) * 
               ( 
                   GenFact(2*m,k) /          //<-- here
                   GenFact(2*m+k+1,k+1) 
               ) * GramPoly(i,m,k,0) * GramPoly(t,m,k,s) ;

    } // end of for loop
    return ( sum ) ;

} // end of Weight function
于 2013-09-14T19:12:25.557 回答
1

第一个函数GenFact应该是 return a floatordouble而不是int。因此gf也应该是浮点类型。

其次,您的功能Weight与论文中的功能不同。我想你错过了这个部分GenFact(2 * m, k)

于 2013-09-14T19:00:51.937 回答
1

除了前面的答案 - 你应该除以 GenFact(2.0 * m + k + 1.0, k + 1.0),而不是乘以(至少论文是这样说的)。

于 2013-09-14T19:07:01.973 回答