什么是牛頓-拉夫遜方法?
牛頓其人:Isaac Newton(1642年12月25日– 1727年3月20日)是一位英國數(shù)學(xué)家,物理學(xué)家,天文學(xué)家,神學(xué)家和作家,被公認(rèn)為有史以來最有影響力的科學(xué)家之一,并且是科學(xué)革命的關(guān)鍵人物。他的書《自然哲學(xué)的數(shù)學(xué)原理》于1687年首次出版,奠定了古典力學(xué)的基礎(chǔ)。牛頓還為光學(xué)做出了開創(chuàng)性的貢獻,并與戈特弗里德·威廉·萊布尼茲(Gottfried Wilhelm Leibniz)發(fā)展了無窮微積分的學(xué)科。
拉弗森Joseph Raphson 生卒不詳,其最著名的著作是1690年出版的《通用分析方程》。它包含一種方法,現(xiàn)在稱其為牛頓-拉夫森方法,用于近似方程式的求根。艾薩克·牛頓(Isaac Newton)在1671年寫的《通量法》中開發(fā)了一個非常相似的公式,但是這項工作要到1736年才出版,這是拉夫森分析之后近50年。但是,該方法的Raphson版本比Newton方法更簡單,因此通常被認(rèn)為是更好的方法。
所以,牛頓迭代法(簡寫)就是一種近似求解實數(shù)域與復(fù)數(shù)域求解方程的數(shù)學(xué)方法。那么這個方法是具體是什么原理呢?
牛頓迭代如何迭代?
直接看數(shù)學(xué)公式描述如何迭代不直觀,先來看動圖就很容易理解牛頓迭代法為什么叫迭代法以及怎樣迭代的:
牛頓迭代法是原理是根據(jù)一個初始點在該點做切線,切線與X軸相交得出下一個迭代點的坐標(biāo),再在處做切線,依次類推,直到求得滿足精度的近似解為止。
由前面描述知道,牛頓迭代法是用來近似求解方程的,這里有兩個點需要說明:
為啥要近似求解?很多方程可能無法直接求取其解
迭代法非常適合計算機編程實現(xiàn),實際上計算機編程對于牛頓迭代法廣為應(yīng)用
啥時候停止迭代呢?
如何編碼呢?
由于牛頓迭代法主要目的是解方程,當(dāng)然也有可能用于某一個數(shù)學(xué)函數(shù)求極值,所以無法寫出通用的代碼,這里僅僅給出一個編代碼的思路。相信掌握了思路,對于各種實際應(yīng)用應(yīng)該能很快的寫出符合實際應(yīng)用的代碼。
假定一函數(shù)為
其波形圖如下:
從圖上大致可以知道有兩個根,如果直接解方程,則很難求出其根,可以編個代碼試試:
#include#include #include /*假定待求根函數(shù)如下*/ #defineF(x)(2*(x)*(x)-10*cos(x)+(x)-80) /*其一階導(dǎo)數(shù)為*/ #defineDF(x)(4*(x)+10*sin(x)+1) floatnewton_rooting(floatx0,floatprecision,floatmin_deltax,intmax_iterations) { floatxn,xn1,fn,fn1,dfn; floatdeltax; intstep=0; xn=x0; xn1=x0; do{ xn=xn1; fn=F(xn); dfn=DF(xn); /*判0*/ if(fabs(dfn)<1e-6?) ???????{ ????????????if(?fabs(fn)>precision) returnNAN; else returnfn; } xn1=xn-fn/dfn; fn1=F(xn1); deltax=fabs(xn1-xn); step++; if(step>max_iterations) { if(fabs(fn1) precision||deltax>min_deltax); returnxn1; } voidmain() { floatroot_guess=23.0f; floatprecision=0.00001f; floatmin_deltax=0.001f; floatroot; intstep=7; root=newton_rooting(root_guess,precision,min_deltax,step); printf("根為:%f,函數(shù)值為:%f ",root,F(root)); root_guess=-23; root=newton_rooting(root_guess,precision,min_deltax,step); printf("根為:%f,函數(shù)值為:%f ",root,F(root)); }
結(jié)果:
根為:6.457232, 函數(shù)值為:0.000004 根為:-6.894969,函數(shù)值為:-0.000008
函數(shù)值已經(jīng)很接近于0了,如果還需要更為精確的值,則可以選擇在此基礎(chǔ)上進一步求解,比如利用二分法逼近。
需要注意些啥?
求斜率可能為0,如為0時,則可能找到了函數(shù)的極值,比如:
如果選擇的初值不合適,可能會跳掉一些根,比如:
所以實際應(yīng)用時,需要知道自己待求解模型的大致情況,在合理的加以調(diào)整。
有哪些應(yīng)用?
比如知道某系統(tǒng)的傳遞函數(shù),求解傳函的參數(shù),可以將上述方法推而廣之,求解多維變量方程組,求導(dǎo)就變成求偏導(dǎo)了
又比如設(shè)計一電路測量某物質(zhì)的阻抗
....
總結(jié)一下
牛頓迭代法在解決實際問題時,利用迭代求方程近似根的數(shù)學(xué)原理,在工程中有著很好的實用價值。比如求一個趨勢的極值,傳遞函數(shù)參數(shù)辨識等都有廣泛的實際應(yīng)用。
審核編輯:劉清
-
計算機
+關(guān)注
關(guān)注
19文章
7525瀏覽量
88331
原文標(biāo)題:數(shù)學(xué)之美:牛頓-拉夫遜迭代法原理及其實現(xiàn)
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論