1

ニュートンラフソン法の故障解析は、「関数によっては、いくつかの開始点が無限サイクルに入り、収束を妨げる可能性がある」と述べています。無限サイクルに入っていないか、assert文を使っていないかをプログラム内でチェックしたい。それが入ると、プログラムは、この最初の推測を使用して収束できないと言って終了します。プログラム内でこのサイクルを検出するにはどうすればよいですか? コード:

int user_power, i=0, cnt=0, flag=0;
int coef[10]={0};
float x1=0, x2=0, t=0;
float fx1=0, fdx1=0;

void main()
{
    printf("\n\n\t\t\t PROGRAM FOR NEWTON RAPHSON GENERAL");
    printf("\n\n\n\tENTER THE MAXIMUM POWER:");
    scanf("%d",&user_power);

    for(i=0;i<=user_power;i++)
    {
        printf("\n\t x^%d:",i);
        scanf("%d",&coef[i]);
    }

    printf("\n");
    printf("\n\tINTIAL X1---->");
    scanf("%f",&x1);

    printf("\n ******************************************************");
    printf("\n ITERATION    X1    FX1    F'X1  ");
    printf("\n **********************************************************");

    do
    {
           cnt++;
           fx1=fdx1=0;
           for(i=user_power;i>=1;i--)
           {
                fx1+=coef[i] * (pow(x1,i)) ; //calculating f(x1)
           }
           fx1+=coef[0];
           for(i=user_power;i>=0;i--)
           {
                fdx1+=coef[i]* (i*pow(x1,(i-1))); //calculating f'(x1)
           }
           t=x2;
           assert(fdx1!=0);
           x2=(x1-(fx1/fdx1));

           x1=x2;

           printf("\n %d         %.3f  %.3f  %.3f ",cnt,x2,fx1,fdx1);

    } while((fabs(t - x1))>=0.0001);
    printf("\n\t THE ROOT OF EQUATION IS %f",x2);
    printf("\n");
}
4

1 に答える 1

5

定期的な軌道をチェックしません。周期を決定してから軌道に収束させるにはコストがかかりすぎます。


できることは、二次収束の条件がほぼ満たされているかどうかを 5 ニュートン反復後に確認することです。そのために、関数値の減少が 4 の除数を超える場合 (またはニュートン ステップのステップ長では、2 の除数を超える必要があります)、3 つのステップにわたってチェックします。

それができない場合は、最初のポイントを (ランダムに) 変更して再起動します。


ほとんどの問題では、倍精度でニュートン法を適用すると、倍精度浮動小数点形式の精度を超える前に、2 ~ 3 ステップのグローバル オリエンテーションと、4 ~ 6 ステップの 2 次収束があります。したがって、10 ステップ後に反復が収束しない場合、最初の点が悪かった場合、それが周期的な軌道または無限への発散につながる場合は、さらに大胆になる可能性があります。ほとんどの場合、近くの初期点は同様に動作するため、反復の次の実行の開始のために初期点に重要な変更を加えます。


補足事項:

  • 多項式 (およびその導関数) を評価するためのホーナー スキームとダブル ホーナー スキームを調べます。累乗関数の使用はお勧めできません。

  • 多項式の実根が存在しない可能性がある状況について考えてみましょう。

  • ニュートン法で多項式のすべての根を見つける一般的な考え方については、JH Hubbard、D. Schleicher、S. Sutherland: How to Find All Roots of Complex Polynomials by Newton's Method、Inventiones Mathematicae vol. 146 (2001) - ニュートン フラクタルのグローバル構造についての議論

于 2014-07-09T15:03:35.570 に答える