非线性方程的数值解法之二分法:
-
求解非线性方程 的数值解主要有二分法、简单迭代法以及 类迭代法等,本文主要介绍二分法及其MATLAB程序实现。
-
假设已找到有根区间[ , ],满足 ,并且上述非线性方程在所给区间[ , ]上只有一个根。下面用简单的方法形成有根区间的序列。先设 , ,即[ , ] [ , ],对于一般的区间[ , ],设其中点为 ,若 或者 ,其中 为根的容许误差,则 即为所求,否则检验 的符号,若它与 同号,就取 , 。反之,取 , 。这样必定有 ,所以[ ]就是新的有根区间。继续上述过程即可。 -
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:求非线性方程 在区间[-0.7, 0.1]上的数值解。
>> dichotomy(@(x)sin(x), -0.7, 0.1, 0.0001)
该方程的近似根为-0.000098.
- 示例2:求非线性方程 在区间[-11, 29]上的数值解。
>> dichotomy(@(x)(9*x^3 - 13*x + 97), -11, 29, 0.0001)
该方程的近似根为-2.426163.