深入研究SOR算法

深入研究SOR算法

众所周知,SOR算法中,有一个参数是w,那么这个参数是干啥用的呢?

  • 根据公式,很容易知道,当w为1时,这个时候就是高斯赛德迭代法了,那其他情况呢?
  • 将通过以下的步骤,一步步得出结果

生成随机矩阵

算法设计

  • A矩阵的实现,首先需要用rand得到一组特征值,将该组特征值通过diag函数生成对角阵Q,之后通过orth函数生成对称矩阵U,再通过UQU’即可得到对称正定矩阵
  • b向量的实现同第一题,用randn函数即可

代码实现:

%n代表的是维度
b = randn([n(k) 1]);
Q = diag(rand([1 n(k)]));
U = orth(rand([n(k) n(k)]));

测试

  • 首先设置矩阵的维度为200,即A是一个200*200的矩阵
  • 将w的值分别设置成0.7、0.9、1.1、1.3
  • 用不同的值跑程序,观察他们的收敛曲线的差别
  • 结果如下:
    这里写图片描述
  • 实现代码
function [x, y] = SOR(n, A ,b, w)

    y = zeros(1000,1);
    eps = 1.0e-6;
    D = diag(diag(A));
    L = -tril(A, -1);
    U = -triu(A, 1);

    B = (D - w*L) \ ((1-w) * D + w*U);
    f = w * inv(D - w*L) * b;

    count = 1;

    x0 = zeros(n,1);
    x = B*x0 + f;

    tic;
    while norm(x-x0) > eps

        x0 = x;
        y(count) = norm(x-A\b);
        x = B*x0 + f;
        count = count + 1;

        if count > 2000
            disp('error:该矩阵不收敛');
            return;
        end
    end
    toc;
    y = toc;
    disp(count);
end
  • 结果分析

    w值的变化,越小收敛的速度越慢,越大收敛的速度越快

猜你喜欢

转载自blog.csdn.net/qq_36312878/article/details/80454646