zoukankan      html  css  js  c++  java
  • Python:使用Numpy解决线性代数问题

    常见的矩阵操作,矩阵转置、逆矩阵、伴随矩阵、方阵的迹、行列式、范数

    # -*- coding: utf-8 -*-
    """
    Created on Mon Oct  8 16:02:57 2018
    Python 3.6
    scipy 1.1.0
    @author: hanzi5
    """
    import numpy as np
    import scipy as sc
    from scipy import linalg
    
    #A=np.mat([[4,-2],[3,-1]])
    A=np.mat([[4,2,-5],[6,4,-9],[5,3,-7]],dtype=int)
    
    A.A # 返回自身数据的2维数组的一个视图(没有做任何的拷贝);矩阵->数组变换
    A.T # 返回自身的转置
    A.H # 返回自身的共轭转置,实数等同于T
    A.I # 返回自身的逆矩阵
    B=np.linalg.inv(A) # 返回自身的逆矩阵(np中的函数)
    A_abs=np.linalg.det(np.round(A)) #使用linalg.det求得方阵的行列式
    A_bansui=B*A_abs # 求A矩阵的伴随矩阵
    
    A.trace() #计算A的迹,方阵的迹就是主对角元素之和
    np.linalg.det(A) #返回的是矩阵a的行列式
    np.linalg.norm(A,ord=None) #计算矩阵a的范数
    np.linalg.eig(A) #矩阵a的特征值和特征向量
    np.linalg.cond(A,p=None) #矩阵a的条件数
    np.linalg.inv(A) #矩阵a的逆矩阵
    np.linalg.matrix_rank(A) #矩阵的秩,矩阵排除线性相关后不为0的行
    

    求解矩阵的特征值及特种向量,检测计算结果是否正确

    # 矩阵的特征值及特征向量求解
    x = np.diag((1, 2, 3))#创建一个对角矩阵!
    a,b = np.linalg.eig(x)#特征值保存在a中,特征向量保存在b中
    np.linalg.eigvals(A) # 特征值
    
    #根据公式 Ax = λx 检验特征值与特征向量是否正确:
    for i in range(3):#方法一
        if np.allclose(np.dot(a[i], b[:, i]), x[:, i]):#np.allclose()
            print( 'Right')
        else:
            print( 'Error')
    
    for i in range(3):#方法二
        if (np.dot(a[i], b[:, i]) == x[:, i]).all():
            print( 'Right')
        else:
            print( 'Error')
    
    # 矩阵LU分解
    l,u = sc.linalg.lu(A,True)
    

    矩阵常见的加减乘除操作(matrix和array对比)

    # 矩阵加减乘除
    A = np.mat([[1, 2, 3], [3, 4, 5], [6, 7, 8]])#使用mat函数
    B = np.mat([[5, 4, 2], [1, 7, 9], [0, 4, 5]])
    C = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]])
    D = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])
    # 矩阵的加法运算
    A+B
    C+D
    
    # 矩阵的减法运算
    A-B
    C-D
    
    # 矩阵乘法
    A*B #matrix类型可以直接相乘
    np.dot(C, D) # array类型不能用直接相乘,需要用函数
    
    # 矩阵除法,A/B=A*(B')
    A*B.I
    A*np.linalg.inv(B)
    
    

    矩阵转置的一些特性验证

    # 验证矩阵转置的性质:(A±B)'=A'±B'
    (A + B).T
    A.T + B.T
    
    #验证矩阵转置的性质:(KA)'=KA'
    10 * (A.T)
    (10 * A).T
    
    #验证矩阵转置的性质:(A×B)'= B'×A'
    (A*B).T
    B.T*A.T
    

    矩阵是否是正定矩阵判断

    #判断正定矩阵##############################################################
    '''设M是n阶方阵,如果对任何非零向量z,都有z'Mz> 0,其中z' 表示z的转置,就称M正定矩阵。
    判定定理1:对称阵A为正定的充分必要条件是:A的特征值全为正。
    判定定理2:对称阵A为正定的充分必要条件是:A的各阶顺序主子式都为正。
    判定定理3:任意阵A为正定的充分必要条件是:A合同于单位阵。
    下面用定理1判断对称阵是否为正定阵'''
    A = np.arange(16).reshape(4, 4)
    A = A + A.T #将方阵转换成对称阵
    B = np.linalg.eigvals(A)#求A的特征值,结果存储到B中,注意:eig()是求特征值特征向量
    if np.all(B>0):             #判断是不是所有的特征值都大于0,用到了all函数,显然对称阵A不是正定的
        print( 'Yes')
    else:
        print('No')
    
    # 创建一个对角元素都为正的对角阵,它一定是正定的:
    A = np.diag((1, 2, 3))#创建对角阵,其特征值都为正
    B = np.linalg.eigvals(A)#求特征值
    if np.all(B>0):             #判断是不是所有的特征值都大于0,用到了all函数,显然对称阵A不是正定的
        print( 'Yes')
    else:
        print('No')
    

    参考资料:
    1、Python–线性代数篇
    2、透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵

  • 相关阅读:
    react项目如何调试?
    react使用引入svg的icon;svg图形制作
    react使用echarts
    SQL SEVER数据库重建索引的方法
    ThreadLocal的内存泄露
    ThreadLocal是否会引发内存泄露的分析 good
    深入分析 ThreadLocal 内存泄漏问题
    清理ThreadLocal
    线程池 Threadlocal 使用注意
    ThreadLocal对象使用过程中容易陷入的坑
  • 原文地址:https://www.cnblogs.com/hanzi5/p/10105625.html
Copyright © 2011-2022 走看看