Octave 中三对角矩阵的内存优化 Gauss-Seidel 迭代

Memory-optimized Gauss-Seidel iteration on a tridiagonal matrix in Octave

我正在尝试用 Octave 编写一个程序来求解三对角线性方程组。具体的部分是我的数据没有保存在通常的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