线性方程组的迭代解法——超松弛迭代法

  1.代码

%%超松弛迭代法(此方法适用于大型稀疏矩阵但不适合与病态方程的解
%%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度,omiga是松弛因子
function OIM = Overrelaxation_iterative_method(M,b,X0,epsilon)
[m,n] = size(M);
d = diag(M);L = zeros(m,n);U = zeros(m,n);D = zeros(m,n);eps = floor(abs(log(epsilon)));
ub = 10000;X = zeros(m,ucb);X(:,1) = X0;X_delta = X;X_end = zeros(m,1);k_end = 0;
for i = 1:m
    for j = 1:n
        if i > j
            L(i,j) = -M(i,j);
        elseif i < j
            U(i,j) = -M(i,j);
        elseif i == j
            D(i,j) = d(i);
        end
    end
end
J = D\(L+U);
MAX = Spectral_radius(J);
Optimum_relaxation_factor = 2/(1+sqrt(1-MAX^2));
disp(‘最佳松弛因子:‘);
abs(Optimum_relaxation_factor)
omiga = input(‘输入松弛因子:‘);
L_omiga = (D-omiga*L)\((1-omiga)*D+omiga*U);
f = omiga*((D-omiga*L)\b);
for k = 1:ub-1
    X(:,k+1) = L_omiga*X(:,k)+f;
    X_delta(:,k) = X(:,k+1)-X(:,k);
    delta = norm(X_delta(:,k),2);
    if delta < epsilon
        break
    end
end
disp(‘迭代解及迭代次数为:‘);
k
OIM = vpa([X(:,k)‘],eps);
%%谱半径
%%M是方阵
    function Sr = Spectral_radius(M)
        e = eig(M);
        Sr = max(e);
    end
end

  2.例子

clear all
clc
for i = 1:8
    for j = 1:8
        if i == j
            M(i,j) = 2.1;
        elseif i - j == 1
            M(i,j) = 1;
        elseif j - i == 1
            M(i,j) = -1;
        else
            M(i,j) = 0;
        end
    end
end
b = [1 2 3 4 4 3 2 1]‘;
X0 = [1 1 1 1 1 1 1 1]‘;
epsilon = 1e-4;

S = Overrelaxation_iterative_method(M,b,X0,epsilon)
M\b

  结果如下

最佳松弛因子:
ans =
    0.8540
输入松弛因子:0.8
迭代解及迭代次数为:
k =
    11
S =
[ 1.07163702, 1.25042379, 1.69753618, 1.81524709, 1.50955555, 0.985313468, 0.578713811, 0.200612427]
ans =
    1.0716
    1.2504
    1.6975
    1.8152
    1.5096
    0.9853
    0.5787
    0.2006

  

原文地址:https://www.cnblogs.com/guliangt/p/12119311.html

时间: 2024-08-27 21:00:45

线性方程组的迭代解法——超松弛迭代法的相关文章

线性方程组的迭代解法——雅可比迭代法

1.代码 %%雅可比迭代法(此迭代法对于病态矩阵的解不理想) %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function JIM = Jacobian_iteration_method(M,b,X0,epsilon) [m,n] = size(M); d = diag(M);L = zeros(m,n);U = zeros(m,n);D = zeros(m,n); delta = 0;ub = 100;X = zeros(m,ub);X(:,1) = X

线性方程组的迭代解法数值结果分析

纸上得来终觉浅,绝知此事要躬行. ----(宋)陆游 在使用有限差分法的五点格式求解偏微分方程组时,把问题转化为求解数量级从10直到为10^4个未知数的稀疏矩阵的线性方程组,然后使用了Jocobi迭代,G-S迭代,SOR迭代以及CG迭代求解. 不管从程序的运行时间还是结果精度来看,SOR迭代和CG迭代较另外两种迭代法占优,而数值结果显示SOR迭代和CG迭代的收敛速度基本相当(后者稍微占优一点儿),这和理论的推导结果吻合地很好. 从程序使用的内存空间考虑的话,问题变得复杂了.简言之,CG方法依旧胜

线性方程组的迭代解法

简介 求解线性方程组有直接解法和迭代解法两种方法.与直接解法相比,迭代解法能够比较好地保持系数矩阵的稀疏性,在大型线性方程组的求解问题中得到了广泛应用. 比较典型的迭代算法有三种,古典迭代法.共轭梯度法和广义极小剩余(GMRES)法. 古典迭代法从系数矩阵构造(分裂)出单步迭代格式,具有算法简单的优点,但是不易收敛,速度较慢. 共轭梯度法是一种多步算法.首先利用对称正定的系数矩阵,将方程组的求解问题转换成等价的优化问题,零点解向量变成极点解向量.其次以迭代点.剩余向量和搜索方向构造迭代格式.可以

线性方程组的迭代解法——高斯-塞得勒迭代法

1.代码 %%高斯-塞得勒迭代法 %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function GSIM = Gauss_Seidel_iterative_method(M,b,X0,epsilon) [m,n] = size(M); d = diag(M); L = zeros(m,n); U = zeros(m,n); D = zeros(m,n); ub = 100;X = zeros(m,ub);X(:,1) = X0;X_delta = X;X_

数值分析-线性方程组的迭代解法

迭代法 对于AX = b 可将方程组进行改写 得到X = BX + f 迭代法就是通过设定初值X0 然后通过Xk+1 = BXk + f不断迭代 迭代一定次数后,Xn 可近似的看做方程组的解 迭代法的收敛性 设X*为方程组的准确解 εk = || Xk  - X* || 可以看到εk+1 = B * εk 迭代法收敛的充要条件是B的谱半径<1 B的谱半径为B最小的那个特征值 收敛阶 收敛阶就是收敛速度 平均收敛速度为-ln || Bk ||1/k 渐进收敛速度为 R(B) = -ln (ρ(B)

线性方程组的迭代解法——共轭梯度法

1.代码 %%共轭梯度法(用于求解正定对称方程组) %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function CGM = Conjugate_gradient_method(M,b,X0,epsilon) m = size(M);up = 1000;e = floor(abs(log(epsilon))); X(:,1) = X0; r(:,1) = b-M*X0;p(:,1) = r(:,1); for k = 1:up alpha = Inner_

线性方程组的迭代解法——最速下降法

1.代码 %%最速下降法(用于求解正定对称方程组) %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function TSDM = The_steepest_descent_method(M,b,X0,epsilon) m = size(M);up = 1000;e = floor(abs(log(epsilon))); X(:,1) = X0; r(:,1) = b-M*X0; for k = 1:up alpha = Inner_product(r(:,k

求解线性方程组的三种基本迭代法

前言 在实际项目的一些矩阵运算模块中,往往需要对线性方程组进行求解以得到最终结果. 然而,你无法让计算机去使用克莱默法则或者高斯消元法这样的纯数学方法来进行求解. 计算机解决这个问题的方法是迭代法.本文将介绍三种最为经典的迭代法并用经典C++源代码实现之. 迭代法简介 从解的某个近似值出发,通过构造一个无穷序列去逼近精确解的方法. 雅克比迭代法 计算流程: 1. 初始化系数矩阵等计算环境 2. 设置精度控制和迭代次数控制变量 3. 采用如下式子进行迭代计算: 4. 循环执行 3,若(条件a)当前

汉若塔问题的迭代解法

先看递归解法,用Perl语言一分钟不到就写完了. sub hanno_recursive { my ($from, $to, $reserve, $n) =  @_; if (1 == $n) { print "move $n from $from to $to\n"; return; } hanno_recursive($from, $reserve, $to, $n -1); print "move $n from $from to $to\n"; hanno_