非线性方程的数值解法:二分法的MATLAB实现

非线性方程的数值解法之二分法:
  • 摘要: 求解非线性方程 f ( x ) = 0 f(x)=0 的数值解主要有二分法、简单迭代法以及 N e w t o n Newton 类迭代法等,本文主要介绍二分法及其MATLAB程序实现。

  • [ 1 ] 二分法介绍^{[1]}
    假设已找到有根区间[ a a , b b ],满足 f ( a ) f ( b ) < 0 f(a)f(b)<0 ,并且上述非线性方程在所给区间[ a a , b b ]上只有一个根。下面用简单的方法形成有根区间的序列。先设 a 1 = a a_1= a b 1 = b b_1 = b ,即[ a 1 a_1 , b 1 b_1 ] = = [ a a , b b ],对于一般的区间[ a n a_n , b n b_n ],设其中点为 x n x_n = = a n + b n 2 \dfrac{a_n+b_n}{2} ,若 f ( x n ) = 0 f(x_n)=0 或者 b n a n 2 \dfrac{b_n-a_n}{2} < ε <\varepsilon ,其中 ε \varepsilon 为根的容许误差,则 x n x_n 即为所求,否则检验 f ( x n ) f(x_n) 的符号,若它与 f ( a n ) f(a_n) 同号,就取 a n + 1 = x n a_{n+1}=x_n b n + 1 = b n b_{n+1}=b_n 。反之,取 a n + 1 = a n a_{n+1}=a_n b n + 1 = x n b_{n+1}=x_n 。这样必定有 f ( a n + 1 ) f ( b n + 1 ) < 0 f(a_{n+1})f(b_{n+1})<0 ,所以[ a n + 1 , b n + 1 a_{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:求非线性方程 s i n ( x ) = 0 sin(x)=0 在区间[-0.7, 0.1]上的数值解。
>> dichotomy(@(x)sin(x), -0.7, 0.1, 0.0001)

该方程的近似根为-0.000098.
  • 示例2:求非线性方程 9 x 3 13 x + 97 = 0 9x^3-13x+97=0 在区间[-11, 29]上的数值解。
>> dichotomy(@(x)(9*x^3 - 13*x + 97), -11, 29, 0.0001)

该方程的近似根为-2.426163.
  • 结束语:上述代码根据本人理解进行整理编写,如有错误或不妥之处,请指正!

  • 参考文献
    [ 1 ] . [ M ] . . . 2018 11 [1] 黄云清.数值计算方法[M].北京.科学出版社.2018年11月

发布了7 篇原创文章 · 获赞 5 · 访问量 1098

猜你喜欢

转载自blog.csdn.net/qq_42916979/article/details/101788123