没有内置运算符的函数的最小值/最大值,也不适用于/ while / if?

时间:2016-10-18 15:23:21

标签: matlab

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

我们学习了二分法,muller法,牛顿法,不动点法等。

请不要写代码,因为这是我的作业,我正在努力学习一些东西,但是如果你可以指导我朝着正确的方向......

谢谢。

1 个答案:

答案 0 :(得分:2)

声明

我对你为什么不能使用forwhile循环感到困惑,因为牛顿方法,二分法或任何定点方法都是需要循环的迭代算法。因此,这个答案假设除了使用这些使用循环的方法之外,不允许其他循环。

由于您被允许使用牛顿方法或二分法,请记住这些方法找到函数的根或函数输出等于0.还要记住,当您找到导数并查看值等于0的位置,这可以告诉您哪些临界点(最小值和最大值)是函数的一部分。因此,如果您在函数的导数上运行牛顿或二分法,则可以确定临界点,从而确定最小值或最大值。但是,这些不会告诉您这些积分是最低还是最高。因此,您必须查看二阶导数并在这些点检查符号。如果符号为正,则为最小值,如果符号为负,则为最大值。

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

我只做Newton的方法。您可以为二分法推导出一组类似的规则。回想一下Newton的方法被定义为:

http://web.mit.edu/10.001/Web/Course_Notes/NLAE/equation7.gif

x_i是根的当前猜测,而x_{i+1}是根的下一个猜测。 f(x_i)是在x_i评估的函数,而f'(x_i)是函数的派生。由于您希望找到导数等于0且不是原始函数的临界点,f(x_i)现在是f'(x_i),其衍生物只是二阶导数或f''(x_i)

鉴于X是你拥有的点数组,伪代码看起来像这样:

  1. 使用dx = diff(X, 1)计算一阶导数,dx2 = diff(X, 2)计算二阶导数。
  2. 指定衍生物的根xp的初始猜测,或您认为最小或最大点的位置。从xp = floor(numel(X)/2);可能是一个好地方开始的中间点开始。
  3. 运行Newton的方法N次数,或当根据diff(X, 1)使用xp作为时间点的连续猜测之间的差异小于某个阈值时最初的猜测和更新xp将用于未来的猜测。对于根的每次猜测,使用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评估的二阶导数。然后我们进行更新。

  4. xp现在将包含关键点所在位置的位置。但是,您可能在此处具有浮点精度,因此使用此索引到原始数组X以获得最小值或最大值无效。我可以建议作为启发式的一件事可能是圆xp这是有道理的,因为最终根的十进制浮动部分为< 0.5会表明你倾向于值的左边转向>= 0.5表明你向右倾斜。
  5. 一旦Newton的方法收敛,您需要检查该值是最小值还是最大值。由于您无法使用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是最大值。

  6. 如果您有多个最小值或最大值,该怎么办?

    在整个阵列中,您可以拥有多个具有相同值的最小值或最大值,或者您希望找到最小值和最大值。在这种情况下,您必须以递归方式执行此操作,首先运行牛顿方法以查找最小和最大点。然后你必须将你的阵列分成两半,其中前半部分是X中的第一个点直到这个最小/最大点,而后半部分是最后/最大点直到结束。您还必须在每个数组的中间进行初始猜测,以确保您不仅仅要返回可能位于数组末端的最大值或最小值。如果您想在没有循环的情况下实现此目的,则必须使用recursion。如果您考虑一下,这几乎与使用merge sort相同。如果您能够以一种有助于定义最小值和最大值或专门使用递归的方式使用合并排序逻辑,我不会感到惊讶。但是,既然你说你只能使用定点方法,我并没有建议使用递归开始。

    我已经提供了一些代码提示,但正如您所说,您不需要完整的代码,所以这应该可以让您开始。请注意,diff可能存在一些数字不准确,这是我没有尝试或测试过的算法。这是我在阅读你的问题时想到的一个想法。

    祝你好运!