二分法和if ... else ... end 语句

先回顾一下二分法。要求方程\(f(x)=0\)的根。假设\(c = f(a) < 0\)和\(d = f(b) > 0\),如果\(f(x)\)是连续函数,那么方程的根\(x^*\)一定位于\(a\)和\(b\)之间。然后,我们看一下\(a\)和\(b\)中点\(x=(a+b)/2\),计算函数值\(y=f(x)\),如果函数不为0,比较\(c\)、\(d\)和\(y\)的符号,确定新的二分区间。具体来说,如果\(c\)和\(y\)同号,新的二分区间就是\([x,b]\),如果\(c\)和\(y\)异号,新的二分区间就是\([a,x]\)。如图5.1所示。


图5.1 二分法

在不同的情况下做不同的事情,在程序里,这叫做流程控制。达到这个目的,最通常的方法是通过if ... else ... end语句来实现,这个语句是我们前面讲过的if ... end语句的扩展。

误差界

二分法的一个好处是,我们一直知道方程的真实的根\(x^*\)一定位于二分区间内,这样我们就可以知道最大误差可以是多少,一定小于区间大小的一半,即

\begin{equation*} \mid x-x^* \mid \lt \frac{b-a}{2} \end{equation*}

其中\(x=(a+b)/2\),为区间的中点。

二分法程序如下:

function [x e] = mybisect (f,a,b,n)
% function [x e] = mybisect (f,a,b,n)
% Does n iterations of the bisection method for a function f
% Inputs : f -- an inline function
% a,b -- left and right edges of the interval
% n -- the number of bisections to do.
% Outputs : x -- the estimated solution of f(x) = 0
% e -- an upper bound on the error
format long
% evaluate at the ends and make sure there is a sign change
c = f(a); d = f(b);
if c*d > 0.0
error (’Function has same sign at both endpoints .’)
end
disp (’ x y’)
for i = 1:n
% find the middle and evaluate there
x = (a + b )/2;
y = f(x);
disp ([ x y])
if y == 0.0 % solved the equation exactly
e = 0;
break % jumps out of the for loop
end
% decide which half to keep , so that the signs at the ends differ
if c*y < 0
b=x;
else
a=x;
end
end
% set the best estimate for x and the error bound
x = (a + b )/2;
e = (b-a )/2;

此程序不仅给出了方程的近似根,还给出了最大可能误差。

二分法总是可以进行下去,而牛顿法,如果初值\(x_0\)不足够接近\(x^*\)的话,程序可能不会收敛。而二分法,每一步的区间都可以缩一半,最终想缩多小就能缩多小。

找根

二分法和牛顿法都可以用来找根的任意近似值,但都需要先给定初值。二分法需要两个初值\(a\)和\(b\),并要求真实的根位于二者之间,牛顿法只需要一个初值\(x_0\),要求不能离真实的根太远。如何确定合适的初值?看情况而定。如果你一次只解一个方程,最好先把函数画出来,通过图上的函数零点,可以很容易定出合适的初值。

有些情况下你不是一次就解一个方程,而是多次求解同一个方程,只是系数不同。当你开发某特定用途的软件的时候,常常会遇到这种情况。在这种情况下,首先你要利用问题的自然条件,比如选定的区间要符号实际情况。然后通过区间内某些点的符号,很容易就可以逐渐接近方程的真实的根了。方程的根一定位于符号相异的两点之间。下面的程序就是在一给定的区间\([a_0,b_0]\)之间找方程的根:

function [a,b] = myrootfind (f,a0 ,b0)
% function [a,b] = myrootfind (f,a0 ,b0)
% Looks for subintervals where the function changes sign
% Inputs : f -- an inline function
% a0 -- the left edge of the domain
% b0 -- the right edge of the domain
% Outputs : a -- an array , giving the left edges of subintervals
% on which f changes sign
% b -- an array , giving the right edges of the subintervals
n = 1001; % number of test points to use
a = []; % start empty array
b = [];
% split the interval into n -1 intervals and evaluate at the break points
x = linspace (a0 ,b0 ,n);
y = f(x);
% loop through the intervals
for i = 1:(n -1)
if y(i)*y(i +1) < 0 % The sign changed , record it
a = [a x(i)];
b = [b x(i +1)];
end
end
if size (a ,1) == 0
warning (’no roots were found ’)
end

如果没有任何已知信息来找方程的根,事情就比较难办,好在这种情况在工程问题里不常见。

一旦确定出根所在的区间\([a, b]\),\(a\)和\(b\)就可以作为二分法和割线法(见下一讲)的初值。对于牛顿法,初值\(x_0\)一个明显的选法是\(x_0 = (a + b)/2\)。一个更好的选法是利用割线法选\(x_0\)。

练习

1 修改程序mybisect,在给定公差下解方程。应用你的程序,求解方程\(f(x) = 2x^3 + 3x − 1=0\)的根,初始区间是\([0,1]\),公差为\(10^{-8}\)。程序需要运行多少步能达到公差的要求?最终残量有多大?

2 用纸和计算器对于函数\(f(x) = x^3 − 4\)和初始区间\([1,3]\)进行3步二分法迭代,计算每步结果的误差和相对误差,并与第3讲练习3的结果比较。

转载于:https://www.cnblogs.com/joyfulphysics/p/5733464.html

Todd's Matlab讲义第5讲:二分法和找根相关推荐

  1. 二分法和简单迭代法的优缺点_二分法和牛顿迭代法求解方程的比较.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp理学 二分法和牛顿迭代法求解方程的比较.doc5页 本文档一共 ...

  2. matlab高级数据结构,Matlab讲义-第四章Matlab语言数据结构1-10.pdf

    Matlab讲义-第四章Matlab语言数据结构1-10.pdf 第四章第四章 Matlab语言基础语言基础 Matlab语言程序简洁.可语言程序简洁.可 读性很强而且调试十分容易.读性很强而且调试十 ...

  3. 视频教程-深入学习matlab免疫算法7讲-Matlab

    深入学习matlab免疫算法7讲 图像和算法等领域有多年研究和项目经验:指导发表科技核心期刊经验丰富:多次指导数学建模爱好者参赛. 宋星星 ¥20.00 立即订阅 扫码下载「CSDN程序员学院APP」 ...

  4. MySQL讲义第 40 讲——select 查询之函数(3):数学函数

    MySQL讲义第40讲--select 查询之函数(3):数学函数 文章目录 MySQL讲义第40讲--select 查询之函数(3):数学函数 一.数据准备 二.MySQL 数学函数介绍 1.ABS ...

  5. MySQL讲义第 35 讲——select 查询之正则表达式

    MySQL讲义第 35 讲--select 查询之正则表达式 文章目录 MySQL讲义第 35 讲--select 查询之正则表达式 一.正则表达式匹配规则 二.数据准备 三.查询包含某些字符的字段信 ...

  6. MySQL讲义第 37 讲——LOAD DATA INFILE 命令

    MySQL讲义第 37 讲--LOAD DATA INFILE 命令 文章目录 MySQL讲义第 37 讲--LOAD DATA INFILE 命令 一.LOAD DATA INFILE 命令的格式 ...

  7. MySQL讲义第 39 讲——select 查询之函数(2):日期时间型函数

    MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 文章目录 MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 一.数据准备 二.MySQL 日期时间型函 ...

  8. MySQL讲义第 41 讲——select 查询之函数(4):流程控制函数

    MySQL讲义第41讲--select 查询之函数(4):流程控制函数 文章目录 MySQL讲义第41讲--select 查询之函数(4):流程控制函数 一.数据准备 二.MySQL 流程控制函数介绍 ...

  9. 计算机安全学第2版pdf,计算机安全学讲义_第二讲:分组密码.pdf

    计算机安全学讲义_第二讲:分组密码.pdf 研究生课程 第二讲:分组密码 研究生课程 第二讲:分组密码 计算机安全学 通信系统保密模型 计算机安全学 对称密码体制-分组密码 Cryptography ...

  10. MySQL讲义第 33 讲——select 查询之静态交叉表查询

    MySQL讲义第 33 讲--select 查询之静态交叉表查询 文章目录 MySQL讲义第 33 讲--select 查询之静态交叉表查询 一.数据准备 二.交叉表的形式 三.静态交叉表的实现 1. ...

最新文章

  1. 关于学习Python的一点学习总结(23->跳出循环)
  2. 自然语言处理发展历程自我总结
  3. pyaiml聊天机器人
  4. 深入浅出学Hive:Hive高级编程
  5. python统计图教程_Python利用matplotlib绘制约数个数统计图示例
  6. 数据科学家需要掌握的10项统计技术,快来测一测吧
  7. codeforces George and Job
  8. Spring--quartz中cronExpression配置说明
  9. JSP表单提交中文乱码解决方案
  10. C++STL标准模板库容器详细实现算法代码
  11. 小D课堂 - 新版本微服务springcloud+Docker教程_5-08 断路器监控仪表参数
  12. 容器内部使用docker命令时报错:缺少libcrypto.so.10
  13. Houdini 快捷键
  14. vultarget-a红日靶场全面解析(完整版)
  15. android微信朋友圈相册背景,Android 仿微信朋友圈图片拖拽返回
  16. bootstrap3-dialog 使用说明
  17. 不会编程却想做APP ? 让Power Apps 来帮你
  18. 不信谣,不传谣,不造谣
  19. 不等式的格式(python)
  20. 传记-《硅谷钢铁侠》书中的精髓:从埃隆·马斯克的精神世界和人格特质里,找寻成功的秘密。

热门文章

  1. 探讨:Mac真的有必要安装双系统吗
  2. 声学模型(一) hmm声学训练流程
  3. Sphinx使用说明
  4. Unexpected bus error encountered in worker. This might be caused by insufficient shared memory(shm)
  5. endnote使用方法大全,endnote教程
  6. 关于网站被挂马的症状以及处理解决方法
  7. 雷军做程序员时写的博客,真心强啊。。
  8. C#实现超市管理系统(进销存--(包含部分用户权限的管理))
  9. 咖啡因到底会使人上瘾吗,这大概是最客观的解读
  10. 一段话加省略号怎么写html,HTML 应用 文字省略号的表示