用克莱默法求解线性方程组
这个例子演示了在Julia编程语言中使用Kramer方法求解线性方程组的算法的实现。
导言
克莱默方法是什么?
克莱默法是一种求解线性代数方程组的方法,其中方程的数量与未知数的数量重合,并且系统的矩阵的行列式非零。 该方法基于行列式的计算,并允许您找到系统的唯一解决方案。
为什么需要它?
Kramer的方法很方便,因为它提供了求解系统的显式公式,非常适合理论分析。 然而,从实用的角度来看,由于需要计算一组决定因素,因此对于大型系统来说效率低下。
该方法用于需要获得解的精确分析表示或系统的维度较小的情况。
主要部分
安装和连接所需的软件包
import Pkg; Pkg.add("LinearAlgebra")
using LinearAlgebra
实现克莱默规则的函数
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
# 变量系数矩阵
A = [2 -1 5 1;
3 2 2 -6;
1 3 3 -1;
5 -2 -3 3]
# 免费术语的向量
b = [-3, -32, -47, 49]
我们调用函数并输出结果
println("用克莱默法求解线性方程组:")
@show cramersolve(A, b);
算法的分步说明:
第1步。 首先,考虑主矩阵的行列式 det(A). 这很重要,因为克莱默的方法仅在该行列式不为零时才适用。
第二步。 接下来,创建一个时间矩阵 B,其复制原始矩阵 A. 对于每个未知(, 等。)我们替换矩阵的相应列 A 在右边部分的向量上 b.
第三步。 之后,我们考虑所得修改矩阵的行列式 det(B) 我们把它除以主要决定因素。 det(A). 我们得到系统的根之一的值。
第四步。 这些步骤重复多次,因为有变量,导致一个完整的解决方案向量。
使用发电机的紧凑版本
您的函数的原始版本使用生成器设计,这使得它更紧凑。
# 编写函数的更紧凑的方法是通过生成器
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
请注意:这里是表达式 let ... end 创建一个本地作用域,允许您在循环内安全地修改矩阵的副本。 建筑工程 [expr for i in collection] -这是Julia语言中的数组生成器。
@show cramersolve_compact(A, b);
结论
我们已经考虑了使用Julia编程语言求解线性方程组的经典方法—Kramer方法的实现。 我们编写了自己的函数。 cramersolve,这使得在非简并性(系统的矩阵的行列式非零)的条件下找到方程组的唯一解成为可能。
这种方法有利于理解算法的本质,但在现实世界的问题中,特别是对于大矩阵(>1000×1000),使用更有效的方法,如LU分解或SVD。 尽管如此,克莱默规则的使用在教育和研究任务中是相关的,以获得解决方案的分析表示。
执行的结果表明实现工作正常,并为给定的方程组提供了解决方案。
该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Cramer's_rule )