我正在使用Matlab找到Jacobi迭代矩阵的谱半径A=[4 2 1;1 3 1;1 1 4]
。
我似乎无法在5次迭代后输入正确的命令来获取错误的大小。有人能帮助我吗?
以下是我到目前为止在Matlab中输入的命令列表:
A=[4 2 1;1 3 1;1 1 4]
A =
4 2 1
1 3 1
1 1 4
D=diagonal(diagonal(A));L=(A,-1);U=(A,1);
b=([3 -1 4])
x0j=zeros([0 0 0]);
x=D\(-(U+L)*x0j+b);r=b-A*x %Jacobi iteration.
------------------------------------------------------------------------------
Error using *
Inputs must be 2-D, o enter code here r at least one input must be scalar.
To compute element wise TIMES, use TIMES (.*) instead.
答案 0 :(得分:5)
矩阵的spectral radius是其特征值的模数的最大值。它可以使用max(abs(eig(·)))
进行简单计算。
然而,正如其他人已经注意到的那样,你的整个代码看起来很混乱而且实际上并不是有效的Matlab代码,所以你的问题并不是真正计算光谱半径,是吗? algorithm非常简单易用:
% diagonal part of A and rest
D = diag(diag(A));
R = A - D;
% iteration matrix and offset
T = - inv(D) * R;
C = inv(D) * b;
% spectral radius condition
rho = max(abs(eig(T)));
if rho >= 1
error('no convergence')
end
% initial guess
x = randn(size(b));
% iteration
while norm(A * x - b) > 1e-15
x = T * x + C;
end
请注意,我使用inv(D)
直接遵循维基百科中的描述,但可以使用diag(1 ./ diag(D))
轻松计算对角矩阵的逆矩阵。
我真的不明白为什么需要将R
分成上下两部分。我认为它与数值效率有关,但是,Matlab已经是一种非常有效的矩阵计算高级语言。所以实际上当你可以简单地写A \ b
时,没有必要明确地实现Jacobi算法 - 除了教育目的,我猜。