【问题标题】:Steepest Descent Algorithm in OctaveOctave 中的最速下降算法
【发布时间】:2013-11-19 22:17:07
【问题描述】:

尽管该算法的伪代码看起来非常简单,但我无法以 octave 实现该算法。介绍这个算法的书只有一页长,所以关于这个算法的信息并不多,所以我只是贴出psedocode:

Compute r = b - Ax and  p = A r
Until convergence, Do:
     a <- (r,r) / (p,r)
     x <- x + a r
     r <- r - r p
     compute p := A r
End do

这是我在 Octave 中实现这一点的尝试。我用书中的一个例子来测试程序:

A = [5,2,-1;3,7,3;1,-4,6];
b = [2;-1;1];
x0 = [0;0;0];
Tol = 0.00001;

x=x0;

r = b-A*x;
p = A*r;
while true,
    a = (r')*(r)/((p)*(r'));
    disp(a);
    x = x + a * r;
    r = r - a * p;
    p = A*r;
    if norm(r) < Tol,
        break
    end
end

当我运行它时,我收到一条错误消息,说我除以的第一个​​矩阵是 1x1,第二个矩阵是 3v3,所以我无法做到这一点,我明白这一点。我考虑过使用 ./ 运算符,但据我了解,这不会产生我正在寻找的结果,并且此示例应该可以进行除法。我搞砸了我的实现还是我对这个算法的理解是错误的?不确定是在此处发布还是在 math.stackexchange 上发布,但我在这里尝试过。

【问题讨论】:

    标签: octave mathematical-optimization


    【解决方案1】:

    我的第一个想法是错误信息:你有(r') * (r) / ((p) * (r'));分母应该是(p) * (r') 还是(p') * (r)(注意' 在哪里)?

    【讨论】:

    • 分母应该是 (p) * (r'),因为 r 是转置的,我添加了额外的括号将表达式标记为分母。我试图将 ' 移到括号外给我 ((p)*(r)') ,但由于某种原因没有给我错误消息。我现在很困惑。
    • 我问是因为这似乎是导致错误的原因,当我尝试您的示例时,事实证明 p*(r') 首先是一个奇异矩阵,所以除以它不会没道理。伪代码 (p,r) 中的符号看起来像内积,它应该总是计算为一个数字;如果这是真的,分母应该是 ((p') * r)。当我使用此更改运行您的示例时,经过十多次迭代后,r 确实会缩小到容差水平以下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多