创建用于实现最速下降算法的函数

Creating function for implementing steepest descent algorithm

我正在尝试实现最速下降算法以最小化 2D 函数。让我举例说明。

我有函数 f1(x1,x2) = 2*x1^2 + x2^2 - 5*x1*x2 并从初始猜测点 p0 = [1,0] 开始。

第一步:初始猜测点p0 = [1,0],收敛参数e=0.1

第 2 步:计算 p0f1 的梯度 c1c1=[4,-5] 我正在使用中心差分法。

第3步:若c1>e正常,则转第4步,否则停止。

第四步:我们的搜索方向是d1 = - c1。所以,d1 = [-4,5].

第 5 步:找到步长 a 以最小化 f1(a) = f1(p0 + a*d1) = f1(1-4a,5a)

第 6 步:将 p0 更新为 p1 作为 p1 = p0 + a * d1 并更新到第 2 步。

我正在尝试在 matlab 中实现这个示例,但不知道如何实现第 5 步。我知道蚂蚁一维搜索算法,例如二分法可以工作。但是,问题是把'converting'f1(1-4a,5a)代入一个函数,即将(1-4a,5a)代入f1。我在这里遇到符号常量a,我不知道如何处理。如果我编写一个最小化函数,我可以将值传递给它,但不确定符号变量 a。我不想使用 matlab 的特殊功能,例如符号和试图将代码保持在一般水平,因此我可以毫无问题地将它转换为其他编程语言。欢迎您提出建议。

您可能想使用 fminbnd 为线搜索设置一些界限(下面的 -1 到 1),因为搜索整条线是一项定义不明确的任务。不需要符号变量。通过最小化下面的匿名函数来确定步长:

a = fminbnd(@(a) f1(p(1) + a*d(1), p(2) + a*d(2)), -1, 1);

这里p是当前点,d是搜索方向。 (我不想像您描述的那样称它们为 p1 和 d1,好像它们仅用于第一步。)

示例允许负 a,我发现这在实践中很有帮助;有时最好从梯度建议的相反方向走。要禁止这样做,请将边界更改为 0、1(或 0、10 以在向前方向进行更积极的搜索)。