牛顿迭代法求求一个数的算术平方根
method),它是牛頓在17世紀(jì)提出的一種在實(shí)數(shù)域和復(fù)數(shù)域上近似求解方程的方法。多數(shù)方程不存在求根公式,因此求精確根非常困難,甚至不可能,從而尋找方程的近似根就顯得特別重要。方法使用函數(shù)f(x)的泰勒級(jí)數(shù)的前面幾項(xiàng)來(lái)尋找方程f(x)
= 0的根。牛頓迭代法是求方程根的重要方法之一,其最大優(yōu)點(diǎn)是在方程f(x) =
0的單根附近具有平方收斂,而且該法還可以用來(lái)求方程的重根、復(fù)根,此時(shí)線性收斂,但是可通過一些方法變成超線性收斂。另外該方法廣泛用于計(jì)算機(jī)編程中。
牛頓迭代公式
設(shè)r是f(x) = 0的根,選取x0作為r初始近似值,過點(diǎn)(x0,f(x0))做曲線y = f(x)的切線L,L的方程為y = f(x0)+f'(x0)(x-x0),求出L與x軸交點(diǎn)的橫坐標(biāo) x1 = x0-f(x0)/f'(x0),稱x1為r的一次近似值。過點(diǎn)(x1,f(x1))做曲線y = f(x)的切線,并求該切線與x軸交點(diǎn)的橫坐標(biāo) x2 = x1-f(x1)/f'(x1),稱x2為r的二次近似值。重復(fù)以上過程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),稱為r的n+1次近似值,上式稱為牛頓迭代公式。
?
解非線性方程f(x)=0的牛頓法是把非線性方程線性化的一種近似方法。把f(x)在x0點(diǎn)附近展開成泰勒級(jí)數(shù) f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +…
取其線性部分,作為非線性方程f(x) = 0的近似方程,即泰勒展開的前兩項(xiàng),則有f(x0)+f'(x0)(x-x0)=0
設(shè)f'(x0)≠0則其解為x1=x0-f(x0)/f'(x0) 這樣,得到牛頓法的一個(gè)迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。
牛頓迭代法示意圖
軍人在進(jìn)攻時(shí)常采用交替掩護(hù)進(jìn)攻的方式,若在數(shù)軸上的點(diǎn)表示A,B兩人的位置,規(guī)定在前面的數(shù)大于后面的數(shù),則是A>B,B>A交替出現(xiàn)。但現(xiàn)在假設(shè)軍中有一個(gè)膽小鬼,同時(shí)大家又都很照顧他,每次沖鋒都是讓他跟在后面,每當(dāng)前面的人占據(jù)一個(gè)新的位置,就把位置交給他,然后其他人再往前占領(lǐng)新的位置。也就是A始終在B的前面,A向前邁進(jìn),B跟上,A把自己的位置交給B(即執(zhí)行B= A操作),然后A 再前進(jìn)占領(lǐng)新的位置,B再跟上……直到占領(lǐng)所有的陣地,前進(jìn)結(jié)束。像這種兩個(gè)數(shù)一前一后逐步向某個(gè)位置逼近的方法稱之為迭代法。
迭代法也稱輾轉(zhuǎn)法,是一種不斷用變量的舊值遞推新值的過程,跟迭代法相對(duì)應(yīng)的是直接法(或者稱為一次解法),即一次性解決問題。迭代算法是用計(jì)算機(jī)解決問題的一種基該方法。它利用計(jì)算機(jī)運(yùn)算速度快、適合做重復(fù)性操作的特點(diǎn),讓計(jì)算機(jī)對(duì)一組指令(或一定步驟)進(jìn)行重復(fù)執(zhí)行,在每次執(zhí)行這組指令(或這些步驟)時(shí),都從變量的原值推出它的一個(gè)新值。
?
利用迭代算法解決問題,需要做好以下三個(gè)方面的工作:
一、確定迭代變量。在可以用迭代算法解決的問題中,至少存在一個(gè)直接或間接地不斷由舊值遞推出新值的變量,這個(gè)變量就是迭代變量。
????? 二、建立迭代關(guān)系式。所謂迭代關(guān)系式,指如何從變量的前一個(gè)值推出其下一個(gè)值的公式(或關(guān)系)。迭代關(guān)系式的建立是解決迭代問題的關(guān)鍵,通??梢允褂眠f推或倒推的方法來(lái)完成。
三、對(duì)迭代過程進(jìn)行控制。在什么時(shí)候結(jié)束迭代過程?這是編寫迭代程序必須考慮的問題。不能讓迭代過程無(wú)休止地重復(fù)執(zhí)行下去。迭代過程的控制通常可分為兩種情況:一種是所需的迭代次數(shù)是個(gè)確定的值,可以計(jì)算出來(lái);另一種是所需的迭代次數(shù)無(wú)法確定。對(duì)于前一種情況,可以構(gòu)建一個(gè)固定次數(shù)的循環(huán)來(lái)實(shí)現(xiàn)對(duì)迭代過程的控制;對(duì)于后一種情況,需要進(jìn)一步分析出用來(lái)結(jié)束迭代過程的條件。 (摘自百度百科:http://baike.baidu.com/view/643093.htm)
?
參考代碼如下:
/**
只考慮非負(fù)實(shí)數(shù)的算術(shù)平方根,
如果要考慮完全,則自己再修改
*/
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
??? double a ;
??? cin>>a ;
??? double x = 1 ;
??? while(x*x - a > 0.0000001 || x*x - a < -0.0000001)
??? {
?????? x = (x + a/x)/2 ;
??? }
??? cout<< fabs(x) ;
??? return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/ronaldHU/archive/2012/10/07/2714344.html
總結(jié)
以上是生活随笔為你收集整理的牛顿迭代法求求一个数的算术平方根的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公告栏模板php代码,[免插件]为wor
- 下一篇: 迪拜政府和当地银行合作推出基于区块链的贷