談到單根區間上方程求根的近似算法,我們第一印象就是高中的時候接觸的二分法,正如其名稱,二分法就是通過每次把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次近似值。上式稱為牛頓迭代公式。
如圖:
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);
運行結果如圖:
這樣我們就大概完成了,可以發現:牛頓迭代法的收斂速度明顯比二分法要快得多,以后遇到求根時可以選擇用牛頓迭代法,提高效率!!
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态