我在八度音程中实现这个算法时遇到了麻烦,即使这个算法的伪代码看起来很简单。覆盖这个算法的书只有1页长,所以关于这个算法没有太多的信息,所以我只想发布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
当我运行这个时,我得到一个错误,说第一个矩阵im除以1x1而第二个矩阵是3v3,所以我无法做到这一点,我明白了。我考虑过使用./运算符,但据我所知,这并没有产生我正在寻找的结果,这个例子应该是可以分割的。我搞砸了我的实现还是我对这个算法的理解错了?不知道是在这里发布还是math.stackexchange,但我试过这里。
答案 0 :(得分:1)
我的第一个想法是错误消息:你有(r') * (r) / ((p) * (r'))
;分母应该是(p) * (r')
还是(p') * (r)
(注意'
所在的位置?)