Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 二进制搜索与一次固定一个数字_Algorithm_Matlab_Scientific Computing - Fatal编程技术网

Algorithm 二进制搜索与一次固定一个数字

Algorithm 二进制搜索与一次固定一个数字,algorithm,matlab,scientific-computing,Algorithm,Matlab,Scientific Computing,问题:我想搜索一个实数x0,这样f(x0)=0。我们只知道,f是单调递增的,没有导数,x_0是实正数,但不是非常大,因此程序不会终止 当我没有参加算法课程时,我为此编写了一个程序,让我们将此方法称为替代搜索 方法是初始化步长h并从左侧递增。如果f(x_0)>0,则从现在开始后退,并按h/10递增。换句话说,一次固定一个数字,当步长非常小时终止 这种方法与二进制搜索(或有人称之为二分法)相比如何 我的直觉告诉我,每次另类搜索解决问题的十分之一比一半要慢。应该是对的,是吗?如果您只对眼前问题的答案感

问题:我想搜索一个实数
x0
,这样
f(x0)=0
。我们只知道,
f
是单调递增的,没有导数,
x_0
是实正数,但不是非常大,因此程序不会终止

当我没有参加算法课程时,我为此编写了一个程序,让我们将此方法称为
替代搜索

方法是初始化步长
h
并从左侧递增。如果
f(x_0)>0
,则从现在开始后退,并按
h/10
递增。换句话说,一次固定一个数字,当步长非常小时终止

这种方法与二进制搜索(或有人称之为二分法)相比如何


我的直觉告诉我,每次
另类搜索
解决问题的十分之一比一半要慢。应该是对的,是吗?

如果您只对眼前问题的答案感兴趣,请跳到第二部分。
在第一节中,我将解释如何在您的案例中实际使用二进制搜索

二进制搜索 首先,这个问题不能仅仅通过二进制搜索来解决,因为你需要一个区间[a,b],在这个区间内你的解x*和f(x*)=0。 例如,可以使用指数搜索算法找到这样的间隔:

  • 从值x0开始,使f(x)<0
  • 只要f(x)<0,将x乘以2(或另一个固定因子>1)
这样,您的算法在最多log2(x*/x0)步之后终止,其值x为f(x)<0且f(2x)>0。因此,我们可以在二进制搜索中使用这个区间[x,2x]

此外,如果解x*是实数,则二进制搜索通常不能给出精确解,只能给出具有任意精度的近似值(更具体地说是区间),因为实数可以有无限多个数字。实际上,计算机的精度有限,因此算法总是终止的

在二进制搜索算法中,不是在当前间隔的中点是正确的解时终止,而是在当前间隔的长度低于所需精度时终止

由于间隔的长度随每一步减半,如果开始间隔的长度为L,且要求的精度为e,则算法在log2(L/e)步后终止

当我们将这些算法结合在一起时,总体解决方案是

  • 使用指数搜索查找包含x*的区间[a,b]
  • 使用二进制搜索查找[a,b]中x*的近似值
  • 正如我们所知,指数搜索[x,2x]返回的区间包含x*,整个算法采用log2(x*/x0)+log2(x/e)步数,约为log2(x*²/(e x0)),

    因为X只是考虑在两种情况下,你经常评估<代码> f>代码>以使间隔缩小到大致相同的大小。