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