Matlab 八度三对角矩阵上的记忆优化Gauss-Seidel迭代
我正试图用八度音阶写一个程序来解一个三对角线性方程组。具体来说,我的数据不是保存在通常的nxn矩阵中,而是保存在nx3矩阵中,其中每列分别表示下对角线、主对角线和上对角线 我已经为常用矩阵开发了一个函数式迭代过程,但在这种情况下,我不知何故无法获得正确的索引(我假设,因为代码或多或少是相同的)。A(1,1)和A(n,3)总是空的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; #
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')你是正确的。两者都是问题。代码现在可以工作了!你说得对。两者都是问题。代码现在可以工作了!