行列とラプラス展開定理を使用して多変量線形方程式を解く

1 はじめに

いくつかの中学校と話をして、数学の調子はどうなのか聞いてみました。関数とは何ですか? 関数は中学生にとって非常に重要なファーストコンタクトなので、初めて触れると少し戸惑うこともあると思いますが、中学生の皆さんには、違和感を感じずに早く慣れてもらいたいと思っています。怖がった。

定義によれば、関数は、ある量が変化するときの別の量の変化を指し、領域 A、値の範囲 B、および対応する法則 f の 3 つの要素が含まれます

もちろん、これらの定義について混乱する前に、丸暗記しないでくださいとお願いしたので、煮魚や蒸し魚にできる魚を買うようなよくあるたとえをしました。調理方法は機能であり、つまり、調理が異なれば機能も異なり、結果も異なります。
中学から二変数一次方程式と三変数一次方程式を習い始めたので、もう少し分かりやすく言うと、まだ混乱しているのを見て、方程式をそのまま関数として扱ってもらいました。

次に、連立方程式を解くことができるかどうかを尋ねられました。消去法で解けるので、4変数の連立一次方程式、10変数の連立一次方程式、さらには100変数の連立一次方程式が解けるかを尋ねました。 、彼らは複雑な気持ちになった。

2. 単位行列

そこで、これらの問題に対して、中学生の行列解法を通して数学の面白さを理解し、知識を広げてもらうために、次のような絵を特別に作りました。 

多変量線形方程式系を解くことは線形代数に属します. これも以前の記事で紹介しました. 以下を確認できます: 線形代数の関連計算 (numpy).
3 次元線形方程式系を見てみましょう.線形代数以下を処理するためにnumpy:

M=np.mat('1 1 1;0 2 -4;3 2 -6')
A=np.array([0,6,8])
print(np.round(np.linalg.solve(M,A)))
#[ 0.  1. -1.]

したがって、解はx=0, y=1, z=-1です。検証できます: 係数行列 M と未知数の解をドット積演算すると、結果は A になるはずです (方程式系)

print(np.array(np.dot(M,[0,1, -1])).flatten())
#[0 6 8]
M=np.mat('1 -2 1;0 2 -8;-4 5 9')
'''
matrix([[ 1, -2,  1],
        [ 0,  2, -8],
        [-4,  5,  9]])
'''
A=np.array([0,8,-9])
print(np.linalg.solve(M,A))
#[29. 16.  3.]

したがって、解はx=29, y=16, z=3 になりますので、
同様に検証してみましょう。

print(np.array(np.dot(M,[29,16,3])).flatten())#[ 0  8 -9]

3. ラプラス展開

ラプラス展開を使用して、一次方程式の解を見つけることもできます。ここでは、いくつかの知識ポイント、余因子、およびラプラス展開を示します。これは百度百科事典からの写真です:

実はこのように理解することができ、要素が配置されている行と列を消去法音楽のように消去していき、残ったものが剰余式となり、その式に従って計算が行われるのです。

import copy
#系数矩阵
#余子式:在n阶行列式中,把所在的第i行与第j列划去后,所留下来的n-1阶行列式
def get_minor(j, matrix):
    result = []
    for row in range(len(matrix)):
        if row == 0:
            continue
        temp = []
        for col in range(len(matrix)):
            if col == j:
                continue
            temp.append(matrix[row][col])
        result.append(temp)
    return result


#拉普拉斯展开定理,递归求解行列式的值
def laplace_expansion(matrix):
    if len(matrix) == 2:
        return matrix[1][1] * matrix[0][0] - matrix[1][0] * matrix[0][1]
    elif len(matrix) > 2:
        result = 0
        for i in range(len(matrix)):
            minor_item = get_minor(i, matrix)
            #print(minor_item)
            result += (matrix[0][i] * ((-1) ** i) * laplace_expansion(minor_item))
        return result

#将常数列(等号右边的数)加入进来
def replace(i, a, b):
    dim = len(a)
    result = copy.deepcopy(a)
    for j in range(dim):
        result[j][i] = b[j]
    return result


if __name__ == "__main__":
    A = [[1,1,1],[0,2,-4],[3,2,-6]]
    B = [0,6,8]

    A = [[1,-2,1],[0,2,-8],[-4,5,9]]
    B = [0,8,-9]

    #A = [[1,2,2,3],[0,-2,3,1],[0,2,-1,2],[1,4,2,4]]
    #B = [6,9,10,-2]

    result = []
    c = laplace_expansion(A)
    #print(c)
    if c == 0:print("没有解")
    else:
        for i in range(len(A)):
            m = replace(i,A,B)
            print(m)
            result.append(laplace_expansion(m)/c)
            #print(result)
        print(result)

おすすめ

転載: blog.csdn.net/weixin_41896770/article/details/133231249