Matlab/Octave 使用高斯赛德尔解矩阵不收敛

Matlab/Octave 使用高斯赛德尔解矩阵不收敛

完全不可能的事情正在发生。我多次在相同的矩阵并且总是在 10 次迭代内使用高斯赛德尔方法收敛到一个解决方案。

我的高斯赛德尔函数定义是:

function xnew = gauss_seidel(A, b, xold)
  n = size(A)(1);
  At = A;
  xnew = xold;
  for i = 1 : n
    At(n, n) = 0;
  end
  for i = 1 : n
    xnew(i) = (b(i) - At(i, :)*xnew)/A(i, i);
  end
endfunction

建立系数矩阵、解向量和初始近似向量:

A = [20 1 -1; 1 -10 1; -1 1 10];
b = [17 13 18]';
x = [0 0 0]';

使用高斯赛德尔方法:

>> x = gauss_seidel(A, b, x)
Test
x =

   0.85000
  -1.21500
   2.00650

>> x = gauss_seidel(A, b, x)
Test
x =

   0.16107
   0.13176
   1.80293

>> x = gauss_seidel(A, b, x)
Test
x =

   0.77248
  -1.17422
   1.99467

>> x = gauss_seidel(A, b, x)
Test
x =

   0.235961
   0.097279
   1.813868

等等...等等...有人可以指导我了解我可能犯了什么错误,导致我的代码无法收敛吗?

答案1

当然,不可能的事情是不可能发生的。一次意外事故让我输入了错误的字符。下面的一段代码应该等于(我,我)

function xnew = gauss_seidel(A, b, xold)
  n = size(A)(1);
  At = A;
  xnew = xold;
  for i = 1 : n
    At(n, n) = 0; //THIS SHOULD EQUAL (i, i)
  end
  for i = 1 : n
    xnew(i) = (b(i) - At(i, :)*xnew)/A(i, i);
  end
endfunction

相关内容