大家新年快乐! :)
我正在用Matlab编写一个Gauss-Seidel函数,遇到了一些问题。
当我们达到 6 位十进制精度时,迭代必须停止。这意味着x-xprevious
的无限范数(要求使用它)必须小于0.5*10^(-6)
。首先,这是我的函数:
function [x] = ex1_3(A,b)
format long
sizeA=size(A,1);
x=zeros(sizeA,1);
%Just a check for the conditions of the Gauss-Seidel Method
for i=1:sizeA
sum=0;
for j=1:sizeA
if i~=j
sum=sum+A(i,j);
end
end
if A(i,i)<sum
fprintf('nGauss-Seidel''s conditions not met!n');
return
end
end
%Actual Gauss-Seidel Method
max_temp=10^(-6); %Pass first iteration
while max_temp>(0.5*10^(-6))
xprevious=x;
for i=1:sizeA
x(i,1)=b(i,1);
for j=1:sizeA
if i~=j
x(i,1)=x(i,1)-A(i,j)*x(j,1);
end
end
x(i,1)=x(i,1)/A(i,i);
end
x
%Calculating infinite norm of vector x-xprevious
temp=x-xprevious;
max_temp=temp(1,1);
for i=2:sizeA
if abs(temp(i,1))>max_temp
max_temp=abs(temp(i,1));
end
end
end
现在的问题!当我为 3x3 数组调用函数时,我认为它可以工作。但是,当我为 10x10 数组调用它时x
变得Inf
(我想它超出了机器数量限制)。除了更改无限范数和 6 位十进制数字精度(我必须使用这两个,因为我的导师告诉我)之外,我能做些什么来防止这种情况?
在我使用的数组(提供给我的)中,对角线外的条目-1
,对角线上的条目3
. b
是这样的b=[2;1;1;1;1;1;1;1;1;2]
(对于n=10
)
高斯-赛德尔方法的条件不正确:
D=diag(diag(A));
L=-tril(A,-1);U=-triu(A,1);
B=(D-L)U;
R = max(abs(eig(B)));
if R>=1
fprintf('nGauss-Seidel''s conditions not met!n');
return
end
R
称为迭代矩阵B
的谱半径。高斯-赛德尔收敛必须小于 1。实际上测试用例中的矩阵A具有R=1.8092
,因此高斯-塞德尔方法不会收敛。
有关更多详细信息,请查看第 18 页的此幻灯片。
编辑
根据@LutzL的评论,您可以使用格什戈林圆定理来估计特征值,而不是用计算成本来计算它们。