0

ニュートンラフソン法を使用して10次多項式の根を推定することを想定しているcでプログラムを作成しています。ユーザーは 10 個の係数を入力し、方程式の根を推定することを想定しています。絶対相対誤差は 0.00000001 で、許容される反復の最大数は 70 です。サンプル コードは以下のとおりです。

   n=0;
    while(abserr<=0.00000001){
    yold=y;
    y = y-(poly(y,coefficients,11)/poly_der(y,coefficients,11));
    ynew = y;
    error=ynew-yold;
    abserr=sqrt(error*error);

    printf("iteration x%d = %.2f error =%.2f\n",n+1,y,abserr);
    n++;
    iteration++;

    if(iteration==70){
    printf("you have reached the maximum number of iterations\n");
    break;}
    }

関数 poly と poly_der は、それぞれ多項式とその導関数の値を計算します。定義は以下のとおりです。

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

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

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

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

deri は、多項式の項の導関数を計算する関数です。残念ながら、このプログラムは予期しない結果をもたらします。コンパイルして正常に実行されるため、どこが間違っているのかわかりません。ニュートン法を使用してルートを推定できる別の方法はありますか? 必要な結果が得られるようにプログラムを改善するにはどうすればよいですか。

4

2 に答える 2

5

いくつかの初期化された変数があります:total(2回)そして一見iteration同様です。変数を初期化しない場合、その値は未定義であり、同じプログラムの実行間で異なる場合さえあります。

total = 0.のループに入る前に実行します。polypoly_der

于 2011-03-24T17:22:52.367 に答える
3

役立つ可能性のあるいくつかの事項を次に示します。

  1. 関数を投稿します。
  2. ルートに期待するものを投稿します。
  3. 得られた結果を、提供した入力とともに投稿します。
  4. NR のような反復法では、どこから開始するかによって異なる結果が得られる可能性があるため、選択した開始条件について考えてください。
  5. NR が与えた局所的最小値ではないと確信している理由を教えてください。
  6. その deri() 関数は何ですか? それはあなたのものですか?
于 2011-03-24T17:21:41.143 に答える