5.2 用迹求特征多项式

文章目录

  • 特征多项式系数
  • python实现

  迹,英文为trace,是一个从矩阵到数域的映射。对于一个 n × n n\times n n×n的方阵来说,存在 n n n个迹函数,分别称为1阶迹,2阶迹……n阶迹。k阶迹的定义是矩阵的所有k阶主子式的和。这个定义难以用数学公式来表示,k阶迹的符号是 t r [ k ] ( A ) tr^{[k]}(A) tr[k](A)我就以求一个四阶矩阵的2阶迹为例子来说明下吧。
A = ( 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 ) t r [ 2 ] ( A ) = ∣ 1 5 2 6 ∣ + ∣ 1 9 3 11 ∣ + ∣ 1 13 4 16 ∣ + ∣ 6 10 7 11 ∣ + ∣ 6 14 8 16 ∣ + ∣ 11 15 12 16 ∣ = 80 A=\begin{pmatrix}1 & 5 & 9 & 13\\ 2 & 6 & 10 & 14\\ 3 & 7 & 11 & 15\\ 4 & 8 & 12 & 16\\ \end{pmatrix}\\ tr^{[2]}(A)\\= \begin{vmatrix}1 & 5\\ 2 & 6\\ \end{vmatrix}+ \begin{vmatrix}1 & 9\\ 3 & 11\\ \end{vmatrix}+ \begin{vmatrix}1 & 13\\ 4 & 16\\ \end{vmatrix}+\\ \begin{vmatrix}6 & 10\\ 7 & 11\\ \end{vmatrix}+ \begin{vmatrix}6 & 14\\ 8 & 16\\ \end{vmatrix}+ \begin{vmatrix}11 & 15\\ 12 & 16\\ \end{vmatrix}\\ =80 A= 12345678910111213141516 tr[2](A)= 1256 + 13911 + 141316 + 671011 + 681416 + 11121516 =80
  求迹特别麻烦,需要用到二项组合树算法或递归算法。
  特别注意:0阶迹被特别定义为1,就像0的阶乘定义为1一样。

特征多项式系数

  特征多项式的系数,假设次数为 k k k,那么系数就是 ( − 1 ) n − k t r [ n − k ] ( A ) (-1)^{n-k}tr^{[n-k]}(A) (1)nktr[nk](A),所以特征多项式就是:
Δ A ( λ ) = ∑ k = 0 n ( − 1 ) n − k t r [ n − k ] ( A ) λ k \Delta_A(\lambda)=\sum^n_{k=0}(-1)^{n-k}tr^{[n-k]}(A)\lambda^{k} ΔA(λ)=k=0n(1)nktr[nk](A)λk
  比如上述的矩阵的特征多项式就是:
A = ( 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 ) t r [ 0 ] ( A ) = 1 t r [ 1 ] ( A ) = 34 t r [ 2 ] ( A ) = 80 t r [ 3 ] ( A ) = 0 t r [ 4 ] ( A ) = 0 Δ A ( λ ) = λ 4 − 34 λ 3 + 80 λ 2 A= \begin{pmatrix}1 & 5 & 9 & 13\\ 2 & 6 & 10 & 14\\ 3 & 7 & 11 & 15\\ 4 & 8 & 12 & 16\\ \end{pmatrix}\\ tr^{ [0] } (A)= 1\\ tr^{ [1] } (A)= 34\\ tr^{ [2] } (A)= 80\\ tr^{ [3] } (A)= 0\\ tr^{ [4] } (A)= 0\\ \Delta_A(\lambda)=\lambda^4-34\lambda^3+80\lambda^2 A= 12345678910111213141516 tr[0](A)=1tr[1](A)=34tr[2](A)=80tr[3](A)=0tr[4](A)=0ΔA(λ)=λ434λ3+80λ2

python实现

  我贴的只是局部代码,完整代码在GIT上。

    def trace(self, k):
        if k == 0:
            return 1
        result = 0
        # 求k阶主子式,需要用到所有的组合
        n = len(self.__lines)
        indices = [i for i in range(n)]
        import com.youngthing.mathalgorithm.combinatorics.binomial_combination_tree as bct

        combinations = bct.combinations(indices, k)
        for combination in combinations:
            # 组成一个新矩阵

            # 比如1 3 5代表原矩阵的1,3,5行与1,3,5列
            sub_matrix = self.main_sub_matrix(combination)
            result += sub_matrix.determinant()
        return result

    def main_sub_matrix(self, combination):
        k = len(combination)
        array = [[0 for _ in range(k)] for _ in range(k)]
        # i 列
        for i in range(k):
            # i 行
            for j in range(k):
                array[i][j]= self.__lines[combination[i]][combination[j]]
        return Matrix(array)

    def characteristic_polynomial(self):
        n = len(self.__lines)
        from com.youngthing.mathalgorithm.interpolation.horner_polynominal import HornerPolynomial
        polynomial= [0 for _ in range(n+1)]
        for i in range(n+1):
            trace = self.trace(i)
            print("tr^{",f"[{i}]","}",f"({i})=",trace)
            polynomial[i] = (-1) ** i * trace
        return HornerPolynomial(polynomial)

你可能感兴趣的:(线性代数【更新中】,python,线性代数,开发语言)