在Matlab中无限循环,计数器不会退出循环

时间:2014-11-21 12:31:36

标签: matlab

我正在编写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

2 个答案:

答案 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,因为更新程序的格式为

Jacobi update formula

虽然Gauss-Seidel更新的格式为

Gauss-Seidel update formula