牛顿-拉夫逊法 原理讲解以及python算例实现
文章目錄
- 一、基本原理
- 二、原理深入講解
- 1 、切線是曲線的線性逼近
- 2、 牛頓-拉夫遜法
- 3 、牛頓-拉夫遜法是否總是收斂(總是可以求得足夠近似的根)?
- 三、pythons實(shí)例
- 總結(jié)
一、基本原理
????對(duì)于一個(gè)方程 f ( x ) = 0 ,我們將函數(shù) f ( x )單獨(dú)考慮。
????若函數(shù) f ( x ) (n+1)階可導(dǎo),則我們?cè)诔跏贾?x = x 0 處進(jìn)行泰勒展開,可得:
????令 x ? x 0= Δ x ,然后將上述泰勒公式一階展開,忽略余項(xiàng)可得:
???令其等于 f ( x ) = 0,可得:
???從而求出:
二、原理深入講解
1 、切線是曲線的線性逼近
???要講牛頓迭代法之前我們先說(shuō)一個(gè)關(guān)鍵問題:切線是曲線的線性逼近。
???這個(gè)是什么意思呢?我們來(lái)看一看,下面是 f(x)=x^2 的圖像:
???我們隨便選一點(diǎn)f(x) 上的一點(diǎn)(a,f(a))作它的切線:
???我們?cè)贏點(diǎn)處放大圖像:
???上圖中,紅色的線是f(x),黑色的是A點(diǎn)處的切線,可以看出放大之后切線和f(x)非常接近了。很明顯,如果我們進(jìn)一步放大圖像,A點(diǎn)切線就越接近f(x)。
???因?yàn)榍芯€是一條直線(也就是線性的),所以我們可以說(shuō),A點(diǎn)的切線是f(x)的線性逼近。離A點(diǎn)距離越近,這種逼近的效果也就越好,也就是說(shuō),切線與曲線之間的誤差越小。所以我們可以說(shuō)在A點(diǎn)附近,“切線約等于 f(x) ”。
2、 牛頓-拉夫遜法
???牛頓-拉夫遜法提出來(lái)的思路就是利用切線是曲線的線性逼近這個(gè)思想。
???牛頓、拉夫遜們想啊,切線多簡(jiǎn)單啊,研究起來(lái)多容易啊,既然切線可以近似于曲線,我直接研究切線的根不就成了。
然后他們觀察到這么一個(gè)事實(shí):
???隨便找一個(gè)曲線上的A點(diǎn)(為什么隨便找,根據(jù)切線是切點(diǎn)附近的曲線的近似,應(yīng)該在根點(diǎn)附近找,但是很顯然我們現(xiàn)在還不知道根點(diǎn)在哪里),做一個(gè)切線,切線的根(就是和x軸的交點(diǎn))與曲線的根,還有一定的距離。牛頓、-拉夫遜們想,沒關(guān)系,我們從這個(gè)切線的根出發(fā),做一根垂線,和曲線相交于B點(diǎn),繼續(xù)重復(fù)剛才的工作:
???之前說(shuō)過(guò),B點(diǎn)比之前A點(diǎn)更接近曲線的根點(diǎn),牛頓、拉弗森們很興奮,繼續(xù)重復(fù)剛才的工作:
???第四次就已經(jīng)很接近曲線的根了
???經(jīng)過(guò)多次迭代后會(huì)越來(lái)越接近曲線的根(下圖進(jìn)行了50次迭代,哪怕經(jīng)過(guò)無(wú)數(shù)次迭代也只會(huì)更接近曲線的根,用數(shù)學(xué)術(shù)語(yǔ)來(lái)說(shuō)就是,迭代收斂了):
3 、牛頓-拉夫遜法是否總是收斂(總是可以求得足夠近似的根)?
我們來(lái)看看收斂的充分條件:
若
f(x)
二階可導(dǎo),那么在待求的零點(diǎn)
x
周圍存在一個(gè)區(qū)域,只要起始點(diǎn)
x_0
位于這個(gè)鄰近區(qū)域內(nèi),那么牛頓-拉弗森方法必定收斂。
???也就是說(shuō),在這個(gè)區(qū)域內(nèi),用切線代替曲線這個(gè)直覺是合理的。但是,因?yàn)槲覀儾恢栏c(diǎn)到底在哪里,所以起始點(diǎn) x_0 選擇就不一定在這個(gè)區(qū)域內(nèi),那么這個(gè)直覺就不可靠了。
駐點(diǎn)
???起始點(diǎn)不幸選擇了駐點(diǎn),從幾何上看切線根本沒有根。
從代數(shù)上看,x{n+1}=xn-f(xn)/f’(xn)沒有意義。
越來(lái)越遠(yuǎn)離的不收斂
循環(huán)震蕩的不收斂
不能完整求出所有的根
三、pythons實(shí)例
???牛拉法主要流程
???以 x 2 ? 4 x - 4 = 0 為例,設(shè)計(jì) Python 程序:
import numpy as np import pandas as pd import matplotlib.pyplot as pltdef fun(x):y = x ** 2 - 4 * x - 1return ydef fun_diff(x):y = 2 * x - 4return ydef Netwon(x0, func, dfunc):# 迭代條件e = 1e-5x = np.zeros(2)x[0] = x0x[1] = x0 - func(x[0]) / dfunc(x[0])while abs(func(x[0])) > e:#在0附近x[0] = x[1]x[1] = x[0] - func(x[0]) / dfunc(x[0])return x[1]if __name__ == '__main__':x=np.arange(-5,5,0.1)y=fun(x)x1=Netwon(0, fun, fun_diff) #牛拉法求得的點(diǎn)plt.plot(x,y)plt.xlim(-5, 5)plt.ylim(-10, 50)plt.scatter(x1,fun(x1),color='red')plt.show()總結(jié)
應(yīng)用牛頓-拉夫遜方法,要注意以下問題:
函數(shù)在整個(gè)定義域內(nèi)最好是二階可導(dǎo)的
起始點(diǎn)對(duì)求根計(jì)算影響重大,可以增加一些別的判斷手段進(jìn)行試錯(cuò)
作者:電氣-余登武
總結(jié)
以上是生活随笔為你收集整理的牛顿-拉夫逊法 原理讲解以及python算例实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 到南通科技职业学院附近租房,嘴近的小区是
- 下一篇: 高斯赛尔德、牛顿拉尔逊matlab潮流计