祝大家新年快乐! :)

我在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,对角线上的条目为3b就是这样的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,因此,Gauss-Seidel方法不会收敛。

有关更多详细信息,请参见第18页的slide

编辑

根据@LutzL的评论,您可以使用Gershgorin circle theorem估计特征值,而不用计算成本来计算它们。

关于matlab - 高斯-塞德尔方法超出机器数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20892966/

10-11 09:00