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
我正在尝试用 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