1. function x = SOR(n, w); 定义一个名为 SOR 的函数,输入参数 n 和 w,输出值为 x。

  2. H = hilb(n); 生成 Hilbert 矩阵 H,大小为 n×n。

  3. b = H*ones(n, 1); 生成一个大小为 n×1 的全 1 列向量 b,将 H 矩阵乘以 b 得到方程组 Ax=b 的右侧矩阵 b。

  4. e = 0.00001; 设置精度 e 为 0.00001。

  5. for i = 1:n if H(i,i)==0
    disp('对角线为零,不能求解'); end end 检查 H 矩阵的对角线元素是否为零,若为零则输出'对角线为零,不能求解'。

  6. x = zeros(n, 1); 初始化解向量 x 为一个大小为 n×1 的全零向量。

  7. k = 0; 初始化迭代次数为 0。

  8. kmax = 10000; 设置最大迭代次数为 10000。

  9. r = 1; 初始化误差为 1。

  10. while k<=kmax & r>e
    x0 = x; for i = 1:n
    s = 0;
    for j = 1:i - 1 s = s + H(i, j) * x(j);
    end for j = i + 1:n s = s + H(i, j) * x0(j);
    end x(i) = (1 - w) * x0(i) + w / H(i, i) * (b(i) - s); end r = norm(x - x0, inf);
    k = k + 1; end 进行 SOR 迭代求解。在误差小于 e 或达到最大迭代次数时,停止迭代。每次迭代时,先保存当前解向量 x 到 x0 中,然后对每个未知量 i 进行更新。更新公式为 x(i) = (1 - w) * x0(i) + w / H(i, i) * (b(i) - s),其中 s 为 x 中除第 i 个元素外的所有元素与 H 的第 i 行进行内积运算得到的值。最后计算误差 r,即当前解向量 x 与上次迭代的解向量 x0 的差的无穷范数。

  11. if k>kmax
    disp('迭代不收敛,失败');
    else disp('求解成功'); r end 根据迭代次数判断是否收敛。若超过最大迭代次数,则输出'迭代不收敛,失败',否则输出'求解成功' 和最终误差 r 的值。

SOR 方法求解线性方程组代码详解

原文地址: https://www.cveoy.top/t/topic/n1R3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录