二分法在MATLAB中的應用,二元牛頓迭代法matlab,Matlab編寫二分法及牛頓迭代法

 2023-12-06 阅读 30 评论 0

摘要:談到單根區間上方程求根的近似算法,我們第一印象就是高中的時候接觸的二分法,正如其名稱,二分法就是通過每次把f(x)的零點所在小區間收縮一半的方法,使區間的兩個端點逐步迫近函數的零點,以求得零點的近似值。大概步驟如下:假定f(x

談到單根區間上方程求根的近似算法,我們第一印象就是高中的時候接觸的二分法,正如其名稱,二分法就是通過每次把f(x)的零點所在小區間收縮一半的方法,使區間的兩個端點逐步迫近函數的零點,以求得零點的近似值。

大概步驟如下:

假定f(x)在區間(x,y)上連續

二分法在MATLAB中的應用?先找到a、b屬于區間(x,y),使f(a),f(b)異號,說明在區間(a,b)內一定有零點,然后求f[(a+b)/2],

現在假設f(a)<0,f(b)>0,a

①如果f[(a+b)/2]=0,該點就是零點,

②如果f[(a+b)/2]<0,則在區間((a+b)/2,b)內有零點,(a+b)/2>a,從①開始繼續使用中點函數值判斷。

matlab最小二乘法擬合?③如果f[(a+b)/2]>0,則在區間(a,(a+b)/2)內有零點,(a+b)/2

此外還有另外一種方法,叫牛頓迭代法,也稱牛頓切線法,它也是一種近似算法,內容如下:

設r是f(x)=0的根,選取x0作為r初始近似值,過點(x0,f(x0))做曲線y=f(x)的切線L,L的方程為y=f(x0) f'(x0)(x-x0),求出L與x軸交點的橫坐標 x1=x0-f(x0)/f'(x0),稱x1為r的一次近似值,如果|f(x1)-0|小于指定的精度,那么繼續過點(x1,f(x1))做曲線y=f(x)的切線,并求該切線與x軸的橫坐標 x2=x1-f(x1)/f'(x1)稱x2為r的二次近似值,重復以上過程。得r的近似值序列{Xn},其中Xn 1=Xn-f(Xn)/f'(Xn),稱為r的n 1次近似值。上式稱為牛頓迭代公式。

如圖:

A210135984-99381.jpg

matlab牛頓迭代法求根,現用matlab編寫兩種方法,比較它們的收斂速度。

1.先給出需要求根函數:

function f=cal(x)

f=exp(-0.005*x)*cos(sqrt(2000-0.01*x*x)*0.05)-0.01;

matlab中牛頓迭代程序。end

2.二分法函數:

function [xvalue,gap,fx,count]=bisect(a,b,nmax,eps,fun)

% xvalue--自變量迭代值 gap--區間長度 fx--函數值 count--計數

polyval函數matlab,% nma--所允許執行的最大次數,防止死循環 eps--允許的誤差 fun--調用的函數名

err=eps+1;

count=0;%初始化計數值為0

xvalue=[];%xvalue向量存儲變量x的值

牛頓迭代法求根例題matlab,gap=[];%gap向量存儲誤差值

fx=[];%fx向量存儲函數值

while(err>eps&&count

%當誤差err大于所給的誤差長度或者計數小于允許運行次數時,執行算法

matlab二分法求零點。count=count+1;%計數加1

c=(a+b)/2;%計算中間值

x=c;

xvalue=[xvalue;x];%將自變量迭代值存入xvalue矩陣

fc=feval(fun,x);%將自變量代入cal函數得到的函數值賦給fc

fx=[fx;fc];%將fc函數值存入fx矩陣

x=a;

%判斷根在哪個區域

if(fc*feval(fun,x)<0)

b=c;

else

a=c;

end

err=abs(b-a);%誤差長度

gap=[gap;err];

end

disp(' 次數 自變量 區間長 函數值 ')

%輸出相應數據

for i=1:count

fprintf('%2d %10.6f %10.6f %10.6f \n ',i,xvalue(i),gap(i),fx(i))

end

3.牛頓迭代法函數:

function [xvalue gap fx,count]=Newton(x0,nmax,eps,fname)

%初始化xvalue,gap,fx向量

xvalue=[];

gap=[];

fx=[];

count=0;%初始化計數為0

x1=x0+1;

m=eps+1;

while(m>eps&&count

count=count+1;%計數

f=feval(fname,x0);%得到f(x0)函數值

xvalue=[xvalue;x0];

fx=[fx;f];

x1=x0-f/df(x0);

gap=[gap;x1-x0];

m=abs(x1-x0);

x0=x1;%x1傳值給x0,準備進行下一次迭代

end

disp('次數 自變量 區間長 函數值 ')

%輸出數據

for i=1:count

fprintf('%2d %10.6f %10.6f %10.6f \n',i,xvalue(i),gap(i),fx(i))

end

4.牛頓迭代法中需要用的求導函數:

function h=df(x)

%求函數的導函數

syms R %符號化R

y=cal(R);%調用cal函數

dy=diff(y);%求cal函數的導函數

h=subs(dy,R,x);%獲得cal函數的導函數取x的值

end

5.腳本:

%分別調用二分法和牛頓迭代法

disp('二分法運行如下:')

bisect(0,400,50,0.000001,@cal);

disp(' ')

disp('牛頓迭代法運行如下:')

Newton(200,50,0.000001,@cal);

運行結果如圖:

A210138109-99382.png_small.png

A210140234-99383.png

這樣我們就大概完成了,可以發現:牛頓迭代法的收斂速度明顯比二分法要快得多,以后遇到求根時可以選擇用牛頓迭代法,提高效率!!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/192507.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息