Engee 文档
Notebook

用克莱默法求解线性方程组

这个例子演示了在Julia编程语言中使用Kramer方法求解线性方程组的算法的实现。

导言

克莱默方法是什么?

克莱默法是一种求解线性代数方程组的方法,其中方程的数量与未知数的数量重合,并且系统的矩阵的行列式非零。 该方法基于行列式的计算,并允许您找到系统的唯一解决方案。

为什么需要它?

Kramer的方法很方便,因为它提供了求解系统的显式公式,非常适合理论分析。 然而,从实用的角度来看,由于需要计算一组决定因素,因此对于大型系统来说效率低下。

该方法用于需要获得解的精确分析表示或系统的维度较小的情况。

主要部分

安装和连接所需的软件包

In [ ]:
import Pkg; Pkg.add("LinearAlgebra")
In [ ]:
using LinearAlgebra 

实现克莱默规则的函数

In [ ]:
function cramersolve(A::Matrix, b::Vector)
    # 我们计算系统的主要决定因素
    det_A = det(A)

    # 我们检查系统有一个单一的解决方案(行列式不等于0)
    if det_A  0
        error("系统没有单一的解决方案(行列式为零)")
    end

    # 创建一个数组,用于存储变量x1,x2,的解。..,xn
    solutions = Float64[]

    # 我们通过矩阵A的每一列
    for i in eachindex(b)
        # 复制原始系数矩阵
        B = copy(A)
        
        # 用b的自由项的向量替换第i列
        B[:, i] = b
        
        # 我们计算修改矩阵的行列式,并将其除以主行列式
        push!(solutions, det(B) / det_A)
    end
    
    # 返回接收到的变量值
    return solutions
end
Out[0]:
cramersolve (generic function with 1 method)
In [ ]:
# 变量系数矩阵
A = [2 -1  5  1;
     3  2  2 -6;
     1  3  3 -1;
     5 -2 -3  3]

# 免费术语的向量
b = [-3, -32, -47, 49]
Out[0]:
4-element Vector{Int64}:
  -3
 -32
 -47
  49

我们调用函数并输出结果

In [ ]:
println("用克莱默法求解线性方程组:")
@show cramersolve(A, b);
Решение системы линейных уравнений методом Крамера:
cramersolve(A, b) = [2.0, -11.999999999999998, -4.0, 1.0000000000000009]

算法的分步说明:

第1步。 首先,考虑主矩阵的行列式 det(A). 这很重要,因为克莱默的方法仅在该行列式不为零时才适用。

第二步。 接下来,创建一个时间矩阵 B,其复制原始矩阵 A. 对于每个未知(, 等。)我们替换矩阵的相应列 A 在右边部分的向量上 b.

第三步。 之后,我们考虑所得修改矩阵的行列式 det(B) 我们把它除以主要决定因素。 det(A). 我们得到系统的根之一的值。

第四步。 这些步骤重复多次,因为有变量,导致一个完整的解决方案向量。

使用发电机的紧凑版本

您的函数的原始版本使用生成器设计,这使得它更紧凑。

In [ ]:
# 编写函数的更紧凑的方法是通过生成器
function cramersolve_compact(A::Matrix, b::Vector)
    return [let B = copy(A); B[:, i] = b; det(B) end for i in eachindex(b)] ./ det(A)
end
Out[0]:
cramersolve_compact (generic function with 1 method)

请注意:这里是表达式 let ... end 创建一个本地作用域,允许您在循环内安全地修改矩阵的副本。 建筑工程 [expr for i in collection] -这是Julia语言中的数组生成器。

In [ ]:
@show cramersolve_compact(A, b);
cramersolve_compact(A, b) = [2.0, -11.999999999999998, -4.0, 1.0000000000000009]

结论

我们已经考虑了使用Julia编程语言求解线性方程组的经典方法—Kramer方法的实现。 我们编写了自己的函数。 cramersolve,这使得在非简并性(系统的矩阵的行列式非零)的条件下找到方程组的唯一解成为可能。

这种方法有利于理解算法的本质,但在现实世界的问题中,特别是对于大矩阵(>1000×1000),使用更有效的方法,如LU分解或SVD。 尽管如此,克莱默规则的使用在教育和研究任务中是相关的,以获得解决方案的分析表示。

执行的结果表明实现工作正常,并为给定的方程组提供了解决方案。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Cramer's_rule