我正在编写Gauss Seidel方法的函数来求解Ax = b形式的线性方程组,x是我们正在寻找的未知数。 我的函数中的while循环有问题,它似乎无限运行。我似乎无法弄清楚原因。
这是我创建系数矩阵A和列向量x和b的函数,当然所有行数都相同。没问题。
function [A, b, x0] = test_system(n)
u = ones(n, 1);
A = spdiags([u 4*u u], [-1 0 1], n, n);
b = zeros(n, 1);
b(1) = 3;
b(2 : 2 : end-2) = -2;
b(3 : 2 : end-1) = 2;
b(end) = -3;
x0 = ones(n, 1);
这是我解决系统的功能。我已经包含了所有它以防万一,但我相信真正的问题是在最后的while循环中,当我执行函数时无限运行。柜台也不会脱离它。我无法真正看出它的问题所在。有线索吗? 温柔,我是Matlab的新人:)
function [x] = GaussSeidel(A,b,x0,tol)
% implementation of the GaussSeidel iterative method
% for solving a linear system of equations Ax = b
%INPUTS:
% A: coefficient matrix
% b: column vector of constants
% x0: setup for the unknown vector (using vector of ones)
% tol: result must be within 'tol' of correct answer.
%OUTPUTS:
% x: unknown
%check that A is a matrix
if ~(ismatrix(A))
error('A is not a matrix');
end
%check that A is square
[m,n] = size(A);
if m ~= n
error('Matrix A is not square');
end
%check that b is a column vector
if ~(iscolumn(b))
error('b is not a column vector');
end
%check that x0 is a column vector
if ~(iscolumn(x0))
error('x0 is not a column vector');
end
%check that A, b and x0 agree in size
[rowA,colA] = size(A);
[rowb,colb] = size(b);
[rowx0,colx0] = size(x0);
if ~isequal(colA,rowb)||~isequal(rowb,rowx0)
error('matrix dimensions of A, b and xo do not agree');
end
%check that A and b have real entries
if ~isreal(A) || ~isreal(b)
error('matrix A or vector b do not have real entries');
end
%check that the provided tolerance is positive
if tol <= 0
error('tolerance must be positive');
end
%check that A is strictly diagonally dominant
absoluteA = abs(A);
row_sum=sum(absoluteA,2);
diagonal=diag(absoluteA);
if ~all(2*diagonal > row_sum)
warning('matrix A is not strictly diagonally dominant');
end
L = tril(A,-1);
U = triu(A,+1);
D = diag(diag(A));
x = x0;
M1 = inv(D).*L;
M2 = inv(D).*U;
M3 = D\b;
k = 0; %iterations counter
disp(size(M1));
disp(size(M2));
disp(size(M3));
disp(size(x));
while (norm(A*x - b) > tol)
for i=1:n
x(i) = - M1(i,:).*x - M2(i,:).*x + M3(i,:);
end
k=k+1;
if(k >= 10e4)
error('too many iterations carried out');
end
end
end %end function
答案 0 :(得分:0)
我没有50个声誉,所以我不能对此发表评论。
第if(k >= 10e4)
行,我认为这不符合您的想法。 10e4
为100,000,1e4
为10,000。这就是为什么你认为你的计数器不起作用的原因。 Matlab仍在运行,因为它的运行速度超出了您的预期。我也遇到了knedlsepp已经指出的相同问题。
答案 1 :(得分:0)
编码错误的来源是使用逐元素运算而不是矩阵 - 矩阵和矩阵向量运算。
这些操作产生零矩阵,因此没有进展。
M
矩阵应由
M1 = inv(D)*L; % Note that D\L is more efficient
M2 = inv(D)*U; % Note that D\U is more efficient
M3 = D\b;
并且执行更新的迭代器应该是
x(i) = - M1(i,:)*x - M2(i,:)*x + M3(i,:);
我还认为值得一提的是,代码目前正在实现Jacobi Method,因为更新程序的格式为
虽然Gauss-Seidel更新的格式为