gpt4 book ai didi

matlab - 高斯-赛德尔法超过机器数?

转载 作者:行者123 更新时间:2023-12-02 07:11:30 27 4
gpt4 key购买 nike

祝大家新年快乐! :)

我正在 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的谱半径。 Gauss-Seidel 收敛必须小于 1。实际上,您的测试用例中的矩阵 A 具有 R=1.8092,因此 Gauss-Seidel 方法不会收敛。

检查这个slide从第 18 页了解更多详细信息。

编辑

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com