1. 程式人生 > >基於MATLAB用二分法求非線性方程的零點

基於MATLAB用二分法求非線性方程的零點

概念不多說,很好理解,直接放程式碼:

程式碼說明:針對每一個問題,我分別建立了三個檔案,解法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