非線性方程的數值解法:二分法的MATLAB實現

非線性方程的數值解法之二分法:
  • 摘要:求解非線性方程f(x)=0f(x)=0的數值解主要有二分法、簡單迭代法以及NewtonNewton類迭代法等,本文主要介紹二分法及其MATLAB程序實現。

  • [1]二分法介紹^{[1]}
    假設已找到有根區間[aa, bb],滿足f(a)f(b)<0f(a)f(b)<0,並且上述非線性方程在所給區間[aa, bb]上只有一個根。下面用簡單的方法形成有根區間的序列。先設a1=aa_1= ab1=bb_1 = b,即[a1a_1, b1b_1] == [aa, bb],對於一般的區間[ana_n, bnb_n],設其中點爲xnx_n == an+bn2\dfrac{a_n+b_n}{2},若f(xn)=0f(x_n)=0或者bnan2\dfrac{b_n-a_n}{2}<ε<\varepsilon,其中ε\varepsilon爲根的容許誤差,則xnx_n即爲所求,否則檢驗f(xn)f(x_n)的符號,若它與f(an)f(a_n)同號,就取an+1=xna_{n+1}=x_nbn+1=bnb_{n+1}=b_n。反之,取an+1=ana_{n+1}=a_nbn+1=xnb_{n+1}=x_n。這樣必定有f(an+1)f(bn+1)<0f(a_{n+1})f(b_{n+1})<0,所以[an+1,bn+1a_{n+1}, b_{n+1}]就是新的有根區間。繼續上述過程即可。

  • MATLAB程序實現

%Date:2019-10-28
%Writer:無名十三

%% 本程序目的是利用二分法輸出非線性方程的數值解
function result = dichotomy(fun,x1,x2,eps) %參數fun爲待輸入函數,eps爲容許誤差,示例如下文
if nargin ~= 4
    errordlg('輸入參數個數不符合要求!', 'Error!')  %參數輸入報錯
elseif fun(x1) * fun(x2) >= 0
    errordlg('二分法不能確定該區間內是否有根存在!', 'Warning!')
else
    is_eps = (x2-x1) / 2;
    x = (x2+x1) / 2;  
    while is_eps >= eps
        if fun(x) == 0
            fprintf('\n該方程的根爲%f.\n\n', x)
            break
        elseif fun(x1)*fun(x) < 0
            x2 = x;
        elseif fun(x2)*fun(x) < 0
            x1 = x;
        end
        is_eps = (x2-x1) / 2;
        x = (x2+x1) / 2;        
    end
    if is_eps < eps
        fprintf('\n該方程的近似根爲%f.\n\n', x)
    end
end
end
%%
  • 示例1:求非線性方程sin(x)=0sin(x)=0在區間[-0.7, 0.1]上的數值解。
>> dichotomy(@(x)sin(x), -0.7, 0.1, 0.0001)

該方程的近似根爲-0.000098.
  • 示例2:求非線性方程9x313x+97=09x^3-13x+97=0在區間[-11, 29]上的數值解。
>> dichotomy(@(x)(9*x^3 - 13*x + 97), -11, 29, 0.0001)

該方程的近似根爲-2.426163.
  • 結束語:上述代碼根據本人理解進行整理編寫,如有錯誤或不妥之處,請指正!

  • 參考文獻
    [1].[M]...201811[1] 黃雲清.數值計算方法[M].北京.科學出版社.2018年11月

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章