高斯消去、列主元消去、Lu分解、追赶法(matlab)


一、高斯消去法

在这里插入图片描述
在这里插入图片描述
比如对与上面的这个方程组,用消去法解方程组的基本思想是用逐次消
去未知数的方法把原方程组 Ax = b 化为与其等价的三角形方程组,而求解三角形方程组可用回代的方法.。
大体过程主要分为消去与回代
在这里插入图片描述

在这里插入图片描述

function solution =gaosi(A,b)
n = length(b);
for k=1:n-1
    for i=k+1:n
        mik=A(i,k)/A(k,k);%消元因子
        for j=k+1:n
            A(i,j)=A(i,j)-mik*A(k,j);
        end
        b(i)=b(i)-mik*b(k);
    end
end
solution(n)=b(n)/A(n,n);
for i=n-1:-1:1 
    for j=i+1:n
        solution(i)=solution(i)+A(i,j)*solution(j);
    end
    solution(i)=(b(i)-solution(i))/A(i,i);
end
end

python

import numpy as np
def gaosi(A,b):
    [n, m] = b.shape
    solution = np.zeros((n, m))

    for k in range(0,n-1):
        for i in range(k+1,n):
            mik=A[i,k]/A[k,k]
            for j in range(k+1,n):
                A[i,j]=A[i,j]-mik*A[k,j]
            b[i]=b[i]-mik*b[k]

    solution[n-1]=b[n-1]/A[n-1,n-1]
    for i in range(n-2,-1,-1):
        for j in range(i+1,n):
            solution[i]=solution[i]+A[i,j]*solution[j]
        solution[i]=(b[i]-solution[i])/A[i,i]
    return solution

A = np.array([[10,-7,0,1],[-3,2.099999,6,2],[5,-1,5,-1],[2,1,0,2]])
b = np.array([[8],[5.900001],[5],[1]])
print(gaosi(A,b))

二、高斯列主元消去法

基于高斯消去法的改进,当列主元出现数值较小时,在消去的过程列主元会作为分母,导致误差的出现。基于此,列主元消去是将每一次的主元通过行互换,用绝对值最大的列主元进行消去

function solution = liezhuyuan(A,b)
n = length(b);
for k=1:n-1
    [value position]=max(abs(A(k:n,k))); %主元所在位置和主元的值
    if position~=1  %a(k,k)不是绝对值最大的,换位置
        a_k_position=A(k,k:n);
        b_k_position=b(k);
        A(k,k:n)=A(position+k-1,k:n);
        A(position+k-1,k:n)=a_k_position;
        b(k)=b(position+k-1);
        b(position+k-1)=b_k_position;
    end
  % 后面消元
    for i=k+1:n
        mik=A(i,k)/A(k,k);
        for j=k+1:n
            A(i,j)=A(i,j)-mik*A(k,j);
        end
        b(i)=b(i)-mik*b(k);
    end
end
solution(n)=b(n)/A(n,n);
for i=n-1:-1:1 
    for j=i+1:n
        solution(i)=solution(i)+A(i,j)*solution(j);
    end
    solution(i)=(b(i)-solution(i))/A(i,i);
end
end

三、Lu分解

在这里插入图片描述
在这里插入图片描述

function [x,y,L,U] = LUfenjie(A,b)
% 输入
% A = [2 1 5;4 1 12;-2 -4 5]
% b=[11;27;12]
% 输出
% x =
%      1    -1     2
% y =
% 
%     11     5     8 
% 注意L分解出的结果只有下三角,主对角线为1
% L =
% 
%      0     0
%      2     0
%     -1     3
% U =
%      2     1     5
%      0    -1     2
%      0     0     4
n = length(b);
U(1,:)=A(1,:);
L(2:n,1)=A(2:n,1)/U(1,1);
for k=2:n
  for j=k:n
      U(k,j)=A(k,j)-L(k,1:k-1)*U(1:k-1,j);
  end
  for i=k+1:n
      L(i,k)=(A(i,k)-L(i,1:k-1)*U(1:k-1,k))/U(k,k);
  end
end

y(1)=b(1);
for i=2:n

   y(i)=b(i)-L(i,1:i-1)*y(1:i-1)';
end

x(n)=y(n)/U(n,n);
for i=n-1:-1:1
  x(i)=(y(i)-U(i,i+1:n)*x(i+1:n)')/U(i,i);
end

四、追赶法

追赶法只有当矩阵为三对角矩阵时才能使用(形如这样的)在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

矩阵为三对角矩阵时 ,用a,b,c 存储。 a为下对角线元素,b为对角线,c为上对角线。

function x =zhuigan(a,b,c,f)
%a下三角列(前面加0),b为主对角线,c为上三角,f为右端向量
%a,b,c为行向量,f为列向量
%如输入a = [0 1 1 1]
% b=[4 4 4 4]
% c = [2 2 2]
% f=[1;2;3;4]
% zuigan(a,b,c,f)
%输出
% ans =
%     0.0488    0.4024    0.1707    0.9573
%rats(ans)=
% 2/41         33/82          7/41        157/164
n=length(f);
l(1)=b(1);
for i=1:n-1
u(i)=c(i)/l(i);
l(i+1)=b(i+1)-a(i+1)*u(i);
end
y(1)=f(1)/l(1);
for i=2:n
  y(i)=(f(i)-a(i)*y(i-1))/l(i);
end
x(n)=y(n);
for i=n-1:-1:1
  x(i)=y(i)-u(i)*x(i+1);
end

end
  • 10
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验一 列主元消去法 【实验内容】 1. 理解高斯顺序消去法; 2. 理解主元高斯消去法在求解精度上的优点; 3. 完成列主元消去法的程序; 4. 会用系统内置命令求解有唯一解的线性方程组; 【试验方法与步骤】 一 、 回答下面的问题 1. 什么是线性方程组直接解法和迭代解法,各自的特点和使用问题类型是什么? 2. LU 分解是直接解法还是迭代解法, L 、 U 矩阵的特点是什么,应用在哪些问题 中,请举例说明。 3. 给出一个舍入误差严重影响计算结果精度的例子,试着能否从多个角度说明产 生该问题的原因。 4. 迭代解法的收敛性有什么意义,收敛条件用什么判定? 5. 给出例子,并说 明迭代收敛的速度。 二 、 完成下列计算,写出代码 1. 用 crame 法则、用 LU 分解函数、逆矩阵函数分别完成 P35 例 3.2.1 2. 编写列主元消去法程序,完成 P35 例 3.2.1 和习题 3 第 2 题 3. 用雅克比、高斯 塞德尔和 SOR 迭代完成习题 3 第 13 题,进行收敛速度的比较 分析 第 2 页 共 13 页 【实验结果】 一、第一大题 1.线性方程组的解法 2.LU 分解法 1. LU 分解属于直接解法 2. L 矩阵特点:一个对角线上的元素全为1 的下三角矩阵(即单位下三角矩阵)。 3. U 矩阵特点:上三角矩阵 4. 应用:LU 分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式 解法 直接解法 迭代解法 定义 经过有限步算数运算,可求得方程组 的精确解的方法 用某种极限过程逐步逼近线性 方程组精确解的方法 特点 运算步骤有限、可得精确解 极限逼近思想 适用问 题类型 计算过程中没有舍入误差 向量值序列收敛于向量* x 即 *) ( limx x k k = → 举例    − = + = 3 20 26 5 2 8 x y x y    = − = = = = −    − = + = * 1 * 2 53 106 2, 1 3 20 26 50 20 80 y x x x y x y x y 即有精确解 ,所以 两式相加,得    − = + = 3 20 26 5 2 8 x y x y , 0,1,2,... 0.15 1.3 0.4 1.6 ( 1) ( ) ( 1) ( ) =     = − = − + + + k y x x y k k k k 改写为迭代公式 其结果不断逼近精确解 然后不断迭代, 取 0,得 1.6, -1.3, (0) (0) (1) (1) x = y = x = y = 第 3 页 共 13 页 3.舍入误差严重影响计算结果精度的例子 建立 dx的递推公式 x x I n n  + = 1 0 5 (教材第二页) 法1:      − = − = − 1 0 5 1 5 ln 6 ln n In n I I 法2: 由0  In  In − 1,得5In − 1  In +5In − 1  6In − 1      = − +    =  +    + =    − − − n I I I I n I n n I I n n n n n 5 1 5 1 0.0087301587 0.0087301587 2 1 ) 5 21 1 6 21 1 ( 5 1 6 1 0 1 5 1 20 20 将 1 带入上式,得 1 由于计算机只能存储有限位小数,所以在法1 中,随着n 的增大,其误差就会越来 越大,最后很大程度的偏向精确解;但是在法2 中尽管20 I 取得比较粗略,但是随着n 的增大,其误差随传播逐步缩小,所以其最后计算得到的结果是可靠的。 4.迭代解法的收敛性 迭代解法 的收敛性 意义 无线逼近精确解,便于在计算机上实现编程 收敛条件的 判定 向量值序列收敛于向量x * 即 * ( ) limx x k k = → 第 4 页 共 13 页 5.举例说明迭代收敛的速度 分别用雅可比迭代法(J)、高斯—塞德尔迭代法(G-S)、超松弛迭代法(SOR)计算方组 =            − − − − 0 1 4 1 4 1 4 1 0           3 2 1 x x x =   10 8 10 雅可比迭代 高斯—塞德尔迭代 次 数 X1 X2 X3 误差 次数 X1 X2 X3 误差 1 2.5000 2.0000 2.5000 2.1594954 1 2.5000 2.6250 3.1563 1.4570586 2 3.0000 3.2500 3.0000

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值