基於MATLAB用二分法求非線性方程的零點
阿新 • • 發佈:2019-01-08
概念不多說,很好理解,直接放程式碼:
程式碼說明:針對每一個問題,我分別建立了三個檔案,解法1.m 解法2.m 以script為字尾名的檔案。前兩個檔案存入兩種解法的實現函式,最後一個用來存放指令碼檔案,即將測試的資料編入,呼叫時可直接在命令列視窗輸入指令碼檔名。
bisect1.m
function [x,k]=bisect1(f,a,b,eps) %此題先計算了達到精確值所要走的步數,再用for迴圈求解x %kmax=1+floor((log(b-a)-log(eps))/log(2)) Kmax為達到輸入精度要走的步數,書上公式 %f為待求函式,[a,b]為起始區間,eps為精度,有預設值 if nargin<4 eps=1e-5; %eps的預設值 end fa=feval(f,a); fb=feval(f,b); if fa*fb>0 disp('[a,b]不是有根區間!') end kmax=1+floor((log(b-a)-log(eps))/log(2)); for k=1:kmax x=(a+b)/2; fx=feval(f,x); if fx*fa<0 b=x; fb=fx; elseif fx*fa>0 a=x; fa=fx; else a=x; b=x; break; end end %若在for迴圈底部多加一步下面的判斷,情況會不一樣 %if(b-a)/2<eps % break; %end %x=(a+b)/2; %這是因為先判斷區間是否符合精度標準,再求該區間的x
bisect2.m
function [x,k]=bisect2(f,a,b,eps) %用while迴圈找出符合精度的區間 %while迴圈可用於當迴圈次數不確定時 if nargin<4 eps=1e-5; end fa=feval(f,a); fb=feval(f,b); if fa*fb>0 x=[fa,fb];k=0; return; end k=1; while abs(b-a)/2>eps x=(a+b)/2; fx=feval(f,x); if fa*fx<0 b=x; fb=fx; else a=x; fa=fx; end k=k+1; end x=(a+b)/2;
bisectscript.m
clc;
f=inline('x^3-x-1');
[x,k]=bisect2(f,1,1.5,0.005)
[x,k]=bisect1(f,1,1.5,0.005)
執行結果:
>>bisectscript
x =
1.3242
k =
7
x =
1.3242
k =
7
由於數值分析這門課所以才開始接觸MATLAB,在這給同我一樣是初學者的人提個建議,要想看懂這些程式碼,必須先掌握一些matlab的基礎流程控制與兩種m檔案的編寫,這樣以後看程式碼就容易多了。基於剛學,博文肯定有不盡完善的地方,也希望大家可以指出來,共同進步。以後會陸續將我的學習心得與程式碼分享出來,供大家參考。
以上程式碼均為原創,轉載請註明出處。 --涼柒-lq