Julia实现克莱姆法则求解线性方程组

举报
jackwangcumt 发表于 2021/07/29 22:24:09 2021/07/29
【摘要】 在实际应用中,有时候我们需要求解一组方程。一般来说,基于线性方程组的解空间理论,线性方程组有唯一解当且仅当有效方程数等于未知数的个数。这时,可以运用多种方法来求出唯一的解。而克莱姆法则(Cramer's Rule)就是一种求解线性方程组的方法。利用Julia可以非常方便的求解方程组的解,只需3行代码。

      在实际应用中,有时候我们需要求解一组方程。一般来说,基于线性方程组的解空间理论,线性方程组有唯一解当且仅当有效方程数等于未知数的个数。这时,可以运用多种方法来求出唯一的解。而克莱姆法则(Cramer's Rule)就是一种求解线性方程组的方法。

1 克莱姆法则

      针对一个方程组,首先把它的系数改写成一个行列式,并判断它的值是否为0,如果为0,则不适用于此规则,否则则说明这个线性方程线有解,可以使用克莱姆法则法则。下面给出一个三元方程组的示例,用于描述克莱姆法则的解题过程:

1.jpg
此图来自网站: http://www.saddlebackmath.com/home/cramer-s-rule

以上述方程组为例,首先需要将方程组按照变量进行对齐,即x的放于前,y放中间,z放后。然后将变量的系数改写成一个矩阵A,同时将方程组的值写成一个矩阵B。首先,求出系数的行列式值,用D= det(A)进行求解。其次求x的值时,D1行列式由系数矩阵A的第一列替换为矩阵B的第一列,然后求行列式值,即Dx= det(M1),即x = Dx / D即可。同理,求y的值,首先需要将系数矩阵A的第二列替换为矩阵B的第一列,然后求行列式值Dy。

2 克莱姆法则Julia实现

      根据百度百科,Julia语言是一个面向科学计算的高性能动态高级程序设计语言,其语法与其他科学计算语言相似。在许多情况下拥有能与编译型语言相媲美的性能。Julia 是个灵活的动态语言,适合科学和数值计算。关于线程代数的知识,可以参考官网: https://docs.julialang.org/en/v1/stdlib/LinearAlgebra

     Julia语言在矩阵的操作上,非常方便,下面给出上述示例的具体代码实现:

julia> using LinearAlgebra

julia> A = [1 -1 2 ; 1 2 3 ; 2 1 1]
3×3 Array{Int64,2}:
 1  -1  2
 1   2  3
 2   1  1

julia> D = det(A)
-12.0

julia> B = [ -3 ; 4 ; -3 ]
3-element Array{Int64,1}:
 -3
  4
 -3

julia> Mx = deepcopy(A)
3×3 Array{Int64,2}:
 1  -1  2
 1   2  3
 2   1  1

julia> Mx[:,1] = B
3-element Array{Int64,1}:
 -3
  4
 -3

julia> Mx
3×3 Array{Int64,2}:
 -3  -1  2
  4   2  3
 -3   1  1

julia> Dx = det(Mx)
36.0

julia> x = Dx / D
-3.0

julia> My = deepcopy(A)
3×3 Array{Int64,2}:
 1  -1  2
 1   2  3
 2   1  1

julia> My[:,2] = B
3-element Array{Int64,1}:
 -3
  4
 -3

julia> My
3×3 Array{Int64,2}:
 1  -3  2
 1   4  3
 2  -3  1

julia> y = det(My) / D
2.0

julia> Mz = deepcopy(A)
3×3 Array{Int64,2}:
 1  -1  2
 1   2  3
 2   1  1

julia> Mz[:,3] = B
3-element Array{Int64,1}:
 -3
  4
 -3

julia> Mz
3×3 Array{Int64,2}:
 1  -1  -3
 1   2   4
 2   1  -3

julia> z = det(Mz) / D
1.0

julia>  

 由此可见,求出的方程解与示例一致。其实,利用Julia语言,我们可以直接进行方程组求解,示例如下:

julia> using LinearAlgebra

julia> A = [1 -1 2 ; 1 2 3 ; 2 1 1]
3×3 Array{Int64,2}:
 1  -1  2
 1   2  3
 2   1  1

julia> B = [ -3 ; 4 ; -3 ]
3-element Array{Int64,1}:
 -3
  4
 -3

julia> A \ B
3-element Array{Float64,1}:
 -3.0
  2.0
  1.0

julia>   

最后,需要说的就是,还有很多其他的矩阵操作,比如转置,求逆矩阵,矩阵乘法等等。示例如下:

julia> using LinearAlgebra

julia> A = [1 -1 2 ; 1 2 3 ; 2 1 1]
3×3 Array{Int64,2}:
 1  -1  2
 1   2  3
 2   1  1

julia> A'
3×3 Adjoint{Int64,Array{Int64,2}}:
  1  1  2
 -1  2  1
  2  3  1

julia> inv(A)
3×3 Array{Float64,2}:
  0.0833333  -0.25   0.583333
 -0.416667    0.25   0.0833333
  0.25        0.25  -0.25

julia> inv(A) * A
3×3 Array{Float64,2}:
 1.0  1.11022e-16  0.0
 0.0  1.0          5.55112e-17
 0.0  0.0          1.0

julia> A' * A
3×3 Array{Int64,2}:
 6  3   7
 3  6   5
 7  5  14

#不是 A + 1
julia> A .+ 1
3×3 Array{Int64,2}:
 2  0  3
 2  3  4
 3  2  2

julia> dot(A,A)
26

julia> ones(3,2)
3×2 Array{Float64,2}:
 1.0  1.0
 1.0  1.0
 1.0  1.0

julia> zeros(3,2)
3×2 Array{Float64,2}:
 0.0  0.0
 0.0  0.0
 0.0  0.0

julia> x = rand(5)
5-element Array{Float64,1}:
 0.09025788794245759
 0.6031193596136584
 0.6252782877091618
 0.43105107636432316
 0.3206800449549978

julia> [2*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1]
3-element Array{Float64,1}:
 0.6383950276190349
 1.6266406321729785
 1.5462521248392345

julia>   





【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。