Python numpy库的应用(矩阵、多项式)

复制以下的代码,选择运行的函数,验证有关矩阵、多项式的操作。
相关参考:Python语言程序设计(上海交通大学出版社 赵璐主编)<<----传送门
原谅我没有找到电子版,不然一定爬下来

准备工作:恶补一下矩阵相关内容,高中课本
在这里插入图片描述
解释和输出都在注释中

# -*- coding: utf-8 -*-
import numpy as np


# 线性代数的应用-----------------------------------------------------------------------------------
def linearAlgebra():
    """
    linalg.det()            计算行列式

    linalg.inv()            计算逆矩阵

    linalg.solve()          多元一次方程组求根

    linalg.eig()            返回特征值和特征向量构成的元组

    linalg.eigvals()        计算特征值

    linalg.svd()            矩阵的奇异值分解

    linalg.pinv()           广义逆矩阵

    """

    Array1 = np.arange(6).reshape((2, 3))
    Array2 = np.arange(6).reshape((3, 2))
    print(Array1.dot(Array2))  # 矩阵内积
    # [[0 1 2]
    #  [3 4 5]]

    Array3 = np.arange(4).reshape((2, 2))
    detArray3 = np.linalg.det(Array3)  # 计算行列式
    print(detArray3)  # -2.0

    invArray3 = np.linalg.inv(Array3)  # 计算逆矩阵
    print(invArray3)
    # [[-1.5  0.5]
    #  [1.    0.]]

    eyeArray = Array3.dot(invArray3)  # 互逆矩阵内积运算,验证结果
    print(eyeArray)
    # [[1. 0.]
    #  [0. 1.]]

    Array4 = np.array([[-1, 0], [0, 1]])
    eigenvalues, eigenvectors = np.linalg.eig(Array4)  # 计算特征值和特征向量
    print(eigenvalues)  # 特征值构成的数组,[-1.  1.]

    print(eigenvectors)  # 特征向量构成的数组
    # [[1. 0.]
    #  [0. 1.]]

    # 验证特征值和特征向量,满足:Aα=λα
    # 其中A是n阶方阵,λ是特征值,非零向量α是矩阵A属于特征值λ的特征向量
    print(Array4.dot(eigenvectors[0]) ==
          eigenvalues[0]*eigenvectors[0])  # [ True  True]
    print(Array4.dot(eigenvectors[1]) ==
          eigenvalues[1]*eigenvectors[1])  # [ True  True]

    # 在线性代数中,矩阵可以对向量进行线性变换,这对数学中的线性方程组。
    # numpy.linalg中的sovle()函数可以求解形如Ax=b的线性方程组,其中A为
    # 系数矩阵,b为一维或二维的数组,x是未知量
    # 如求解鸡兔同笼问题:上有35头,下有94足,求鸡兔个数

    heads, foots = 35, 94
    A = np.array([[1, 1], [2, 4]])  # 方程组的系数矩阵
    b = np.array([heads, foots])  # 方程组右侧的常数矩阵
    X = np.linalg.solve(A, b)  # sovle()函数返回方程组的解
    print('鸡:{},兔:{}'.format(X[0], X[1]))  # 鸡:23.0,兔:12.0


# 多项式的应用-------------------------------------------------------------------------------------------
def polynomial():
    """  
    poly1d(A)               利用系数数组A生成多项式

    polyval(p,k)            求多项式p在x=k时的值

    polyder(p,m=1)          求多项式p的m阶导数,m默认值为1

    polyint(p,m=1)          求多项式p的m重积分,m默认值为1

    polyadd(p1,p2)          多项式求和,等价于p1+p2

    polysub(p1,p2)          多项式求差p1-p2

    polymul(p1,p2)          多项式求积p1*p2

    polydiv(p1,p2)          多项式求商p1/p2,结果为商和余数构成的元组,商和余数都用多项式表示

    polyfit(x,y,k)          多项式拟合,x,y分别为要拟合的两组数据,k为拟合多项式中最高次幂

    """

    A = np.array([1, 0, -2, 1])  # 系数数组,没有出现的系数项用0补齐
    f = np.poly1d(A)
    print(f)  # 输出多项式f的数学表达式
    #     3
    # 1 x - 2 x + 1
    print(type(f))  # <class 'numpy.poly1d'>
    print(f(1))  # 当x=1时,输出多项式的值  0
    print(f(2))  # 5
    print(f([1, 2]))  # [0,5]

    print(np.polyval(f, 1))  # 当x=1时,输出多项式的值  0
    print(np.polyval(f, 2))  # 5
    print(np.polyval(f, [1, 2]))  # [0,5]

    fder1 = np.polyder(f)  # 求多项式f的一阶导数
    print(fder1)
    #     2
    # 3 x - 2
    fder2 = np.polyder(f, 2)  # 求多项式f的二阶导数
    print(fder2)  # 6 x

    fint1 = np.polyint(f)  # 求多项式f的一重积分
    print(fint1)
    #        4     2
    # 0.25 x - 1 x + 1 x
    print(f == np.polyder(fint1))  # 求一重积分的一阶导数来验证是否正确  True
    fint2 = np.polyint(f, 2)  # 求多项式f的二重积分
    print(fint2)
    #        5          3       2
    # 0.05 x - 0.3333 x + 0.5 x

    p1 = np.poly1d(np.array([1, 2, 3]))
    p2 = np.poly1d(np.array([1, 2, 3, 4]))
    print(p1)
    #     2
    # 1 x + 2 x + 3
    print(p2)
    #     3     2
    # 1 x + 2 x + 3 x + 4
    print(p1+p2)
    #     3     2
    # 1 x + 3 x + 5 x + 7
    print(np.polyadd(p1, p2))
    #     3     2
    # 1 x + 3 x + 5 x + 7

    print(p2-p1)
    #     3     2
    # 1 x + 1 x + 1 x + 1
    print(np.polysub(p2, p1))
    #     3     2
    # 1 x + 1 x + 1 x + 1

    print(np.polymul(p1, p2))  # 等价于p1*p2
    #     5     4      3      2
    # 1 x + 4 x + 10 x + 16 x + 17 x + 12

    print(np.polydiv(p2, p1))  # 等价于p2/p1
    #(poly1d([1., 0.]), poly1d([4.]))

    x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
    y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
    parray = np.polyfit(x, y, 3)  # 用 polyfit 返回一个拟合多项式的系数数组
    print(parray)
    # [0.08703704 - 0.81349206  1.69312169 - 0.03968254]
    p = np.poly1d(parray)
    print(p)
    #     3          2
    # 0.08704 x - 0.8135 x + 1.693 x - 0.03968


# 选择要验证的函数-----------------------------------------------------------------------------------------
def main():
    # linearAlgebra()
    # polynomial()


if __name__ == "__main__":
    main()

相关参考:Python语言程序设计(上海交通大学出版社 赵璐主编)<<----传送门

如有错误,欢迎私信纠正
技术永无止境,谢谢支持!

猜你喜欢

转载自blog.csdn.net/pineapple_C/article/details/107065209