Matlab 八度三对角矩阵上的记忆优化Gauss-Seidel迭代

Matlab 八度三对角矩阵上的记忆优化Gauss-Seidel迭代,matlab,matrix,octave,linear-algebra,Matlab,Matrix,Octave,Linear Algebra,我正试图用八度音阶写一个程序来解一个三对角线性方程组。具体来说,我的数据不是保存在通常的nxn矩阵中,而是保存在nx3矩阵中,其中每列分别表示下对角线、主对角线和上对角线 我已经为常用矩阵开发了一个函数式迭代过程,但在这种情况下,我不知何故无法获得正确的索引(我假设,因为代码或多或少是相同的)。A(1,1)和A(n,3)总是空的 A = [ 0, 1, 1; 1, 1, 1; 1, 1, 0 ] # represents M = [ 1, 1, 0; #

我正试图用八度音阶写一个程序来解一个三对角线性方程组。具体来说,我的数据不是保存在通常的nxn矩阵中,而是保存在nx3矩阵中,其中每列分别表示下对角线、主对角线和上对角线

我已经为常用矩阵开发了一个函数式迭代过程,但在这种情况下,我不知何故无法获得正确的索引(我假设,因为代码或多或少是相同的)。A(1,1)和A(n,3)总是空的

A = [ 0, 1, 1;
      1, 1, 1;
      1, 1, 0 ]

#  represents M = [ 1, 1, 0; 
#                   1, 1, 1;
#                   0, 1, 1 ]

b = [ 3, 2, 1 ]

n = 3

x_new = [2 2 2]
x_old = [2 2 2]

for iter = 1:16
  disp(iter)
    for i = 1:n

    if i == 1
#      disp(A(i,:))
#      disp("first")
      x_new(i) = (1 / A(i, 2)) * ( b(i) - A(i, 3)*x_old(i+1) );
    elseif i == n
#      disp(A(i,:))
#      disp("last")
      x_new(i) = (1 / A(i, 2)) * ( b(i) - A(i, 1)*x_new(i-1) );
    else
      x_new(i) = (1 / A(i, 2)) * ( b(i) - A(i, 1)*x_new(i-1) - A(i, 3)*x_old(i+1) );
    end    

    x_old = x_new;
  end
end

disp(x_old)
有什么建议吗?我对八度音阶和代数不熟悉。

m既不是对角占优的,也不是正定的。使用函数
chol()
进行正定测试

赋值
x_old=x_new
不应在内部循环中:

while it < maxit
    x_old = x_new;
    x_new(1) = (1 / A(1, 2)) * ( b(1) - A(1, 3) * x_old(2) );

    for i = 2 : n - 1
        x_new(i) = (1 / A(i, 2)) * ( b(i) - A(i, 1) * x_new(i - 1) - A(i, 3) * x_old(i + 1) );
    end

    x_new(n) = (1 / A(n, 2)) * ( b(n) - A(n, 1) * x_new(n - 1) );

    if norm(x_new - x_old, 'inf') <= max_error
        break
    end
    it = it + 1;
end
而它chol()
进行正定测试

赋值
x_old=x_new
不应在内部循环中:

while it < maxit
    x_old = x_new;
    x_new(1) = (1 / A(1, 2)) * ( b(1) - A(1, 3) * x_old(2) );

    for i = 2 : n - 1
        x_new(i) = (1 / A(i, 2)) * ( b(i) - A(i, 1) * x_new(i - 1) - A(i, 3) * x_old(i + 1) );
    end

    x_new(n) = (1 / A(n, 2)) * ( b(n) - A(n, 1) * x_new(n - 1) );

    if norm(x_new - x_old, 'inf') <= max_error
        break
    end
    it = it + 1;
end
而它如果norm(x_new-x_old,'inf')你是正确的。两者都是问题。代码现在可以工作了!你说得对。两者都是问题。代码现在可以工作了!