创建用于实现最速下降算法的函数
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 步:计算 p0
处 f1
的梯度 c1
。 c1=[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 以在向前方向进行更积极的搜索)。
我正在尝试实现最速下降算法以最小化 2D 函数。让我举例说明。
我有函数 f1(x1,x2) = 2*x1^2 + x2^2 - 5*x1*x2
并从初始猜测点 p0 = [1,0]
开始。
第一步:初始猜测点p0 = [1,0]
,收敛参数e=0.1
第 2 步:计算 p0
处 f1
的梯度 c1
。 c1=[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 以在向前方向进行更积极的搜索)。