2014-07-03 67 views
1

牛頓拉夫遜方法的失效分析說:「對於某些功能,某些起點可能進入無限循環,阻止收斂」。我想在程序中檢查它是否進入無限循環或不使用assert語句。如果進入,那麼程序將終止,說使用這個初始猜測不可能收斂。我如何在程序中檢測到這個循環? 代碼:如何檢測牛頓拉夫遜方法中的循環C

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"); 
} 
+0

向我們展示一些代碼 –

+2

你做其他事情之前:***不要讓爲斷言這種***它不會在發佈版本中被觸發。 –

+0

我想在代碼中有斷言。我已經把一個斷言如f'(x)!= 0。如果僅使用斷言檢測到週期,我想終止程序。 –

回答

5

您不檢查週期性軌道。確定週期然後收斂到軌道太昂貴。


你可以做的是在5次牛頓迭代後檢查二次收斂條件是否近似滿足。爲此,如果函數值的減少量大於4的除數(或者在牛頓步長的步長中,它應該大於2的除數),則檢查3個步驟。

失敗的是,重新啓動一些(隨機)修改的初始點。


對於大多數問題,牛頓法的雙精度的應用程序有2-3個步驟,全球定位,然後4-6步二次收斂的雙浮點格式的精度之前超出。因此,如果經過10步後迭代不會收斂,初始點就很糟糕,因爲它會導致週期軌道或發散到無窮大。最有可能的是,接近初始點的行爲將類似,因此在下一次迭代開始的初始點上做一個不小的改變。


補充說明:

  • 調查霍納方案和多項式(和它們的衍生物)的評價雙霍納方案。使用電源功能是不明智的。

  • 花費一些思考可能沒有多項式的實根的情況。

  • 有關通過牛頓法找出多項式的所有根的一般思想,請參見J.H.Hubbard,D.Schicher,S.Sutherland:How to Find All Roots of Complex Polynomials by Newton's Method,Inventiones Mathematicae vol.22, 146(2001) - 牛頓的全球結構的討論分形