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

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

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

1 克莱姆法则

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

1(34).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>usingLinearAlgebrajulia>A= [1-12 ; 123 ; 211]
3×3Array{Int64,2}:
1-12123211julia>D=det(A)
-12.0julia>B= [ -3 ; 4 ; -3 ]
3-elementArray{Int64,1}:
-34-3julia>Mx=deepcopy(A)
3×3Array{Int64,2}:
1-12123211julia>Mx[:,1] =B3-elementArray{Int64,1}:
-34-3julia>Mx3×3Array{Int64,2}:
-3-12423-311julia>Dx=det(Mx)
36.0julia>x=Dx/D-3.0julia>My=deepcopy(A)
3×3Array{Int64,2}:
1-12123211julia>My[:,2] =B3-elementArray{Int64,1}:
-34-3julia>My3×3Array{Int64,2}:
1-321432-31julia>y=det(My) /D2.0julia>Mz=deepcopy(A)
3×3Array{Int64,2}:
1-12123211julia>Mz[:,3] =B3-elementArray{Int64,1}:
-34-3julia>Mz3×3Array{Int64,2}:
1-1-312421-3julia>z=det(Mz) /D1.0julia>

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

julia>usingLinearAlgebrajulia>A= [1-12 ; 123 ; 211]
3×3Array{Int64,2}:
1-12123211julia>B= [ -3 ; 4 ; -3 ]
3-elementArray{Int64,1}:
-34-3julia>A\B3-elementArray{Float64,1}:
-3.02.01.0julia>

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

julia>usingLinearAlgebrajulia>A= [1-12 ; 123 ; 211]
3×3Array{Int64,2}:
1-12123211julia>A'3×3Adjoint{Int64,Array{Int64,2}}:
112-121231julia>inv(A)
3×3Array{Float64,2}:
0.0833333-0.250.583333-0.4166670.250.08333330.250.25-0.25julia>inv(A) *A3×3Array{Float64,2}:
1.01.11022e-160.00.01.05.55112e-170.00.01.0julia>A' * A3×3Array{Int64,2}:
6373657514#A+1julia>A .+13×3Array{Int64,2}:
203234322julia>dot(A,A)
26julia>ones(3,2)
3×2Array{Float64,2}:
1.01.01.01.01.01.0julia>zeros(3,2)
3×2Array{Float64,2}:
0.00.00.00.00.00.0julia>x=rand(5)
5-elementArray{Float64,1}:
0.090257887942457590.60311935961365840.62527828770916180.431051076364323160.3206800449549978julia> [2*x[i-1] +0.5*x[i] +0.25*x[i+1] fori=2:length(x)-1]
3-elementArray{Float64,1}:
0.63839502761903491.62664063217297851.5462521248392345julia>
相关文章
|
机器学习/深度学习 算法
专题六数值微积分与方程求解-2
专题六数值微积分与方程求解
113 0
|
算法 Serverless
专题六数值微积分与方程求解-1
专题六数值微积分与方程求解
125 0
罗尔(Rolle)、拉格朗日(Lagrange)和柯西(Cauchy)三大微分中值定理的定义
罗尔(Rolle)、拉格朗日(Lagrange)和柯西(Cauchy)三大微分中值定理的定义
罗尔(Rolle)、拉格朗日(Lagrange)和柯西(Cauchy)三大微分中值定理的定义
|
算法
秒懂算法 | 递推方程求解方法
时间复杂度和空间复杂度表示为递推方程的两种求解方法。
408 1
秒懂算法 | 递推方程求解方法
数学|如何求解线性方程系数?
数学|如何求解线性方程系数?
182 0
|
机器学习/深度学习 Python
(公式)用欧拉公式推导三角函数恒等式
(公式)用欧拉公式推导三角函数恒等式
254 0
(公式)用欧拉公式推导三角函数恒等式
|
缓存 算法 C++
Julia:如何调试微分方程求解问题
这篇文章是 Chris Rackauckas 的帖子的翻译和总结,但是并不按照原文完全翻译,有个人的取舍。
180 0
|
算法
算法题每日一练---第52天:位运算求解子集
给你一个整数数组 nums ,数组中的元素 互不相同 。
125 0
算法题每日一练---第52天:位运算求解子集
线性化微分数学解释Einstein狭义相对论质能方程E=MC^2
线性化微分数学解释Einstein狭义相对论质能方程E=MC^2 要理解爱因斯坦在狭义相对论中的质能方程是如何推导出来的,需要先了解数学中的微分方程及其线性化方程的知识。
1214 0