复制以下的代码,选择运行的函数,验证有关矩阵、多项式的操作。 相关参考: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语言程序设计(上海交通大学出版社 赵璐主编)<<----传送门
如有错误,欢迎私信纠正 技术永无止境,谢谢支持!