迭代法也稱展轉法,是一種不斷用變量的舊值遞推新值的過程,跟迭代法相對應的是直接法(或者稱爲一次解法),即一次性解決問題。迭代法又分爲精確迭代和近似迭代。「二分法」和「牛頓迭代法」屬於近似迭代法。迭代算法是用計算機解決問題的一種基本方法。算法
利用迭代算法解決問題,須要如下三個步驟:ide
1.肯定迭代變量 在能夠用迭代算法解決的問題中,至少存在一個直接或間接地不斷由舊值遞推出新值的變量,這個變量就是迭代變量。 2.創建迭代關係式 所謂迭代關係式,指如何從變量的前一個值推出其下一個值的公式(或關係)。迭代關係式的創建是解決迭代問題的關鍵,一般能夠順推或倒推的方法來完成。 3.對迭代過程進行控制 在何時結束迭代過程?這是編寫迭代程序必須考慮的問題。不能讓迭代過程無休止地重複執行下去。迭代過程的控制一般可分爲兩種狀況:一種是所需的迭代 次數是個肯定的值,能夠計算出來;另外一種是所需的迭代次數沒法肯定。對於前一種狀況,能夠構建一個固定次數的循環來實現對迭代過程的控制;對於後一種情 況,須要進一步分析出用來結束迭代過程的條件。
頭文件:code
/***************************************************************************************************** *Copyright:Yue Workstation * *FileName:Iterate.h * *Function:迭代算法數據定義 * *Author:Abel Lee * *CreateOn:2012-2-19 * *Log:2012-2-19 由Abel Lee建立 *****************************************************************************************************/ #ifndef ITERATE_H #define ITERATE_H #include "global.h" #define Epsilon 1.0E-6 int GetTheEquationRoot(void); float MySqrt(float x); #endif
源文件:it
/***************************************************************************************************** *Copyright:Yue Workstation * *FileName:Iterate.c * *Function: 迭代法的應用實例 * *Author:Abel Lee * *CreateOn:2012-2-19 * *Log:2011-5-3 由Abel Lee建立 *****************************************************************************************************/ #include "../inc/Iterate.h" #include <math.h> /**************************************************************************************************** *Function Name: GetTheEquationRoot * *Function: 用牛頓迭代法求方程2*x*x*x-4*x*x+3*x-6 = 0的根 * *Parameter: 無 * *Return Value:成功返回0,失敗返回-1 * *Author:Abel Lee * *Log:2012-2-19 ***************************************************************************************************/ int GetTheEquationRoot(void) { float x1,x0=1.5; x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3); while(fabs(x1-x0>=Epsilon)) { x0=x1; x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3); } printf("The Root is:%f\n",x1); return 0; } /**************************************************************************************************** *Function Name: MySqrt * *Function: 迭代法求一個數的平方根 * *Parameter: x:要求平方根的數 * *Return Value:成功返回根植,失敗返回-1 * *Author:Abel Lee * *Log:2012-2-19 ***************************************************************************************************/ float MySqrt(float x) { float a,x0,x1; if(x < 0) { return -1; } a = x; x0=a/2; x1=(x0+a/x0)/2; while(fabs(x1-x0)>=Epsilon) { x0 = x1; x1=(x0+a/x0)/2; } return x1; }