【问题标题】:Creating function for implementing steepest descent algorithm创建用于实现最速下降算法的函数
【发布时间】:2017-03-22 18:50:07
【问题描述】:

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

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

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

第 2 步:计算 f1p0 处的梯度 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 更新为 p1p1 = p0 + a * d1 并更新为第 2 步。

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

【问题讨论】:

  • 请向我们展示您目前拥有的代码。

标签: algorithm matlab mathematical-optimization


【解决方案1】:

您可能希望使用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 以进行更积极的正向搜索)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多