Matlab 没有内置运算符的函数的最小值/最大值,也没有for/while/if?

Matlab 没有内置运算符的函数的最小值/最大值,也没有for/while/if?,matlab,Matlab,我们必须在不使用标题中提到的运算符的情况下确定1x6000数组的最小/最大值。我们必须使用在课堂上学习的算法,但我不知道这将如何转化为matlab,因为我需要进行一定数量的迭代才能得到正确的答案 我们学习了二分法、穆勒法、牛顿法、不动点法等 请不要写代码,因为这是我的家庭作业,我正在努力学习一些东西,但是如果你能指引我正确的方向 谢谢。免责声明 我有点困惑,为什么不能使用进行或而循环,因为牛顿法、对分法或任何固定点法是一种需要循环的迭代算法。因此,这个答案假设除了使用这些使用循环的方法之外,不允

我们必须在不使用标题中提到的运算符的情况下确定1x6000数组的最小/最大值。我们必须使用在课堂上学习的算法,但我不知道这将如何转化为matlab,因为我需要进行一定数量的迭代才能得到正确的答案

我们学习了二分法、穆勒法、牛顿法、不动点法等

请不要写代码,因为这是我的家庭作业,我正在努力学习一些东西,但是如果你能指引我正确的方向

谢谢。

免责声明 我有点困惑,为什么不能使用
进行
循环,因为牛顿法、对分法或任何固定点法是一种需要循环的迭代算法。因此,这个答案假设除了使用这些使用循环的方法之外,不允许使用其他循环


由于允许使用牛顿法或二分法,请记住,这些方法可以找到函数的根,或者函数输出等于0。还请记住,当您找到导数并看到其中的值等于0时,这会告诉您哪些临界点(最小值和最大值)是函数的一部分。因此,如果对函数的导数使用牛顿法或二分法,则可以确定临界点,从而确定最小值或最大值的位置。然而,这些并不能告诉你这些点是最小值还是最大值。因此,你必须看一看二阶导数,并检查这些点的符号。如果符号为正,则为最小值;如果符号为负,则为最大值

因为您只有一个点数组,而不是实际函数本身,所以请看一看,对于一个数组,计算导数(即有限差分)的离散近似。另外,当您在数组中指定不属于整数值的点时(牛顿法或二分法不可避免),请查看如何插值并找到整数值之间的近似值

我只为牛顿的方法做例子。您可以为二分法导出一组类似的规则。回想一下,牛顿方法的定义如下:


(来源:)

xi
是根的当前猜测,而
xi{i+1}
是根的下一个猜测
f(x_i)
是在
x_i
处计算的函数,而
f'(x_i)
是函数的导数。因为你想找到导数等于0而不是原始函数的临界点,
f(x_i)
现在是
f'(x_i)
,它的导数只是二阶导数或
f'(x_i)

假设
X
是您拥有的点数组,伪代码可能如下所示:

  • 使用
    dx=diff(X,1)
    计算一阶导数,使用
    dx2=diff(X,2)
    计算二阶导数
  • 指定导数的根(
    xp
    )的初始猜测,或您认为最小点或最大点的位置。从中间点开始,
    xp=地板(numel(X)/2)可能是一个很好的起点
  • diff(X,1)
    上,使用
    xp
    作为初始猜测并更新
    xp
    以用于未来猜测时,运行牛顿方法
    N
    的次数或当连续猜测根之间的差值小于某个阈值时。对于根的每次猜测,使用
    interp1
    确定此时导数的近似值。因此,牛顿的更新规则如下所示:

    i1 = interp1(1:numel(dx), dx, xp, 'linear');
    i2 = interp1(1:numel(dx2), dx2, xp, 'linear');
    xp = xp - (i1 / i2);
    
    i1
    是在当前猜测
    xp
    时计算的导数,
    i2
    是在当前猜测
    xp
    时计算的二阶导数。然后我们进行更新

  • xp
    现在将包含临界点所在的位置。但是,这里可能有浮点精度,因此使用它来索引原始数组
    X
    以获取最小值或最大值是无效的。作为一种启发,我可以建议将
    xp
    四舍五入,这是有意义的,因为最终根的小数浮动部分为
    <0.5
    将表明您倾向于值的左侧,而
    =0.5
    将表明您倾向于右侧
  • 一旦牛顿方法收敛,您需要检查该值是最小值还是最大值。由于不能使用
    if
    ,这里的技巧是让函数输出一个两元素数组,其中两个值都初始化为
    NaN
    。根据其二阶导数在
    xp
    处的符号,您可以手动创建正确的索引,以仅填充此数组的一个元素,而将另一个元素保留为
    NaN
    。不是
    NaN
    的位置应该告诉您它是最小值还是最大值。我将坚持第一个元素是最小值,第二个元素是最大值的约定。您可以通过以下方式具体确定此逻辑:

    minmax = [NaN NaN];
    ind = interp1(1:numel(dx2), dx2, xp, 'linear') > 0 + 1;
    minmax(ind) = X(round(xp));
    
    第二条语句计算需要填充此数组中的值的位置的索引。它表示如果符号为正,则值应等于1,如果不是,则值应等于0。现在,添加偏移量1意味着索引将为1或2,其中1是最小值,2是最大值


  • 如果您有多个最小值或最大值,该怎么办? 可能的情况是,在整个数组中有多个最小值或最大值具有相同的值,或者希望同时找到最小值和最大值。在这种情况下,你就必须再次这样做