我將在“ACM--SOJ總結”中寫關于二分法逼近求方程的解(尤其是不能顯化的).這篇是pengkuny C++ blog中的一篇,我覺得很有必要摘錄一下,供大家參詳。/**? 牛頓迭代法求方程的一個實根
? 牛頓公式:x(k+1) = x(k) - f(x(k)) / f '(x(k))
? 迭代函數:Ф(x) = x - f(x) / f'(x)
? 屬性:方程求根迭代法? ? 此時的迭代函數必須保證X(k)有極限,即迭代收斂。
**/代碼如下:
#include < iostream > #include < cmath > using ? namespace ?std; #define ?f(x)?(x*x*(x-1.0)-1.0)?? // 舉例函數x^3-x^2-1 #define ?g(x)?(3.0*x*x-2.0*x)?? // 導函數3x^2-2x #define ?epsilon?0.0000001?? // 精度 #define ?MAXREAPT?100 bool ?RootNewton( double ? & x) {???? double ?xk1,xk0;????xk0? = ?x;???? for ?( int ?k = 0 ;?k < MAXREAPT;?k ++ )???? {???????? if ?(g(xk0)? == ? 0.0 ) // 牛頓迭代法缺陷在于:收斂是否與初值x0密切相關 ???????? { // 如果g(xk0)數值特別小時,有可能發生從一個根跳到另一個根附近的情況 ????????????cout << " 迭代過程中導數為0. " << endl;???????????? return ? false ;????????} ????????xk1? = ?xk0? - ?f(xk0) / g(xk0); // key?step ???????? if ?(fabs(xk1 - xk0)? < ?epsilon? && ?fabs(f(xk1))? < ?epsilon)???????? { // 注意迭代結束條件是:?|f(xk1)|?<?ε和|xk1-xk0|?<?ε同時成立,防止根跳躍 ????????????x? = ?xk1;???????????? return ? true ;????????} ???????? else ???????? {????????????xk0? = ?xk1;????????} ????} ???? // 迭代失敗 ????cout << " 迭代次數超過預期. " << endl;???? return ? false ;} int ?main() {???? double ?x;????cout << " 牛頓迭代法求方程根,請輸入初始迭代x0值: " << endl;????cin >> x;???? if (RootNewton(x))???? {????????cout << " 該值附近的根為: " << x << endl;????} ???? else ???? {????????cout << " 迭代失敗! " << endl;????} ????system( " pause " );???? return ? 0 ;}