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

  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_end = zeros(m,1);k_end = 0;e = floor(abs(log(epsilon)));
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
B = (D-L)\U;
f = (D-L)\b;
for k = 1:ub-1
    X(:,k+1) = B*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
GSIM = [X(:,k)‘];
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 = Gauss_Seidel_iterative_method(M,b,X0,epsilon)
M\b

  

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

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

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

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

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

线性方程组的迭代解法

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

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

迭代法 对于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

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

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(ep

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

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

汉若塔问题的迭代解法

先看递归解法,用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_

[LeetCode系列]爬梯问题的递归解法转换为迭代解法

有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少) 本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第n-2个元素的和, 与本题的要求完全相同). 递归解法: 1 int climbStairs(int n) { 2 if (n < 3) return n; 3 return climbStairs(n-1) + climbStairs(n-2); 4 } 思路很清晰, 递归到当前阶数小于3阶时返回