1. 程式人生 > >牛頓迭代法解非線性方程matlab實現

牛頓迭代法解非線性方程matlab實現

1.功能
本程式採用牛頓法,求實係數高次代數方程
f(x)=a0xn+a1xn-1++an-1x+an=0 (an≠01
的在初始值x0附近的一個根。
2.使用說明
(1)函式語句
Y=NEWTON_1(A,N,X0,NN,EPS1) 呼叫M檔案newton_1.m
2)引數說明
A    n+1元素的一維實陣列,輸入引數,按升冪存放方程係數。
N  整變數,輸入引數,方程階數。
X0    實變數,輸入引數,初始迭代值。
NN 整變數,輸入引數,允許的最大迭代次數。
EPS1 實變數,輸入引數,控制根的精度。
3.方法簡介
解非線性議程f(x)=0的牛頓法是把非線性方程線性化的一種近似方法。把f(x)x0附近展開成泰勒級數

f(x)=f(x0)+(x-x0)fˊ(x0)+(x-x0)2 +… 取其線性部分,作為非線性方程f(x)=0的近似方程,則有
f(x0)+fˊ(x0)(x-x0)=0 fˊ(x0)≠0則其解為
x1=x0-f(x0)/fˊ(x0) 再把f(x)在x1附近展開成泰勒級數,也取其線性部分作f(x)=0的近似方程。若f(x1)≠0,則得
x2=x1-f(x1)/fˊ(x1) 這樣,得到牛頓法的一個迭代序列
xn+1=xn-f(xn)/fˊ(xn) 4.newton_1.m程式
function y=newton_1(a,n,x0,nn,eps1)
x(1)=x0;
b=1;
i=1;
while(abs(b)>eps1*x(i))
i=i+1;
x(i)=x(i-1)-n_f(a,n,x(i-1))/n_df(a,n,x(i-1));

b=x(i)-x(i-1);
if(i>nn)error(ˊnn is fullˊ);
return;
end
end
y=x(i);
i
程式中呼叫的n_f.m和n_df.m檔案如下:
function y=n_df(a,n,x)%方程一階導數的函式
y=0.0;
for i=1:n
y=y+a(i)*(n+1-i)*x^(n-i);
end
function y=n_df(a,n,x)
y=0.0;
for i=1:n
y=y+a(i)*(n+1-i)*x?(n-i);
end
5.程式附註
(1)程式中呼叫n_f.m和n_df.m檔案。n_f.m是待求根的實數代數方程的函式,n_df.m是方程一階導數的函式。由使用者自己編寫。

(2)牛頓迭代法的收斂速度:如果f(x)在零點附近存在連續的二階微商,ξ是f(x)的一個重零點,且初始值x0充分接近於ξ,那麼牛頓迭代是收斂的,其收斂速度是二階的,即平方收斂速度。
6.例題
用牛頓法求下面方程的根
f(x)=x3+2x2+10x-20 7.執行結果
>>a=[1,2,10,-20] ;
>>n=3;
>>x0=1;
>>nn=1000;
>>eps1=1e-8;
>>y=newton_1(a,n,x0,nn,eps1)
y=
1.368808107821373e+000
i=
6