⑴ 用牛頓迭代法求方程在0.9附近的實根,要求迭代精度為0.00001
以f(x)=3x^2-e^x為例,以下為C++代碼:
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
double f(double x){ return 3*x*x-exp(x);}
double fd(double x){ return 6*x-exp(x);}
int _tmain(int argc, _TCHAR* argv[])
{
double x;
cout<<"輸入初始迭代值:"<<endl;
cin>>x;
while(abs(f(x))>0.00001)
{
x=x-f(x)/fd(x);
}
cout<<"計算結果: x="<<x<<", f(x)="<<f(x)<<endl;
system("pause");
return 0;
}
運行結果:
輸入0.9,輸出x=0.910008, f(x)=6.36005e-009
⑵ 為什麼我用牛頓法求根特別慢
建議:
牛頓法就是切線法。當初值選取距離根很遠的時候,這個曲線和這點的切線不夠「貼合」,因此這時候迭代點靠近根也比較慢。
開始的時候用二分法,大致確定根的范圍,此法初期很有效,當區間收縮的比較小的時候,曲線變化不大,切線法就收斂的比較快了。
一般的都是兩種方法結合使用。這只是建議。不知是否對你有幫助。
⑶ 牛頓迭代法停止迭代的條件
# include <stdio.h>
# include <math.h>
int main ()
{
double x1,x0,f,f1;
x1 = 1.5;
do
{
x0 = x1;
f = ((2 * 0 - 4) * x0 + 3)* x0 - 6;
f1 = (6 * x0 - 8) * x0 + 3;
x1 = x0 - f / f1;
}while (fabs(x1 - x0) >= 1e-5);
printf ("%5.2f\n",x1);
return 0;
}
⑷ 牛頓法的原理
把非線性函數在處展開成泰勒級數
取其線性部分,作為非線性方程的近似方程,則有
設 ,則其解為
因為這是利用泰勒公式的一階展開, 處並不是完全相等,而是近似相等,這里求得的 並不能讓 ,只能說 的值比 更接近 ,於是乎,迭代求解的想法就很自然了,
再把f(x)在x1 處展開為泰勒級數,取其線性部分為 的近似方程,若 ,則得 如此繼續下去,得到牛頓法的迭代公式: ,通過迭代,這個式子必然在 的時候收斂。整個過程如右圖:
例1 用牛頓法求方程 在 內一個實根,取初始近似值=1.5。 解 所以迭代公式為:
列表計算如下: 01.511.737121.698731.6975......
⑸ 牛頓迭代方法
牛頓迭代法(Newton's method)又稱為牛頓-拉夫遜(拉弗森)方法(Newton-Raphson method),它是牛頓在17世紀提出的一種在實數域和復數域上近似求解方程的方法。
中文名
牛頓迭代法
外文名
Newton's method
別名
牛頓-拉夫遜(拉弗森)方法
提出時間
17世紀
快速
導航
牛頓迭代公式
其他迭代演算法
C語言代碼
C++代碼
matlab代碼
Python代碼
Java代碼
JavaScript代碼
Fortran代碼
產生背景
多數方程不存在求根公式,因此求精確根非常困難,甚至不可解,從而尋找方程的近似根就顯得特別重要。方法使用函數 的泰勒級數的前面幾項來尋找方程 的根。牛頓迭代法是求方程根的重要方法之一,其最大優點是在方程 的單根附近具有平方收斂,而且該法還可以用來求方程的重根、復根,此時線性收斂,但是可通過一些方法變成超線性收斂。另外該方法廣泛用於計算機編程中。
牛頓迭代公式
設 是 的根,選取 作為 的初始近似值,過點 做曲線 的切線 , ,則 與 軸交點的橫坐標 ,稱 為 的一次近似值。過點 做曲線 的切線,並求該切線與x軸交點的橫坐標 ,稱 為r的二次近似值。重復以上過程,得 的近似值序列,其中, 稱為 的 次近似值,上式稱為牛頓迭代公式。
用牛頓迭代法解非線性方程,是把非線性方程 線性化的一種近似方法。把 在點 的某鄰域內展開成泰勒級數 ,取其線性部分(即泰勒展開的前兩項),並令其等於0,即 ,以此作為非線性方程 的近似方程,若 ,則其解為 , 這樣,得到牛頓迭代法的一個迭代關系式: 。
已經證明,如果是連續的,並且待求的零點是孤立的,那麼在零點周圍存在一個區域,只要初始值位於這個鄰近區域內,那麼牛頓法必定收斂。 並且,如果不為0, 那麼牛頓法將具有平方收斂的性能. 粗略的說,這意味著每迭代一次,牛頓法結果的有效數字將增加一倍。
迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程,跟迭代法相對應的是直接法(或者稱為一次解法),即一次性解決問題。迭代演算法是用計算機解決問題的一種基本方法。它利用計算機運算速度快、適合做重復性操作的特點,讓計算機對一組指令(或一定步驟)重復執行,在每次執行這組指令(或這些步驟)時,都從變數的原值推出它的一個新值。
利用迭代演算法解決問題,需要做好以下三個方面的工作:
一、確定迭代變數
在可以用迭代演算法解決的問題中,至少存在一個可直接或間接地不斷由舊值遞推出新值的變數,這個變數就是迭代變數。
二、建立迭代關系式
所謂迭代關系式,指如何從變數的前一個值推出其下一個值的公式(或關系)。迭代關系式的建立是解決迭代問題的關鍵,通常可以使用遞推或倒推的方法來完成。
三、對迭代過程進行控制
在什麼時候結束迭代過程?這是編寫迭代程序必須考慮的問題。不能讓迭代過程無休止地執行下去。迭代過程的控制通常可分為兩種情況:一種是所需的迭代次數是個確定的值,可以計算出來;另一種是所需的迭代次數無法確定。對於前一種情況,可以構建一個固定次數的循環來實現對迭代過程的控制;對於後一種情況,需要進一步分析得出可用來結束迭代過程的條件。
其他迭代演算法
歐幾里德演算法
最經典的迭代演算法是歐幾里德演算法,用於計算兩個整數a,b的最大公約數。其計算原理依賴於下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
證明:a可以表示成a = kb + r,則r = a mod b。假設d是a,b的一個公約數,則有 a%d==0,b%d==0,而r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公約數
查看更多
⑹ 用牛頓法求根收斂速度慢為啥
可能問題:1、使用牛頓法的過程出現較大錯誤;2、設定的常數太小,求根的精度(有效數字位數)達不到要求。
⑺ 牛頓迭代法
這個你要明白這是方程根的數值解法,解的過程是一個逐漸逼近的過程,而不是可以立馬得到結果,要是的話那是解析解。所以每次算出的x都是方程的根,但一般迭代次數越多則算出的根越接近真實的根。表示第n次的迭代結果,故Xn+1表示第n+1次的迭代結果,這個是對計算誤差的控制,即第n+1次的迭代結果與第n次的迭代結果之間相差不超過1e-5,即:|(Xn+1)-(Xn)|<=1e-5
以上回答你滿意么?
⑻ 牛頓法的運算方法
這里將簡單介紹一下牛頓二階導數法。對其幾何意義及收斂性不作詳細的敘述,讀者可仿照牛頓法進行討論。
將f(x)在 處展開泰勒級數f(x)=f( )+f′( )(x- )+ f″( )(x- ) +…
取右端前三項近似代替f(x),於是得f(x)=0的近似方程為
f( )+f′( )(x- )+ f″( )(x- ) =0
也即f( )+(x- )[f′( )+ f″( )(x- )] =0 (3)
設其解為 .利用(1), - =- ,代入(3)中括弧內 - ,則得f( )+( - ) [f′( )+ f″( ) ] =0
於是解出 ,得 = -
重復以上過程得: = -
於是得牛頓二階導數法的迭代公式為:
= - n=0,1,2,… (4)
上式與牛頓法迭代公式(2)相比,利用此公式求根收斂更快,迭代次數更少。其缺點是要求f(x)的二階導數存在。 這是一個由開方公式引出的:
X(n+1)=Xn+(A/X^(k-1)-Xn)1/k (5)(n,n+1表示下角標)
開立方公式:
當(5)式中的K=3時就是開立方公式。
設A = X^3,求X.稱為開立方。 開立方有一個標準的公式:
X(n+1)=Xn+(A/X^2-Xn)1/3(n,n+1是下角標)
例如,A=5,,即求
5介於1的3次方;至2的3次方;之間(1的3次方=1,2的3次方=8)
初始值X0可以取1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,都可以。例如我們取X0 = 1.9按照公式:
第一步:X1=1.9+(5/1.9^2;-1.9)1/3=1.7。
即5/1.9×1.9=1.3850416,1.3850416-1.9=-0.5149584,-0.5149584×1/3=-0.1716528,1.9+(-0.1716528)=1.7。即取2位數值,,即1.7。
第二步:X2=1.7+(5/1.7^2;-1.7)1/3=1.71。
即5/1.7×1.7=1.73010,1.73-1.7=0.03,0.03×1/3=0.01,1.7+0.01=1.71。取3位數,比前面多取一位數。第三步:X3=1.71+(5/1.71^2;-1.71)1/3=1.709.
第四步:X4=1.709+(5/1.709^2;-1.709)1/3=1.7099
這種方法可以自動調節,第一步與第三步取值偏大,但是計算出來以後輸出值會自動轉小;第二步,第四步輸入值
偏小,輸出值自動轉大。即5=1.7099^3;
當然初始值X0也可以取1.1,1.2,1.3,。。。1.8,1.9中的任何一個,都是X1 = 1.7 > 。當然,我們在實際中初始值最好採用中間值,即1.5。 1.5+(5/1.5²-1.5)1/3=1.7。
如果用這個公式開平方,只需將3改成2,2改成1。即
X(n + 1) = Xn + (A / Xn − Xn)1 / 2 (n,n+1是下角標)
例如,A=5:
5介於2的平方至3的平方;之間。我們取初始值2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9都可以,我們最好取 中間值2.5。 第一步:2.5+(5/2.5-2.5)1/2=2.2;
即5/2.5=2,2-2.5=-0.5,-0.5×1/2=-0.25,2.5+(-0.25)=2.25,取2位數2.2。
第二步:2.2+(5/2.2-2.2)1/2=2.23;
即5/2.2=2.272,2.272-2.2=-0.072,-0.072×1/2=-0.036,2.2+0.036=2.23。取3位數。
第三步:2.23+(5/2.23-2.23)1/2=2.236。
即5/2.23=2.242,2.242-2.23=0.012,0.012×1/2=0.006,2.23+0.006=2.236.
每一步多取一位數。這個方法又叫反饋開方,即使你輸入一個錯誤的數值,也沒有關系,輸出值會自動調節,接近准確值。
詳見網路文庫《開立方公式》《從二項式定理開方到切線法》。 方程f(x)=0的根就是曲線y=f(x)與x軸交點的橫坐標x*,當初始近似值x0選取後,過( x0,f(x0))作切線,其切線方程為:y- f(x0)=f′(x0)(x-x0)
它與x軸交點的橫坐標為x
一般地,設 是x*的第n次近似值,過( x,f(x))作y=f(x)的切線,其切線與x軸交點的橫坐標為:x = - 即用切線與x軸交點的橫坐標近似代
曲線與x軸交點的橫坐標,如圖2-4。
2-4
牛頓法正因為有此明顯的幾何意義,所以也叫切線法。
⑼ 牛頓迭代法求根。
這個你要明白這是方程根的數值解法,解的過程是一個逐漸逼近的過程,而不是可以立馬得到結果,要是的話那是解析解。所以每次算出的x都是方程的根,但一般迭代次數越多則算出的根越接近真實的根。表示第n次的迭代結果,故Xn+1表示第n+1次的迭代結果,這個是對計算誤差的控制,即第n+1次的迭代結果與第n次的迭代結果之間相差不超過1e-5,即:|(Xn+1)-(Xn)|<=1e-5