數學之美:牛頓-拉夫遜迭代法原理及其實現

2021-02-08 電子發燒友網

[導讀] 前面剛轉了一篇文章提到了牛頓-拉夫遜(拉弗森)(Newton-Raphson method)方法,感覺這個數學方法很有必要相對深入寫一篇文章來總結分享印證一下自己的理解。這是寫本文的由來,如果發現文章中有錯誤之處,請留言交流討論。

什麼是牛頓-拉夫遜方法? 牛頓其人:Isaac Newton(1642年12月25日– 1727年3月20日)是一位英國數學家,物理學家,天文學家,神學家和作家,被公認為有史以來最有影響力的科學家之一,並且是科學革命的關鍵人物。他的書《自然哲學的數學原理》於1687年首次出版,奠定了古典力學的基礎。牛頓還為光學做出了開創性的貢獻,並與戈特弗裡德·威廉·萊布尼茲(Gottfried Wilhelm Leibniz)發展了無窮微積分的學科。
牛頓
拉弗森Joseph Raphson 生卒不詳,其最著名的著作是1690年出版的《通用分析方程》。它包含一種方法,現在稱其為牛頓-拉夫森方法,用於近似方程式的求根。艾薩克·牛頓(Isaac Newton)在1671年寫的《通量法》中開發了一個非常相似的公式,但是這項工作要到1736年才出版,這是拉夫森分析之後近50年。但是,該方法的Raphson版本比Newton方法更簡單,因此通常被認為是更好的方法。所以,牛頓迭代法(簡寫)就是一種近似求解實數域與複數域求解方程的數學方法。那麼這個方法是具體是什麼原理呢?
牛頓迭代如何迭代? 直接看數學公式描述如何迭代不直觀,先來看動圖就很容易理解牛頓迭代法為什麼叫迭代法以及怎樣迭代的:牛頓迭代法是原理是根據一個初始點由前面描述知道,牛頓迭代法是用來近似求解方程的,這裡有兩個點需要說明:
迭代法非常適合計算機編程實現,實際上計算機編程對於牛頓迭代法廣為應用知道一個直線的一個坐標點

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/*假定待求根函數如下*/
#define    F(x)    (2*(x)*(x)-10*cos(x)+(x)-80)

/*其一階導數為*/
#define   DF(x)    (4*(x)+10*sin(x)+1)

float newton_rooting(float x0,float precision,float min_deltax,int max_iterations)
{
     float xn,xn1,fn,fn1,dfn;
     float deltax;
     int step = 0;
     xn  = x0;
     xn1 = x0;
     do{
       xn  = xn1;
       fn  = F(xn);
       dfn = DF(xn);
       /*判0*/
       if( fabs(dfn) <1e-6 )
       {
            if( fabs(fn)>precision )
                return NAN;
            else
                return fn;
       }

       xn1 = xn - fn/dfn;
       fn1 = F(xn1);
       deltax = fabs(xn1-xn);
       
       step++;
       if( step>max_iterations )
       {
           if( fabs(fn1)<precision )
               return xn;
           else
               return NAN;
       }
     }
     while( fabs(fn1)>precision || deltax>min_deltax );

     return xn1;
}

void main()
{
     float root_guess = 23.0f;
     float precision = 0.00001f;
     float min_deltax = 0.001f;
     float root;
     int step = 7;

     root = newton_rooting( root_guess,precision,min_deltax,step );
     printf("根為: %f,函數值為:%f\n", root,F(root));

     root_guess = -23;
     root = newton_rooting( root_guess,precision,min_deltax,step );
     printf("根為: %f,函數值為:%f\n", root,F(root));
}

根為: 6.457232, 函數值為:0.000004
根為: -6.894969,函數值為:-0.000008

函數值已經很接近於0了,如果還需要更為精確的值,則可以選擇在此基礎上進一步求解,比如利用二分法逼近。需要注意些啥? 求斜率可能為0,如為0時,則可能找到了函數的極值,比如:如果選擇的初始猜測根的接近方程f(x)=0中函數f(x)的拐點 ,Newton-Raphson方法可能開始偏離根。然後,它可能會又收斂回到根。例如

來源:嵌入式客棧

作者:逸珺




聲明本文由作者原創,文章內容系作者個人觀點,電子發燒友網轉載僅作為傳達一種不同的觀點,不代表電子發燒友網對該觀點的贊同或支持,如有異議,歡迎聯繫電子發燒友網。


相關焦點

  • 牛頓:1687年《自然哲學的數學原理》
    牛頓在世時共發表了三個版本的《自然哲學的數學原理》,分別在1687年、1713年及1726年發表,都是拉丁文版本。牛頓去世後的第一個英文譯本是由第三版翻譯而來,出版於1729年,譯者是莫特(Andrew Motte)。在1802年,又出現了根據《自然哲學的數學原理》第一版翻譯的英文譯本。
  • 科學網—牛頓《自然哲學的數學原理》出版
    牛頓《自然哲學的數學原理》出版
  • 牛頓《自然哲學的數學原理》中的科學方法論
    定義包括物體的質量、運動、慣性、作用力、向心力及其3種量度方式,附註則進一步定義了絕對時間、相對時間,絕對空間、相對空間,相對運動和絕對運動等概念。接著,「公理或者運動定律」,給出了著名的牛頓三定律。在隨後的推論和附註中,則介紹了力的合成與分解原理、運動疊加性原理、動量守恆原理、伽利略相對性原理等。正文分為3卷,所有結論都是以命題形式給出,並附有嚴格的證明過程。
  • 牛頓《自然哲學的數學原理》出版—新聞—科學網
    牛頓《自然哲學的數學原理》出版
  • 牛頓和他的《數學原理》
    一個天才墜落了,另一個天才艾薩克·牛頓降生了。和穆罕穆德一樣,牛頓是個遺腹子,牛頓尚未出世,其父已經離世。牛頓的童年並沒有特別之處,小學時成績屬於次等。12歲時因為性格孤僻,不善交流,成績不佳,被班上的同學孤立,受到歧視,甚至挨過同學的揍。牛頓後來回憶說因為受到同學羞辱開始發奮學習,讓他成為了學校裡成績最優異的學生。
  • 1687年上半年,牛頓的《自然哲學之數學原理》這部傑作即將問世
    由於這段時間的努力,牛頓完成了科學史上的偉大著作,即牛頓的《自然哲學之數學原理》一書。不知是巧合,或者是上天的安排,牛頓的這些偉大思想的孕育也經過了18個月,經過20年的辛勤勞動和不懈追求,這些偉大的思想終於成熟。現在,牛頓準備把這部凝聚了他20年心血和人類千百年智慧的偉大著作奉獻給人類了。
  • 最優化算法之牛頓法、高斯-牛頓法、LM算法
    上一篇文章中主要講解了最優化算法中的梯度下降法,類似的算法還有牛頓法、高斯-牛頓法以及LM算法等,都屬於多輪迭代中一步一步逼近最優解的算法,本文首先從數學的角度解釋這些算法的原理與聯繫
  • 閱讀經典--牛頓《自然哲學的數學原理》-
    ——蒲柏(18世紀英國詩人)牛頓的《自然哲學的數學原理》是科學史上一部劃時代巨著,也是人類對自然規律的第一次理論概括和科學歸納,其影響之深遠,幾乎遍布所有自然科學領域。在人類的文明進程上,它造就了英國工業革命,引發了法國大革命和歐洲啟蒙運動,在社會生產力和基本社會制度兩方面都結出了豐碩成果。
  • 十分鐘掌握牛頓法凸優化
    之前,我發過一篇文章,通俗地解釋了梯度下降算法的數學原理和推導過程
  • 自然科學 牛頓:1687年《自然哲學的數學原理》
    出版於1729年的第一英文版牛頓名著《自然哲學的數學原理》1687年,牛頓發表了千年偉著《自然哲學的數學原理》(Philosophiæ Naturalis Principia Mathematica,簡稱Principia),點燃了人類科學認識宇宙的曙光。Principia奠基了牛頓力學的運動方程,提出了萬有引力,發明了微積分。
  • 《自然哲學之數學原理》導讀
    《自然哲學之數學原理》是劃時代的巨著,也是人類掌握的首個完整的、科學的宇宙論和科學理論體系。牛頓在本書中構建了一個人類有史以來最為宏偉的物理理論體系。這一理論體系很好地解釋了當時已知的一切運動形式和現象。   《自然哲學之數學原理》的影響所及,遍布經典物理學的所有領域,並在其後300年裡一再取得豐碩成果,它達到的理論高度前所未見的,其後也不多見。
  • 1687年7月5日,物理學家牛頓出版《自然哲學的數學原理》
    1665年,他發現了廣義二項式定理,並開始發展一套新的數學理論,也就是後來為世人所熟知的微積分學。在1665年,牛頓獲得了學位,而大學由於倫敦大瘟疫暫時關閉。在此後兩年裡,牛頓在家中繼續研究微積分學、光學和萬有引力定律。
  • 牛頓是如何推導出萬有引力?內容來自《自然哲學之數學原理》
    1687年,牛頓出版了讓他名垂千史的著作《自然哲學之數學原理》。正是在這部著作中,牛頓完整地推導出了萬有引力的計算方法。下圖是牛頓在《自然哲學之數學原理》中計算過程的壓縮版本。在牛頓的時代,主要的數學工具是歐幾裡得幾何學和代數學。矢量運算工具還沒有出現、現在高等數學的那些微積分符號工具是萊布尼茨開創的。
  • 《自然哲學之數學原理》精彩書摘
    《自然哲學之數學原理》是劃時代的巨著,也是人類掌握的首個完整的、科學的宇宙論和科學理論體系。牛頓在本書中構建了一個人類有史以來最為宏偉的物理理論體系。這一理論體系很好地解釋了當時已知的一切運動形式和現象。
  • 牛頓的《自然哲學的數學原理》
    只是慢慢到了後來,人們才發現知識原來很豐富很龐雜,並不是簡單地由什麼水啊、氣啊、火啊、土啊、還有以太啊,就能包羅得了的,並逐漸有了各種知識的分類:數學、醫學、文學、物理、化學……等等,還一個個地從哲學中分離獨立出來。大家都知道,《自然哲學的數學原理》是牛頓的一本劃時代名著。這是一本什麼書呢?
  • 牛頓簡介及其科學成就
    在克卜勒行星運動定律以及其他人的研究成果上,他用數學方法導出了萬有引力定律。  牛頓把地球上物體的力學和天體力學統一到一個基本的力學體系中,創立了經典力學理論體系。正確地反映了宏觀物體低速運動的宏觀運動規律,實現了自然科學的第一次大統一。這是人類對自然界認識的一次飛躍。  牛頓指出流體粘性阻力與剪切率成正比。
  • 數學原理之牛頓萊布尼茨公式
    英國科學家牛頓,一生集,物理,天文,數學大成,跟德國科學家萊布尼茨幾乎同時發現了微積分,因此,微積分的基本公式又叫牛頓萊布尼茨公式。當然了,牛頓晚期,其公司,坑過諸多絕世天才,如,特斯拉,一生諸多發明,是在其財力下,其它科學家的功勞,當最後都歸集於其下,所以後期的牛頓就是個生意人,本小神懷疑就是微積分都是其花錢掛名,而另有其人發明的,因為它的一句經典名言:如果說我比別人看的遠些,那是因為我站在巨人的肩膀上。這個巨人指的是誰?牛頓沒說,也不願意說,總之,有盜名嫌疑。
  • 【每周科普】【13】牛頓與《自然哲學的數學原理》
    1687年,牛頓發表了《自然哲學的數學原理》,這是他科學創造的頂峰。在這本巨著中,牛頓概括了他的前輩伽利略、笛卡兒、克卜勒、惠更斯和胡克等人的研究成果,以及他自己的創造,首次創立了一個地面力學和天體力學統一的嚴密體系。所以,《自然哲學的數學原理》的出版,標誌著經典力學體系的建立。
  • 牛頓巨著《自然哲學的數學原理》原稿在俄被盜
    牛頓巨著《自然哲學的數學原理》原稿在俄被盜 2002年11月14日01:56  北京娛樂信報   信報綜合消息 據美國媒體昨日報導,一夥竊賊11月6日從俄羅斯國家圖書館盜走了17世紀英國著名的物理學家艾薩克·牛頓的