1. 程式人生 > >牛頓迭代法(牛頓-拉弗森方法(Newton-Raphson method))

牛頓迭代法(牛頓-拉弗森方法(Newton-Raphson method))

起源[編輯]

牛頓法最初由艾薩克·牛頓流數法Method of Fluxions,1671年完成,在牛頓死後的1736年公開發表)。約瑟夫·拉弗森也曾於1690年在中提出此方法。

方法說明[編輯]

藍線表示方程f而紅線表示切線. 可以看出xn+1xn更靠近f所要求的根x.

首先,選擇一個接近函式f(x)零點x_0,計算相應的f(x_0)和切線斜率f'(x_0)(這裡f'表示函式f導數)。然後我們計算穿過點(x_0, f(x_0))並且斜率為f'(x_0)的直線和x軸的交點的x座標,也就是求如下方程的解:

f(x_0)= (x_0-x)\cdot f'(x_0)

我們將新求得的點的x座標命名為x_1,通常x_1會比x_0更接近方程f(x)=0的解。因此我們現在可以利用x_1開始下一輪迭代。迭代公式可化簡為如下所示:

x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

已經證明,如果f'

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

利用迭代演算法解決問題,需要做好以下三個方面的工作: 一、確定迭代變數 在可以用迭代演算法解決的問題中,至少存在一個可直接或間接地不斷由舊值遞推出新值的變數,這個變數就是迭代變數。 二、建立迭代關係式 所謂迭代關係式,指如何從變數的前一個值推出其下一個值的公式(或關係)。迭代關係式的建立是解決迭代問題的關鍵,通常可以使用遞推或倒推的方法來完成。 三、對迭代過程進行控制 在什麼時候結束迭代過程?這是編寫迭代程式必須考慮的問題。不能讓迭代過程無休止地執行下去。迭代過程的控制通常可分為兩種情況:一種是所需的迭代次數是個確定的值,可以計算出來;另一種是所需的迭代次數無法確定。對於前一種情況,可以構建一個固定次數的迴圈來實現對迭代過程的控制;對於後一種情況,需要進一步分析得出可用來結束迭代過程的條件。

3
示例編輯

歐幾里德演算法

最經典的迭代演算法是歐幾里德演算法,用於計算兩個整數a,b的最大公約數。其計算原理依賴於下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 證明:a可以表示成a = kb + r,則r = a mod b。假設d是a,b的一個公約數,則有 a%d==0,b%d==0,而r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公約數 同理,假設d 是(b,a mod b)的公約數,則 b%d==0,r%d==0 ,但是a = kb +r ,因此d也是(a,b)的公約數。 因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。 歐幾里德演算法就是根據這個原理來做的,歐幾里德演算法又叫輾轉相除法,它是一個反覆迭代執行,直到餘數等於0停止的步驟,這實際上是一個迴圈結構。其演算法用C語言描述為: int Gcd_2(int a,int b)/*歐幾里德演算法求a,b的最大公約數*/ { if (a<=0 || b<=0)/*預防錯誤*/ return 0; int temp; while (b > 0)/*b總是表示較小的那個數,若不是則交換a,b的值*/ { temp = a % b;/*迭代關係式*/ a = b; b = temp; } return a; } 從上面的程式我們可以看到a,b是迭代變數,迭代關係是temp = a % b;根據迭代關係我們可以由舊值推出新值,然後迴圈執a = b; b = temp;直到迭代過程結束(餘數為0)。在這裡a好比那個膽小鬼,總是從b手中接過位置,而b則是那個努力向前衝的先鋒。

斐波那契數列

還有一個很典型的例子是斐波那契(Fibonacci)數列。斐波那契數列為:0、1、1、2、3、5、8、13、21、…,即 fib⑴=0; fib⑵=1;fib(n)=fib(n-1)+fib(n-2) (當n>2時)。 在n>2時,fib(n)總可以由fib(n-1)和fib(n-2)得到,由舊值遞推出新值,這是一個典型的迭代關係,所以我們可以考慮迭代演算法。 int Fib(int n) //斐波那契(Fibonacci)數列 { if (n < 1)/*預防錯誤*/ return 0; if (n == 1 || n == 2)/*特殊值,無需迭代*/ return 1; int f1 = 1,f2 = 1,fn;/*迭代變數*/ int i; for(i=3; i<=n; ++i)/*用i的值來限制迭代的次數*/ { fn = f1 + f2; /*迭代關係式*/ f1 = f2;//f1和f2迭代前進,其中f2在f1的前面 f2 = fn; } return fn; }

4C語言程式碼編輯

double func(double x) //函式 { return x*x*x*x-3*x*x*x+1.5*x*x-4.0; } double func1(double x) //導函式 { return 4*x*x*x-9*x*x+3*x; } int Newton(double *x,double precision,int maxcyc) //迭代次數 { double x1,x0; int k; x0=*x; for(k=0;k<maxcyc;k++) { if(func1(x0)==0.0)//若通過初值,函式返回值為0 { printf("迭代過程中導數為0!\n"); return 0; } x1=x0-func(x0)/func1(x0);//進行牛頓迭代計算 if(fabs(x1-x0)<precision || fabs(func(x1))<precision) //達到結束條件 { *x=x1; //返回結果 return 1; } else //未達到結束條件 x0=x1; //準備下一次迭代 } printf("迭代次數超過預期!\n"); //迭代次數達到,仍沒有達到精度 return 0; } int main() { double x,precision; int maxcyc; printf("輸入初始迭代值x0:"); scanf("%lf",&x); printf("輸入最大迭代次數:"); scanf("%d",&maxcyc); printf("迭代要求的精度:"); scanf("%lf",&precision); if(Newton(&x,precision,maxcyc)==1) //若函式返回值為1 printf("該值附近的根為:%lf\n",x); else //若函式返回值為0 printf("迭代失敗!\n"); getch(); return 0; }

5C++程式碼編輯

//此函式是用來求一元3次方程ax^3+bx^2+cx+d=0的解 //比如 x^3-27=0,我們就可以輸入1 0 0 -27,這樣我們就可以得到一個解 #include<iostream> #include<cmath> using namespace std; int main() { double diedai(double a,double b,double c,double d,double x); double a,b,c,d; double x=10000.0; cout<<"請依次輸入方程四個係數:"; cin>>a>>b>>c>>d; x=diedai(a,b,c,d,x); cout<<x<<endl; return 0; } double diedai(double a,double b,double c,double d,double x) { while(abs(a*x*x*x+b*x*x+c*x+d)>0.000001) { x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c); } return x; }

6matlab程式碼編輯

定義函式

function y=f(x) y=f(x);%函式f(x)的表示式 end function z=h(x) z=h(x);%函式h(x)的表示式 end

主程式

x=X;%迭代初值 i=0;%迭代次數計算 while i<= 100%迭代次數 x0=X-f(X)/h(X);%牛頓迭代格式 if abs(x0-X)>0.01;%收斂判斷 X=x0; else break end i=i+1; end fprintf('\n%s%.4f\t%s%d','X=',X,'i=',i) %輸出結果

相關推薦

牛頓(牛頓-方法Newton-Raphson method)

起源[編輯] 牛頓法最初由艾薩克·牛頓在《流數法》(Method of Fluxions,1671年完成,在牛頓死後的1736年公開發表)。約瑟夫·拉弗森也曾於1690年在中提出此方法。 方法說明[編輯] 藍線表示方程f而紅線表示切線. 可以看出xn+1

牛頓方法Newton's Method

      在講義《線性迴歸、梯度下降》和《邏輯迴歸》中我們提到可以用梯度下降或梯度上升的方式求解θ。在本文中將講解另一種求解θ的方法:牛頓方法(Newton's method)。 牛頓方法(Newton's method)      邏輯迴歸中利用Sigmo

使用牛頓-定義平方根函數Newton-Raphson method Square Root Python

pytho 現在 itl 差值 python 牛頓叠代法 bds aik 之前 牛頓法(Newton’s method)又稱為牛頓-拉弗森法(Newton-Raphson method),是一種近似求解實數方程式的方法。(註:Joseph Raphson在1690年出版的《

K Best POJ - 3111 (牛頓)

傳送門 題意:有n個物品的重量和價值分別是wi和vi。從中選出k個物品使得單位重量的價值最大。 題解:先取前k個元素算出S0 =∑(vi/wi) 作為初始值,然後對每一個元素(n個)求yi=vi-s0*wi,對yi從大到小排序,取前k個元素算出S,重複上面的運算(每次迴圈後把S的值賦給S0,

【R語言-20行程式碼】牛頓求伽馬函式極大似然估計的引數估計

簡述 研究了下計算公式,簡化了一下,用r語言實現了。 演算法解釋 牛頓迭代法 x

牛頓求根

三次方根 (cube.pas/c/cpp) 【問題描述】 自從在第2題中老師們的工作積極性提高以來,以Fengzee為首的學生們苦不堪言,因為老師給他們留了太多的作業,有些作業甚至是幾乎無法完成的。這次,數學老師佈置下了10道開三次方的作業題,要求同學們筆算完成。Fengzee當然不會花時間做這種沒用的

計算平方根【牛頓

計算任意數字的平方根 import java.util.*; import java.math.*; public class Main{ public static double sqrt(double c) { if(c<0) return Double.NaN; d

zoj-4005牛頓|手動開根號

手動開根還沒學會。。。主要是程式碼太迷了得研究下 要學手動開根的話可以參考一下連結: https://www.cnblogs.com/KasenBob/p/10041399.html 我是用了牛頓迭代法,可以參考以下內容: http://www.matrix67.com/blog/archives/3

C程式設計案例牛頓求高次方程的根

牛頓迭代法求方程的根 1. 牛頓迭代法的幾何解釋 註解: 設 r r

Java資料結構:牛頓求非線性方程的解

根據以上思想 public class 牛頓迭代法 { static double func(double x) { //待求解方程 return x * x * x * x - 3 * x * x * x + 1.5 * x * x - 4.0; } s

牛頓含輾轉相除法原理:近似求解方程的根

結論:迭代序列: x (n+1)=  x (n)- f ( x(n) ) / f '( x(n) ) (附C++程式碼) (通過不斷作切線找切線與x軸交點重複,交點不斷向根逼近) 牛頓迭代法:在實數和複數域求方程的近似根,由泰勒級數前幾項尋找 計算方法: 設 x

牛頓C++

牛頓迭代法(C++)  摘自百度文庫 題目:給定方程        , 使用牛頓法解方程的根。 #include<iostream> #include&l

牛頓快速尋找平方根

轉自http://www.matrix67.com/blog/archives/361  下面這種方法可以很有效地求出根號a的近似值:首先隨便猜一個近似值x,然後不斷令x等於x和a/x的平均數,迭代個六七次後x的值就已經相當精確了。    例如,我想求根號2

c++ 牛頓求根原始碼c++函式有多個不同型別返回值的處理方法

#include <iostream> #include<cmath> using namespace std; struct result { double x;

poj 3111 K Best 牛頓

牛頓迭代法參考連結:我愛維基 首先,選擇一個接近函式零點的,計算相應的和切線斜率(這裡表示函式的導數)。然後我們計算穿過點並且斜率為的直線和軸的交點的座標,也就是求如下方程的解: 我們將新求得的點的座標命名為,通常會比更接近方程的解。因此我們現在可以利用開始下一輪迭代。迭代公式可化

牛頓——C語言

include <stdio.h> include <math.h> int main() { flaot solution(float a,flaot b,float c,float d); float a; float b; floa

牛頓解非線性方程matlab實現

1.功能本程式採用牛頓法,求實係數高次代數方程f(x)=a0xn+a1xn-1+…+an-1x+an=0 (an≠0)(1)的在初始值x0附近的一個根。2.使用說明(1)函式語句Y=NEWTON_1(A,N,X0,NN,EPS1) 呼叫M檔案newton_1.m。(2)引數

求解一元多次方程的兩種方法牛頓和二分

求解方程x*x*x-2*x-1=0,C語言實現 一:牛頓迭代法,牛頓迭代法是從泰勒公式中取前兩項構成線性近似方程,從x0開始,一步一步接近近似解,直到誤差在限定範圍內。 //牛頓迭代法求求解方程的根 #include <stdio.h> #include &l

牛頓解非線性方程組MATLAB版

牛頓迭代法,又名切線法,這裡不詳細介紹,簡單說明每一次牛頓迭代的運算:首先將各個方程式在一個根的估計值處線性化(泰勒展開式忽略高階餘項),然後求解線性化後的方程組,最後再更新根的估計值。下面以求解最簡單的非線性二元方程組為例(平面二維定位最基本原理),貼出原始碼: 1、