Matlab 没有内置运算符的函数的最小值/最大值,也没有for/while/if?
我们必须在不使用标题中提到的运算符的情况下确定1x6000数组的最小/最大值。我们必须使用在课堂上学习的算法,但我不知道这将如何转化为matlab,因为我需要进行一定数量的迭代才能得到正确的答案 我们学习了二分法、穆勒法、牛顿法、不动点法等 请不要写代码,因为这是我的家庭作业,我正在努力学习一些东西,但是如果你能指引我正确的方向 谢谢。免责声明 我有点困惑,为什么不能使用Matlab 没有内置运算符的函数的最小值/最大值,也没有for/while/if?,matlab,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是最大值
如果您有多个最小值或最大值,该怎么办?
可能的情况是,在整个数组中有多个最小值或最大值具有相同的值,或者希望同时找到最小值和最大值。在这种情况下,你就必须再次这样做