牛頓迭代法 求方程根


牛頓迭代法

 

 

牛頓迭代法(Newton's method)又稱為牛頓-拉夫遜方法(Newton-Raphson method),它是牛頓在17世紀提出的一種在實數域和復數域上近似求解方程的方法。多數方程不存在求根公式,因此求精確根非常困難,甚至不可能,從而尋找方程的近似根就顯得特別重要。

方法使用函數f(x)的泰勒級數的前面幾項來尋找方程f(x) = 0的根。牛頓迭代法是求方程根的重要方法之一,其最大優點是在方程f(x) = 0的單根附近具有平方收斂,而且該法還可以用來求方程的重根、復根,此時線性收斂,但是可通過一些方法變成超線性收斂。另外該方法廣泛用於計算機編程中。

 

計算公式

設r是f(x) = 0的根,選取x0作為r初始近似值,過點(x0,f(x0))做曲線y = f(x)的切線L,L的方程為y = f(x0)+f'(x0)(x-x0),求出L與x軸交點的橫坐標 x1 = x0-f(x0)/f'(x0),稱x1為r的一次近似值。過點(x1,f(x1))做曲線y = f(x)的切線,並求該切線與x軸交點的橫坐標 x2 = x1-f(x1)/f'(x1),稱x2為r的二次近似值。重復以上過程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),稱為r的n+1次近似值,上式稱為牛頓迭代公式

解非線性方程f(x)=0的牛頓法是把非線性方程線性化的一種近似方法。把f(x)在x0點附近展開成泰勒級數 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其線性部分,作為非線性方程f(x) = 0的近似方程,即泰勒展開的前兩項,則有f(x0)+f'(x0)(x-x0)=0 設f'(x0)≠0則其解為x1=x0-f(x0)/f'(x0) 這樣,得到牛頓法的一個迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。

已經證明,如果是連續的,並且待求的零點是孤立的,那么在零點周圍存在一個區域,只要初始值位於這個鄰近區域內,那么牛頓法必定收斂。 並且,如果不為0, 那么牛頓法將具有平方收斂的性能. 粗略的說,這意味着每迭代一次,牛頓法結果的有效數字將增加一倍。

 

例題:華為OJ

求解立方根

題目描述

•計算一個數字的立方根,不使用庫函數

詳細描述:

•接口說明

原型:

public static double getCubeRoot(double input)

輸入:double 待求解參數

返回值:double  輸入參數的立方根

 


輸入描述:

待求解參數 double類型



輸出描述:

輸入參數的立方根 也是double類型


輸入例子:
216

輸出例子:
6.0


 1 #include "iostream"
 2 #include "string"
 3 #include "vector"
 4 #include "algorithm"
 5 #define E 0.005
 6 
 7 using namespace std;
 8 
 9 double getCubeRoot(double num)
10 {
11     double x0, x1;
12     x0 = num;
13     x1 = x0 - (x0*x0*x0 - num) / (2 * x0*x0);
14     while (x1 - x0 > E || x1 - x0 < -E)
15     {
16         x0 = x1;
17         x1 = x0 - (x0*x0*x0 - num) / (2 * x0*x0);
18 
19     }
20     return x1;
21 
22 }
23 
24 int main()
25 {
26     double n;
27     cin >> n;
28     cout<<getCubeRoot(n);
29 
30 }

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM