日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法

發(fā)布時間:2023/12/10 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天是周四高等數(shù)學(xué)專題的第7篇文章。

之前的文章和大家聊了許多數(shù)學(xué)上的理論,今天和大家聊點(diǎn)有用的東西。

我們都知道,工業(yè)上的很多問題經(jīng)過抽象和建模之后,本質(zhì)還是數(shù)學(xué)問題。而說到數(shù)學(xué)問題就離不開方程,在數(shù)學(xué)上我們可以用各種推算、公式,但是有沒有想過在計算機(jī)領(lǐng)域我們?nèi)绾?strong>解一個比較復(fù)雜的方程?

如果之前沒有想過,那你可能得想一想,因?yàn)橐院蠛苡锌赡軙诿嬖囶}當(dāng)中遇到。

二分法

我們要介紹的第一個方法是二分法。

說到二分法大家應(yīng)該都不陌生,老實(shí)說我第一次在高數(shù)課本上看到二分法這三個字的時候,其實(shí)是蠻震驚的。后來當(dāng)我又在統(tǒng)計等數(shù)學(xué)書上看到許多其他算法之后,才慢慢習(xí)以為常。在我轉(zhuǎn)行做算法的這幾年當(dāng)中,我越來越意識到,數(shù)學(xué)的重要性。雖然這并不意味著你一定要成為數(shù)學(xué)高手,但如果你還沒畢業(yè)的話,至少數(shù)學(xué)課好好聽講還是很有必要的。

我們說回二分法,如果學(xué)過二分法,會覺得這是一個非常簡單的算法,但如果你們做過LeetCode第四題,又會發(fā)現(xiàn)純二分法的題也可以這么難。如果只是單純地講解二分法的原理,我們是很難完完全全將這個算法吃透的。為了達(dá)到這點(diǎn),我思考了很久,最終決定仿照看山是不是山的禪宗理論,將二分法也分成三個層次。

首先是第一個層次,即我們每次將一個東西分成兩半

這個應(yīng)該是我們最初也是最直觀的觀念,比如最經(jīng)典的金幣問題。說是我們有若干個個硬幣,其中有一個是金幣,金幣的重量更重,其他的硬幣重量相等。我們只有一個天平,怎么樣用最少的次數(shù)找出金幣。

在這個問題當(dāng)中,我們需要不停地將硬幣分成兩個部分,用天平鎖定其中的一個。通過不斷重復(fù)上述操作,快速找到答案。

在第二個層次當(dāng)中,二分法不再是簡單地將物體一分為二,而是一個折半查找的函數(shù)。這也是本文重點(diǎn)要介紹的解方程的方法。

如果有函數(shù) f(x) ,它在區(qū)間[a, b]上遞增或者遞減,并且 f(a)*f(b) < 0。那么我們知道函數(shù)必然有一個等于0的解,而且這個解我們可以用二分法來求近似解。

在上圖當(dāng)中,f(x)遞增,并且f(a) < 0, f(b) > 0。我們繼續(xù)獲取了a和b的中點(diǎn) x0。根據(jù)上圖,我們又得到 f(x0) > 0,所以我們可以把 x0 看成是新的b。于是我們繼續(xù)尋找a和 x0 的中點(diǎn),重復(fù)上述過程,由于我們最大的誤差就是區(qū)間的長度,所以當(dāng)我們區(qū)間的長度縮減到足夠小,那么就說明我們已經(jīng)找到了一個足夠近似的解。

在二分法當(dāng)中,我們沒進(jìn)行一次二分迭代,區(qū)間的長度就會縮減一半,這是一個指數(shù)級的縮減。所以即使一開始的區(qū)間很大,經(jīng)過二分迭代也可以迅速縮減,得到一個非常精準(zhǔn)的結(jié)果,并且和泰勒級數(shù)一樣,除了能得到一個足夠精確的值之外,還能得到誤差的范圍。

我們再深入一些思考,會發(fā)現(xiàn)有些條件我們還可以再松動松動。比如我們真的需要函數(shù)是嚴(yán)格遞增或者遞減嗎?比如我們來看下面這張圖:

在(b2, b1)區(qū)間內(nèi),函數(shù)并不是嚴(yán)格遞減的,而是先遞減再遞增的。但是這并不會影響結(jié)果的正確性,因?yàn)樵谶@個問題當(dāng)中,二分法并不是通過判斷 f(x0) 和a處函數(shù)值的大小來縮小區(qū)間的,而是通過f(x0)的正負(fù)性。也就是說,只需要滿足 f(a)*f(b) < 0,并且函數(shù)連續(xù)且等于0的點(diǎn)只有一個,就可以使用二分來進(jìn)行查找。

深入思考,就進(jìn)入了二分法的第三個層次,即放下遞增的限制,回到折半這個原始的概念上來。

二分法的本質(zhì)就是查找空間折半,至于函數(shù)遞增或者是數(shù)組當(dāng)中元素遞增都只是表象,只是我們進(jìn)行折半的條件。換句話說如果我們能找到其他的條件來折半搜索空間,那么我們一樣可以得到二分的效果,并不用拘泥于是否有序。

也就是說我們繞了一圈,最后又回到了將“物體”一分為二這個最基本的概念上來。只是我們經(jīng)過這么一波折騰,表面上看和最初的理解一樣,但其實(shí)早已天差地別了。

沒想到算法領(lǐng)域也能玩一把禪宗,看山是山,看山不是山,最后回到看山還是山。

牛頓迭代法

看完了二分法,我們再來看另一個快速求根的方法,和二分法一樣,它也是迭代逼近的方法,但是逼近的速度更快。這個方法最早是牛頓提出的,因此也被稱為牛頓迭代法,我想牛頓這個名字寫出來,大家應(yīng)該都能get到它的分量。

牛頓迭代法的名頭看起來很唬人,但是原理真的不難,說白了只有一句話,就是通過切線去逼近,比如我們來看下圖:

在上圖當(dāng)中,我們要求 f(x)=0 的根,我們先找到了一個 xn點(diǎn),我們在 xn 處進(jìn)行求導(dǎo)取得了它的切線。顯然只要這個切線的斜率不為0,那么我們一定可以獲得它和x軸的交點(diǎn)。我們將這個交點(diǎn)作為下一個取值,也就是 xn+1的點(diǎn)。我們重復(fù)上述過程進(jìn)行迭代,很快就可以得到一個足夠接近的解。

對于點(diǎn) xn 處的切線而言,它的斜率是 f'(xn),截距b就是 f(xn)。它的切線方程很好得到,就是:

我們利用這個方程,可以求到它和x軸的交點(diǎn),也就是xn+1的值:

解下這個方程,可以得到:

上面這個式子就是牛頓迭代法的迭代公式,這是一個非常牛的方法,比二分法要厲害得多,因?yàn)樗氖諗克俣雀?#xff0c;并且計算也并不復(fù)雜。

我們來看下它的威力,我們來看知乎鍵山小鞠[1]大神回答里的一個例子:

我們利用 f(x) = sin(x) 來求 π 的值,我們都知道在 [π/2, π] 區(qū)間內(nèi), sin(π) = 0,所以我們求 f(x) = 0 的解就可以間接求出π的值。

在這個問題下,迭代公式為:

我們以 x0 = 3 為迭代起始點(diǎn),進(jìn)行迭代,得到的結(jié)果如下:

x0=3.0(1位)x1=3.1411...(4位)x2=3.14159265357...(11位)x3=3.1415926535897932384626433832795020...(34位)x4=3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706786...(102位)x5=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412734...(301位)

可以看到,短短經(jīng)過五次迭代,我們計算得到的圓周率已經(jīng)超過了300位,每次迭代我們的精度都會提升三倍以上,這是非常令人震驚的。

無法收斂的情況

但令人遺憾的是并不是所有方程使用牛頓迭代法都可以有這么好的效果,對于一些方程,甚至可能會出現(xiàn)越走越偏的情況。我們再舉個例子,比如方程:

如果我們畫出它的迭代過程,是這樣的:

我們觀察一下上面的迭代公式也可以看得出來,我們把 -1/f'(xn) 看成是系數(shù),我們對 f(x) 求導(dǎo)算下這個系數(shù),可以得到它的系數(shù)是3*x^{2/3},觀察一下就能發(fā)現(xiàn)隨著x的增大,這個系數(shù)也是在增大的。也就是說,隨著我們的迭代,這個值會變得越來越大,也就意味著我們的振幅越來越大,也就離收斂越來越遠(yuǎn)。

雖然少數(shù)情況下牛頓迭代法不能收斂,但是大多數(shù)情況下它效果都非常好。二分法固定每次縮短一半的區(qū)間,而牛頓迭代法的迭代效率往往更高,一般情況下使用牛頓迭代法可以獲得更快的收斂速度。和二分法相比,牛頓迭代法的公式也并不難寫,并且它在機(jī)器學(xué)習(xí)當(dāng)中也有應(yīng)用,學(xué)會它真的非常劃算!

今天關(guān)于二分和牛頓迭代法的文章就到這里,如果覺得有所收獲,請順手點(diǎn)個關(guān)注或者轉(zhuǎn)發(fā)吧,你們的舉手之勞對我來說很重要。

參考資料

[1]

知乎: "https://www.zhihu.com/question/20690553"

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。