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步二次收敛。因此,可以更大胆一点,如果 10 步后迭代不收敛,则初始点很糟糕,无论是导致周期轨道还是发散到无穷大。最有可能的是,附近的初始点将表现相似,因此在下一次迭代运行开始时对初始点进行非平凡的更改。


补充说明:

  • 研究用于评估多项式(及其导数)的霍纳方案和双霍纳方案。不建议使用幂函数。

  • 考虑一下多项式可能没有真正根的情况。

  • 有关通过牛顿法找到多项式所有根的一般思路,请参阅 JH Hubbard、D. Schleicher、S. Sutherland:如何通过牛顿法找到复多项式的所有根,发明数学卷。146 (2001) - 讨论了牛顿分形的全局结构

于 2014-07-09T15:03:35.570 回答