Octave 倍频程最速下降算法

Octave 倍频程最速下降算法,octave,mathematical-optimization,Octave,Mathematical Optimization,虽然这个算法的伪代码看起来很简单,但我在八度音程中实现这个算法时遇到了困难。关于这个算法的书只有一页长,所以没有太多关于这个算法的信息,所以我将发布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 computer=b-

虽然这个算法的伪代码看起来很简单,但我在八度音程中实现这个算法时遇到了困难。关于这个算法的书只有一页长,所以没有太多关于这个算法的信息,所以我将发布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
computer=b-Ax和p=ar
在趋同之前,请执行以下操作:

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

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

分母应该是(p)*(r'),因为r是转置的,我添加了额外的括号来将表达式标记为分母。我试着把括号外的((p)*(r)移到括号外,因为某种原因,它没有给我错误信息。我现在很困惑。我问,因为这似乎是导致错误的原因,当我尝试你的例子时,结果表明p*(r')首先是一个奇异矩阵,所以除以它没有意义。伪代码(p,r)中的符号看起来像内积,它应该总是计算为一个数字;如果这是真的,分母应该是((p')*r)。当我使用此更改运行您的示例时,经过十几次迭代后,r确实缩小到公差水平以下。分母应该是(p)*(r'),因为r是转置的,我添加了额外的括号以将表达式标记为分母。我试着把括号外的((p)*(r)移到括号外,因为某种原因,它没有给我错误信息。我现在很困惑。我问,因为这似乎是导致错误的原因,当我尝试你的例子时,结果表明p*(r')首先是一个奇异矩阵,所以除以它没有意义。伪代码(p,r)中的符号看起来像内积,它应该总是计算为一个数字;如果这是真的,分母应该是((p')*r)。当我使用此更改运行您的示例时,经过十几次迭代后,r确实缩小到公差级别以下。
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