找到jacobi迭代矩阵的谱半径

时间:2013-11-15 02:09:36

标签: matlab math matrix

我正在使用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.

1 个答案:

答案 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算法 - 除了教育目的,我猜。