【数值分析】二分法求方程的根(附matlab代码)

简介: 【数值分析】二分法求方程的根(附matlab代码)

二分法基本思想


利用连续函数零点定理,将含根区间逐次减半缩小的方式构造点列来逼近根。


二分法步骤


Step1: 计算 f(x) 在有根区间 [a, b] 端点处的值 f(a) 和 f(b)

如何判断有根?可以根据零点定理,若 f(x)∈C[a, b] ,且 f(a) f(b) < 0


Step2: 计算 f(x) 在区间中点 (a+b)/2 处的数值 f((a+b)/2)

开始二分


Step3: 判断 f((a+b)/2) 是否等于0,如果是,则根就是 (a+b)/2 ,计算过程结束,否则继续

提前满足条件就完事了!这一步用我们老师的话来说就是瞎猫碰着死耗子,如果 f((a+b)/2) = 0,可以就此打住,因此这一步不能省!


Step4: 判断 f((a+b)/2) f(a) 是否小于0,如果是,则用 (a+b)/2 代替 b ,否则就用 (a+b)/2 代替 a

进一步缩小区间


Step5: 判断区间[a, b]的长度是否小于允许误差,如果满足条件,则上一步得到的 (a+b)/2 即为所求的近似根,否则继续循环 Step2~Step5

由于二分法只能求解根的近似值,如果不设定循环求近似解的终止条件的话会一直求解下去


程序框图



题目要求和初步分析


题目1


用二分法求方程 x 2 − x − 1 = 0 x^2-x-1=0x

2

−x−1=0 的正根,要求误差小于0.05。


分析1


首先令 f ( x ) = x 2 − x − 1 = 0 f(x) = x^2-x-1=0f(x)=x

2

−x−1=0,将方程求根问题转为函数求零点的问题。

接着根据正根的性质,初步选定一个区间 [1, 2],然后验证是否存在零点:

f(1) = -1 < 0,f(2) = 1 > 0,f(1) f(2) < 0,则 [1, 2] 存在零点,可继续进行二分法求解。


Matlab 代码1


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 简介:用二分法求方程x^2-x-1=0的正根,要求误差小于0.05
% 作者:不雨_亦潇潇
% 文件:dichotomy.m
% 日期:20221009
% 博客:https://blog.csdn.net/weixin_43470383/article/details/127222948
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc; clear all;
syms x                       % 定义变量
f = @(x) x^2 - x -1;         % 求解方程
a = 1; b = 2;                % 初始的区间上下限
n = 0;                       % 迭代次数
w = 0.05;                    % 误差要求
while f(a) * f(b) < 0        % 存在根
    x_0 = (a+b)/2            % 计算中点,开始二分
    if f(x_0) == 0           % 零点即中点
        break;
    end
    if f(a) * f(x_0) < 0     % 零点在左边的区间
        b = x_0;
    else                     % 零点在右边的区间
        a = x_0;
    end
    n = n+1
    if abs(a - b) < w       % 判断是否满足精度条件
        x_0                 % 最终得到的近似解
        n = n+1             % 迭代总次数
        break;
    end
end


运行结果1


x_0 = 1.5000


n = 1


x_0 = 1.7500


n = 2


x_0 = 1.6250


n = 3


x_0 = 1.5625


n = 4


x_0 = 1.5938


n = 5


x_0 = 1.5938


n = 6


第6次迭代时abs(a - b)=1.625-1.5938<0.05,满足条件

最终求得的根为 1.5938


题目2


用二分法求方程 e x p ( x ) + 10 ∗ x − 2 = 0 exp(x) + 10*x -2=0exp(x)+10∗x−2=0 的根,要求根有3位小数。


Matlab代码2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 简介:用二分法求方程exp(x) + 10*x -2=0的根,要求根有3位小数
% 作者:不雨_亦潇潇
% 文件:dichotomy1.m
% 日期:20221010
% 博客:https://blog.csdn.net/weixin_43470383/article/details/127222948
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc; clear all;
syms x                      % 定义变量
f = @(x) exp(x) + 10*x -2;  % 求解方程
a = 0; b = 1;               % 初始的区间上下限
n = 0;                      % 迭代次数
w = 0.5*power(10, -3);      % 误差要求
while f(a) * f(b) < 0       % 存在根
    x_0 = (a+b)/2           % 计算中点,开始二分
    if f(x_0) == 0          % 零点即中点
        break;
    end
    if f(a) * f(x_0) < 0    % 零点在左边的区间
        b = x_0;
    else                    % 零点在右边的区间
        a = x_0;
    end
n = n+1
    if abs(a - b) < w            % 判断是否满足精度条件
        x_0                              % 最终得到的近似解
        n = n+1                     % 迭代总次数
        break;
    end
end


运行结果2


x_0 =

0.5000

n =

1

x_0 =

0.2500

n =

2

x_0 =

0.1250

n =

3

x_0 =

0.0625

n =

4

x_0 =

0.0938

n =

5

x_0 =

0.0781

n =

6

x_0 =

0.0859

n =

7

x_0 =

0.0898

n =

8

x_0 =

0.0918

n =

9

x_0 =

0.0908

n =

10

x_0 =

0.0903

n =

11

x_0 =

0.0903

n =

12


相关文章
|
3月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
191 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
3月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
122 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
3月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
88 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
6月前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
6月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
6月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
6月前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)
|
6月前
|
供应链 算法
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
|
6月前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
下一篇
无影云桌面