內容來自王曉華老師
這塊內容有點硬核,先做了解,主要學習如何使用迭代解決問題的步驟
在數值分析領域中,人們通常使用迭代法、逼近法和做圖等方法來求解一些復雜問題的近似解,其中迭代法是一類利用遞推公式或循環算法通過構造序列來求問題近似解的方法,把這種迭代求解數學問題的方法直接體現在算法中,就可以認為是設計領域中的迭代法。
代數法求解低階非線方程
用代數方法求一元非線性方程的解的方法有很多,常用的方法有開平方法、配方法、因式分解法、公式法等,近似求解的方法有作圖法以及各種迭代法
代數法求解方程雖然准確性好、精度高,但是不利於編制計算機程序,所以在數值分析領域,常用各種迭代法求解一元非線性方程。常用的求解一元非線性方程的方法有二分逼近法和牛頓迭代法,
二分逼近法
牛頓迭代法
牛頓迭代法又稱為牛頓-拉弗森方法(Newton-Raphson Method),它是一種在實數域和復數域上近似求解方程的方法。既然是迭代法,那么牛頓迭代法的算法實現肯定適合用迭代法模式。
導函數的求解與近似公式
牛頓迭代法算法實現
根據牛頓迭代法的迭代關系公式,牛頓迭代法的迭代變量就是要求的結果 xx ,迭代的初始值可以選擇一個比較接近近似解的值,對於單調區間來說,這個值可以是任意值,甚至可以是區間邊界值,迭代遞推關系就是上面數學原理部分給出的迭代公式,迭代終止條件就是找到一個精度符合要求的近似解。判斷迭代變量是否就是符合精度的解的方法就是計算最近兩個迭代的值,看其差值是否小於迭代精度差值的要求。根據迭代遞推關系,用循環實現迭代遞推最簡單。設計算法時,為了防止因為迭代不收斂導致的死循環,一般還可以增加一個迭代退出條件,即設置一個迭代次數上限。
double NewtonRaphson(FunctionPtr f, double x0) { double x = INVALID_VALUE; int count = 0; do { double x1 = x0 - f(x0) / CalcDerivative(f, x0); //應用迭代遞推關系 if (fabs(x1 - x0) < PRECISION) { x = x1; break; } x0 = x1; //更新迭代變量 count++; } while (count < MAX_RUN_LOOP); return x; }
參數 x0 是迭代初始值。選擇與上面相同的例子函數,並將迭代初始值設置為區間最大值 8.0,使用牛頓迭代法也只需要 7 次迭代,就可以得到和二分逼近法精度一樣的近似解。選擇初始值 -8.0 從另一個方向計算,還可以得到另一個解 x= -2.040967365,計算這個解也只需要 6 次迭代,可見牛頓迭代法的收斂速度是超線性的。
總結
使用迭代法,需要首先確定問題是否存在迭代關系,如果存在迭代關系,就嘗試確定迭代算法需要的三個關鍵要素
它們分別是迭代變量、迭代遞推關系公式和迭代終止條件。首先確定迭代變量,迭代變量是由迭代關系式確定的,一般情況下,迭代變量就是計算結果,接下來是確定迭代遞推關系,最后是迭代退出條件