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