牛頓迭代法(Newton's method)又稱為牛頓-拉夫遜方法(Newton-Raphson method),它是牛頓在17世紀(jì)提出的一種在實(shí)數(shù)域和復(fù)數(shù)域上近似求解方程的方法。多數(shù)方程不存在求根公式,因此求精確根非常困難,甚至不可能,從而尋找方程的近似根就顯得特別重要。方法使用函數(shù)f(x)的泰勒級數(shù)的前面幾項(xiàng)來尋找方程f(x) = 0的根。牛頓迭代法是求方程根的重要方法之一,其最大優(yōu)點(diǎn)是在方程f(x) = 0的單根附近具有平方收斂,而且該法還可以用來求方程的重根、復(fù)根。另外該方法廣泛用于計算機(jī)編程中。

創(chuàng)新互聯(lián)公司主營呂梁網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,呂梁h5成都微信小程序搭建,呂梁網(wǎng)站營銷推廣歡迎呂梁等地區(qū)企業(yè)咨詢
設(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)附近展開成泰勒級數(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)=f(x)=0 設(shè)f'(x0)≠0則其解為x1=x0-f(x0)/f'(x0) 這樣,得到牛頓法的一個迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。
給你一點(diǎn)提示。
牛頓迭代法要計算
(1) y1=f(x) 在 x 的函數(shù)值
(2) d1=f(x) 的一階導(dǎo)數(shù) 在 x 的值
你可以寫兩個函數(shù),分別計算y1,d1
如果一階導(dǎo)數(shù)有解析解,則可用賦值語句,否則要寫數(shù)值解子程序。
步驟:
設(shè)解的精度,例 float eps=0.000001;
設(shè)x初值,x1;
算y1=f(x1);
迭代循環(huán)開始
算一階導(dǎo)數(shù) 在 x1 的值 d1
用牛頓公式 算出 x2; [x2 = x1 - y1 / d1]
如果 fabs(x2-x1) eps 則從新迭代 -- 用新的函數(shù)值和一階導(dǎo)數(shù)值推下一個 新x.
牛頓迭代法:
#includestdio.h
#includeconio.h
#includemath.h
#define MAXREPT 1000
float f(float x)
{return(x-exp(-x));
}
float df(float x)
{return(1+exp(-x));
}
float iterate(float x)
{float x1;
x1=x-f(x)/df(x);
return(x1);
}
void main()
{float x0,x1,eps,d;int k=0;
printf("\n please input x0,eps:");
scanf("%f,%f",x0,eps);
printf("\n k xk\n");
printf(" %d %f\n",k,x0);
do
{k++;
x1=iterate(x0);
printf(" %d %f\n",k,x1);
d=fabs(x1-x0);
x0=x1;
}
while((d=eps)(kMAXREPT));
if(kMAXREPT)
printf("the root is x=%f, k=%d\n",x1,k);
else
printf("\n The iteration is failed!\n");
getch();
}
//c語言牛頓法求cosx-x=0
//牛頓法的迭代序列:x(n+1)=x(n)-f(x(n))/f(x(n))。
//f(x)=cosx-x;
//f'(x)=-sinx-1;
#includestdio.h
#include math.h
void main()
{
float x,x0,f,f1;
x0=0.5;
while(1)
{
f=cos(x0)-x0;
f1=-sin(x0)-1;
x=x0-f/f1;
if(fabs(x-x0)1e-5) break;
x0=x;
}
printf("x=%f\n",x); //x=0.7390851
}
給你一點(diǎn)提示。
牛頓迭代法要計算
(1)
y1=f(x)
在
x
的函數(shù)值
(2)
d1=f(x)
的一階導(dǎo)數(shù)
在
x
的值
你可以寫兩個函數(shù),分別計算y1,d1
如果一階導(dǎo)數(shù)有解析解,則可用賦值語句,否則要寫數(shù)值解子程序。
步驟:
設(shè)解的精度,例
float
eps=0.000001;
設(shè)x初值,x1;
算y1=f(x1);
迭代循環(huán)開始
算一階導(dǎo)數(shù)
在
x1
的值
d1
用牛頓公式
算出
x2;
[x2
=
x1
-
y1
/
d1]
如果
fabs(x2-x1)
eps
則從新迭代
--
用新的函數(shù)值和一階導(dǎo)數(shù)值推下一個
新x.
#includestdio.h
#include?math.h?//包含這個頭文件,后面使用fabs
void?main()
{
double?x=1.5,y,y1;
do
{
y=2*x*x*x-4*x*x+3*x-6;
y1=6*x*x-8*x+3;
x=x-y/y1;
}
while(fabs(y/y1)1e-6);//?是y/y1,不是y
printf("%f",x);
}
給你個條理更加?清楚點(diǎn)的程序,你對比看看
#include?stdio.h
#include?math.h
int?main()
{
double?x1?=?1.5,?x2;
do?{
x2?=?x1;
x1?=?x2?-?(2*x1*x1*x1-4*x1*x1+3*x1-6)?/?(6*x1*x1-8*x1+3);
}?while(fabs(x1-x2)??1e-6);
printf("%f",?x1);
}
文章題目:c語言函數(shù)牛頓迭代法,C++牛頓迭代法
網(wǎng)頁鏈接:http://chinadenli.net/article29/dseccch.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計、做網(wǎng)站、軟件開發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)