1

11 個の係数を持つ 10 次多項式の値を生成しようとしています。また、その派生物を生成しようとしています。以下に示す3つの関数を作成しました。このコードは多項式の値を生成します。a1 から a10 までが係数です。

float polynm( float a0,float a1,float a2,float a3,float a4,float a5,float a6,float a7,float a8,float a9,float a10,float x)
     {
          float poly = a0 + a1*x + a2*pow(x,2)+a3*pow(x,3)+a4*pow(x,4)+a5*pow(x,5)+a6*pow(x,6)+a7*pow(x,7)+a8*pow(x,8)+a9*pow(x,9)+a10*pow(x,10);
             return poly;
             }

このコードは、関数 deri を呼び出す多項式の導関数の値を生成します

 float polynm_der(float a0,float a1,float a2,float a3,float a4,float a5,float a6,float a7,float a8,float a9,float a10,float x)
    {  float der = a1 + a2*deri(x,2)+a3*deri(x,3)+a4*deri(x,4)+a5*deri(x,5)+a6*deri(x,6)+a7*deri(x,7)+a8*deri(x,8)+a9*deri(x,9)+a10*deri(x,10);
       return der;
       }
deri is below
float deri(float x,int n)
   {   
         float term_der = n*pow(x,n-1);
           return term_der;
           }

多項式のコードは非効率的です。100 次の多項式を生成したい場合、それは不可能になります。扱いにくいコードを避けるために、多項式とその導関数を再帰的に生成する方法はありますか。

4

2 に答える 2

6

1つの解決策は、係数の配列とその長さを受け入れることです。

float poly(int x, float coefficients[], int order)
{
    int idx;
    float total;

    for (idx = 0; idx < order; idx++)
        total += coefficients[idx] * pow(x, idx);
    return total;
}

再帰的な解決策は美しいでしょうが、これはLispではありません。とにかく、同様のアプローチをデリバティブに使用できます。Cでは、関数への配列パラメーターがポインターに変わるsizeofため、長さを取得するなどのクールなものを使用できないことに注意してください。

編集:コメントに応じて、coefficientsアレイの構築時に要件を適用できます。または、そのコードを担当していない場合は、次のように関数に(ハッキング的に)貼り付けることができます。

if (coefficients[0] == 0 || coefficients[1] == 0 || coefficients[order-1] == 0)
    assert(0);
于 2011-03-22T17:44:48.773 に答える
0

関数を書き直して、x値、係数の配列、そして長さを取得することができます。

于 2011-03-22T17:45:53.423 に答える