1

私はこの方程式を持っていて ここ 、次の多項式を見つけます ここ

私はそれを次のように実装しようとしています:

for (int n=0;n<order;n++){
    df[n][0]=y[n];
    for (int i=0;i<N;i++){ //N number of points

        df[n][i]+=factorial(n,i)*y[i+n-1];
    }

    }

for (int i=0;i<N;i++){

    term=factorial(s,i);
    result*=df[0][i]*term;
    sum+=result;
    }

return sum;

1)関数内のすべての引数の符号を実装する方法がわかりません。ご覧のとおり、「正」、「負」、「正」になります。

2)間違いがないかわかりません...

ありがとう!

----------------------階乗--------------------------- -

int fact(int n){
//3!=1*2*3
if (n==0) return 1;
else
return n*fact(n-1);

}

double factorial(double s,int n){
//(s 3)=s*(s-1)*(s-2)/6
if ((n==0) &&(s==0)) return 1;
else
    return fact(s)/fact(n);


}
4

4 に答える 4

3

最も簡単な解決策は、おそらく、符号を変数に保持し、ループを通過するたびにそれを乗算することです。何かのようなもの:

sign = 1.0;
for ( int i = 0; i < N; ++ i ) {
    term = factorial( s, i );
    result *= df[0][i] * term;
    sum += sign * result;
    sign = - sign;
}
于 2013-01-14T17:42:00.650 に答える
2

できませんpow( -1, m )

あなたはあなた自身を書くことができます:

inline int minusOnePower( unsigned int m )
{
    return (m & 1) ? -1 : 1;
}

計算値のテーブルを作成することをお勧めします。

于 2013-01-14T18:21:38.073 に答える
1

ええと、等距離の点を持つニュートン補間多項式(より具体的にはニュートン-グレゴリー前方差分補間多項式)を使用して、与えられたx = Xの値f(x)を概算したいと思います。s =(X-x0)/ hと仮定します。ここで、x0は最初のxであり、hは、fの正確な値がわかっている残りのxを取得するためのステップです。

double coef (double s, int k)
{
    double c(1);
    for (int i=1; i<=k ; ++i)
        c *= (s-i+1)/i ;
    return c;
}

double P_interp_value(double s, int Num_of_intervals , double f[] /* values of f in these points */)    // P_n_s
{

    int N=Num_of_intervals ;

    double *df0= new double[N+1]; // calculing df only for point 0

    for (int n=0 ; n<=N ; ++n)  // n here is the order
    {
        df0[n]=0;
        for (int k=0, sig=-1; k<=n; ++k, sig=-sig) // k here is the "x point"
        {
            df0[n] += sig * coef(n,k) * f[n-k];
        }
    }

    double P_n_s = 0;

    for (int k=0; k<=N ; ++k )   // here k is the order
    {
        P_n_s += coef(s,k)* df0[k];
    }
    delete []df0;

    return P_n_s;
}


int main()
{
    double s=0.415, f[]={0.0 , 1.0986 , 1.6094 , 1.9459 , 2.1972 };

    int n=1; // Num of interval to use during aproximacion. Max = 4 in these example
    while (true)
    {
    std::cin >> n; 
    std::cout << std::endl << "P(n=" << n <<", s=" << s << ")= " << P_interp_value(s, n, f)  << std::endl ;
    }
}

それは印刷します:

1

P(n = 1、s = 0.415)= 0.455919

2

P(n = 2、s = 0.415)= 0.527271

3

P(n = 3、s = 0.415)= 0.55379

4

P(n = 4、s = 0.415)= 0.567235

比較対象: http: //ecourses.vtu.ac.in/nptel/courses/Webcourse-contents/IIT-KANPUR/Numerical%20Analysis/numerical-analysis/Rathish-kumar/rathish-oct31/fratnode8.html

できます。これで、これらのコードの最適化を開始できます。

于 2013-01-15T01:58:13.893 に答える
0

サインのためだけに;-)

inline signed int minusOnePower( unsigned int m )
{
    return 1-( (m & 1)<<1 );
}
于 2013-01-15T09:20:04.293 に答える