前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab 二分法区间,多区间二分法[通俗易懂]

matlab 二分法区间,多区间二分法[通俗易懂]

作者头像
全栈程序员站长
发布2022-07-28 09:51:39
7080
发布2022-07-28 09:51:39
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

&nbsp

&nbsp

&nbsp

&nbsp

&nbsp

&nbsp

&nbsp

预备知识 二分法

这里介绍一种多区间二分法,可以求出连续函数在某区间内几乎全部的根.方法就是把这个区间等分为若干个相等的小区间,然后分别判断这些小区间两端函数值的符号,对所有两端异号的区间使用二分法即可.显然,小区间的个数越多,越有可能找到所有的根.例程如下.

代码 1:bisectionN.m

函数的前两个输入变量分别是需要求根的函数句柄和求根区间(二元行矢量或列矢量),第三个变量 N 是子区间端点的个数(即子区间的个数加一).函数中先求出所有的端点 x,以及对应的函数值 y,然后画图.第 6-7 行寻找所有两端异号或有一端为 0 的区间的序号,然后在第 10 行的循环中对这些区间逐个使用二分法.为了提高运算效率,这里并没有使用 “二分法” 中的例程,而是使用了 Matlab 自带的 fzero 函数.

bisectionN 的画图功能是为了让用户判断是否有可能出现漏根,以下举两个例子说明.>> f = @(x)exp(-0.2*x)*sin(x);

>> roots = bisectionN(f, [0, 15], 50)

roots = 0 3.1416 6.2832 9.4248 12.5664

图 1:运行结果

运行结果如图 1,由于画出的曲线较为光滑,可判断漏根的可能性很小.再看另一个例子>> f = @(x)sin(1/x);

>> roots = bisectionN(f, [0, 0.3], 50)

roots = 0.0245 0.0398 0.0455 0.0531 0.0637 0.0796 0.1061 0.1592

图 2:运行结果

我们已经知道函数 \sin\left(1/x\right) 在该区间上有无数个根,且越接近 x = 0,相邻根之间的距离越小.运行结果如图 2, 可见在区间 [0, 0.1] 内,子区间端点的函数值非常不平滑,极有可能出现漏根.为了求得更多的根,我们可以增加子区间的个数.

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128159.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档