线性方程组的解法

文章目录

线性方程组的解法

看到以下线性方程组的一般形式:设有以下的 n n n阶线性方程组:

A x = b \mathbf{Ax}=\mathbf{b} Ax=b

求解线性方程组的方法可以分为两类:直接法迭代法

  • 直接法是指假设计算中不产生舍入误差,结果有限次的运算可以得到方程组的精确解的方法,主要用于解低阶稠密矩阵
  • 迭代法是一种通过构造迭代序列逐步逼近方程组精确解的方法。它将求解方程组的问题转化为一个迭代格式,从一个初始近似解出发,按照一定的迭代公式反复计算,得到一系列近似解,当迭代次数足够多时,这些近似解逐渐收敛到方程组的精确解。迭代法主要用于解高阶稀疏矩阵方程组,因为对于高阶稀疏矩阵,直接法可能会面临计算量过大、存储需求过高的问题,而迭代法可以利用矩阵的稀疏性,减少计算量和存储空间。

认识一些基本的矩阵函数

函数 功能
rank ( A ) \texttt{rank}(\mathbf{A}) rank(A) 求 A \mathbf{A} A的秩,即 A \mathbf{A} A中线性无关的行数和列数
det ( A ) \texttt{det}(\mathbf{A}) det(A) 求 A \mathbf{A} A的行列式
inv ( A ) \texttt{inv}(\mathbf{A}) inv(A) 求 A \mathbf{A} A的逆矩阵,若 A \mathbf{A} A近似奇异,会抛出错误
pinv ( A ) \texttt{pinv}(\mathbf{A}) pinv(A) 求 A \mathbf{A} A的伪逆
trace ( A ) \texttt{trace}(\mathbf{A}) trace(A) 求 A \mathbf{A} A的迹,即对角线元素和

MATLAB 实现

在 M A T L A B MATLAB MATLAB中,使用运算符\直接求解线性系统,该运算符功能强大,具有智能性。

matlab 复制代码
x=A\b  %求解线性系统 Ax=b
X=A\B  %求解系统:AX=B
  1. 直接解法

问题
{ x 1 + 3 x 2 − 3 x 3 − x 4 = 1 3 x 1 − 6 x 2 − 3 x 3 + 4 x 4 = 4 x 1 + 5 x 2 − 9 x 3 − 8 x 4 = 0 \begin{cases} x_1 + 3x_2 - 3x_3 - x_4&= 1 \\ 3x_1 - 6x_2 - 3x_3 + 4x_4 &= 4\\ x_1 + 5x_2 - 9x_3 - 8x_4 &= 0 \end{cases} ⎩ ⎨ ⎧x1+3x2−3x3−x43x1−6x2−3x3+4x4x1+5x2−9x3−8x4=1=4=0

matlab 复制代码
A=[1,3,-3,-1;3,-6,-3,4;1,5,-9,-8];
B=[1,4,0]';
X=A\B
  1. 逆矩阵:

注意这种方法首先要看一下 A \mathbf{A} A是不是方阵。

matlab 复制代码
x=A^-1*b
x=inv(A)*b

问题
{ x 1 + 2 x 2 = − 1 3 x 1 + 4 x 2 = − 1 \begin{cases} x_1 + 2x_2&= -1 \\ 3x_1+4x_2 &=-1 \end{cases} {x1+2x23x1+4x2=−1=−1

matlab 复制代码
A=[1,2;3,4];b=[-1;-1];
 x=A^-1*b
  1. L U LU LU分解
matlab 复制代码
[L U]=lu(A)
X=U\(L\B)

问题
{ 4 x 1 + 2 x 2 − x 3 = 2 3 x 1 − x 2 + 2 x 3 = 10 11 x 1 + 3 x 2 + x 3 = 8 \left\{ \begin{array}{c} 4x_1+2x_2-x_3=2\\ 3x_1-x_2+2x_3=10\\ 11x_1+3x_2+x_3=8\\ \end{array} \right. ⎩ ⎨ ⎧4x1+2x2−x3=23x1−x2+2x3=1011x1+3x2+x3=8

matlab 复制代码
>> A=[4 2 -1;3 -1 2; 11 3 1];
>> B=[2 10 8]';
>> D=det(A)

D =

  -10.0000

>> [L U]=lu(A)

L =

    0.3636   -0.5000    1.0000
    0.2727    1.0000         0
    1.0000         0         0


U =

   11.0000    3.0000    1.0000
         0   -1.8182    1.7273
         0         0   -0.5000

>> X=U\(L\B)

X =

    4.0000
  -10.0000
   -6.0000

机电工程学院教学函数构造

1.高斯消元法

代码模板

matlab 复制代码
function x = pureGaussianElimination(A, b)
    % 获取矩阵 A 的行数
    n = size(A, 1);
    % 构建增广矩阵 [A, b]
    augmentedMatrix = [A, b];

    % 前向消元过程
    for k = 1:n - 1
        for i = k + 1:n
            % 计算消元因子
            factor = augmentedMatrix(i, k) / augmentedMatrix(k, k);
            % 消去第 i 行第 k 列的元素
            augmentedMatrix(i, k:end) = augmentedMatrix(i, k:end) - factor * augmentedMatrix(k, k:end);
        end
    end

    % 回代求解
    x = zeros(n, 1);
    x(n) = augmentedMatrix(n, end) / augmentedMatrix(n, n);
    for i = n - 1:-1:1
        x(i) = (augmentedMatrix(i, end) - augmentedMatrix(i, i + 1:n) * x(i + 1:n)) / augmentedMatrix(i, i);
    end
end
    
2.列主元消去法

代码模板

matlab 复制代码
function x = gaussianElimination(A, b)
    % 获取矩阵 A 的行数和列数
    [n, m] = size(A);
    % 构建增广矩阵 [A, b]
    augmentedMatrix = [A, b];

    % 前向消元过程
    for k = 1:n-1
        % 选主元
        [~, pivotIndex] = max(abs(augmentedMatrix(k:n, k)));
        pivotIndex = pivotIndex + k - 1;
        % 交换行
        if pivotIndex ~= k
            temp = augmentedMatrix(k, :);
            augmentedMatrix(k, :) = augmentedMatrix(pivotIndex, :);
            augmentedMatrix(pivotIndex, :) = temp;
        end
        % 消元
        for i = k+1:n
            factor = augmentedMatrix(i, k) / augmentedMatrix(k, k);
            augmentedMatrix(i, k:end) = augmentedMatrix(i, k:end) - factor * augmentedMatrix(k, k:end);
        end
    end

    % 回代求解
    x = zeros(n, 1);
    x(n) = augmentedMatrix(n, end) / augmentedMatrix(n, n);
    for i = n-1:-1:1
        x(i) = (augmentedMatrix(i, end) - augmentedMatrix(i, i+1:n) * x(i+1:n)) / augmentedMatrix(i, i);
    end
end
    
3. L U LU LU分解法

代码模板

matlab 复制代码
function x = luDecomposition(A, b)
    % 获取矩阵 A 的行数
    n = size(A, 1);
    % 初始化 L 为单位矩阵,U 为 A
    L = eye(n);
    U = A;

    % LU 分解过程
    for k = 1:n - 1
        for i = k + 1:n
            % 计算 L 矩阵的元素
            L(i, k) = U(i, k) / U(k, k);
            % 更新 U 矩阵
            U(i, k:end) = U(i, k:end) - L(i, k) * U(k, k:end);
        end
    end

    % 求解 Ly = b
    y = zeros(n, 1);
    for i = 1:n
        y(i) = (b(i) - L(i, 1:i - 1) * y(1:i - 1)) / L(i, i);
    end

    % 求解 Ux = yfunction x = GaussianElimination(A, b)
    % 获取矩阵 A 的行数
    n = size(A, 1);
    % 构建增广矩阵 [A, b]
    augmentedMatrix = [A, b];

    % 前向消元过程
    for k = 1:n - 1
        for i = k + 1:n
            % 计算消元因子
            factor = augmentedMatrix(i, k) / augmentedMatrix(k, k);
            % 消去第 i 行第 k 列的元素
            augmentedMatrix(i, k:end) = augmentedMatrix(i, k:end) - factor * augmentedMatrix(k, k:end);
        end
    end

    % 回代求解
    x = zeros(n, 1);
    x(n) = augmentedMatrix(n, end) / augmentedMatrix(n, n);
    for i = n - 1:-1:1
        x(i) = (augmentedMatrix(i, end) - augmentedMatrix(i, i + 1:n) * x(i + 1:n)) / augmentedMatrix(i, i);
    end
end
    x = zeros(n, 1);
    for i = n:-1:1
        x(i) = (y(i) - U(i, i + 1:n) * x(i + 1:n)) / U(i, i);
    end
end
    
相关推荐
uhakadotcom17 分钟前
拟牛顿算法入门:用简单方法快速找到函数最优解
算法·面试·github
老马啸西风34 分钟前
Neo4j GDS-09-neo4j GDS 库中路径搜索算法实现
网络·数据库·算法·云原生·中间件·neo4j·图数据库
the sun341 小时前
数据结构---跳表
数据结构
小黑屋的黑小子1 小时前
【数据结构】反射、枚举以及lambda表达式
数据结构·面试·枚举·lambda表达式·反射机制
LJianK11 小时前
array和list在sql中的foreach写法
数据结构·sql·list
xiongmaodaxia_z71 小时前
python每日一练
开发语言·python·算法
邪恶的贝利亚1 小时前
从红黑树到哈希表:原理对比与典型场景应用解析(分布式以及布隆过滤器)
数据结构·分布式·散列表
zy_destiny2 小时前
【非机动车检测】用YOLOv8实现非机动车及驾驶人佩戴安全帽检测
人工智能·python·算法·yolo·机器学习·安全帽·非机动车
rigidwill6662 小时前
LeetCode hot 100—搜索二维矩阵
数据结构·c++·算法·leetcode·矩阵