python使用numpy.linalg模块应用于矩阵分析——2

3 篇文章 0 订阅
1 篇文章 0 订阅

code: 

import numpy as np
from fractions import Fraction
#结果用分数输出
np.set_printoptions(formatter={'all':lambda x: str(Fraction(x).limit_denominator())})
#使用numpy.linalg模块
#以下必须方阵
d=np.mat("3, 0; 4, -5")
print("原始矩阵:\n",d)
#求行列式
det=np.linalg.det(d)
print("计算行列式:\n",det)
#求转置
transpose=np.transpose(d)
print("转置矩阵:\n",transpose)
#求逆
inv=np.linalg.inv(d)
print("矩阵的逆:\n"+str(inv))
#求广义逆矩阵
pinv=np.linalg.pinv(d)
print("矩阵的广义逆矩阵:\n"+str(pinv))
#求特征值
eigen = np.linalg.eigvals(d)
print("矩阵的特征值{}".format(eigen))
#求特征值和特征向量
eigenvalues,eigenvectors=np.linalg.eig(d)
print("矩阵的特征值:\n",eigenvalues)
print("矩阵的特征向量\n{}".format(eigenvectors[:,:]))
#验证A*Vi=lamda*Vi,采用for循环
#len的变量必须是容器,求容器中项目的个数
for i in range(len(eigen)):
    AVi=np.dot(d,eigenvectors[:,i])
    #下面两个式子等价
    lamdaVi=np.dot(eigenvalues[i],eigenvectors[:,i])
    # lamdaVi1=eigenvalues[i]*eigenvectors[:,i]
print("A*Vi=\n", AVi)
print("lamda*Vi=\n", lamdaVi)
    # print("lamda*Vi1=", lamdaVi1)
    #或者将他们写在一起
    # print("A*Vi=", np.dot(d,eigenvectors[:,i]))
    # print("lamda*Vi=", np.dot(eigenvalues[i],eigenvectors[:,i]))
if AVi.any()==lamdaVi.all():
    print("A*Vi=lamda*Vi成立")
else:
    print("A*Vi=lamda*Vi不成立")
#以下不需要方阵
#利用reshape将array转化为矩阵
a = [3, 0, 4, -5, 6, -9, 7, 8, 9, -2, 3, -4]
b = np.array(a).reshape(3 , 4)
print("原始矩阵\n{}".format(b[:,:]))
#直接使用mat定义矩阵
c=np.mat("3, 0; 4, -5; 6, -9")
print("原始矩阵\n"+str(c))
#奇异值分解
u,s,v=np.linalg.svd(b,full_matrices=False)
u1,s1,v1=np.linalg.svd(c,full_matrices=True)
#一定要加大括号,不加不会输出后面的format()
print("左奇异向量\n{}".format(u))
print("奇异值\n{}".format(s))
print("右奇异向量\n{}".format(v))
#使用diag函数生成完整的奇异值矩阵
print("奇异值矩阵\n"+str(np.diag(s)))
us=u*np.diag(s)
usv=np.dot(us,v)
print("完整的奇异值矩阵\n"+str(usv))
#验证A*Vi=sigma*Ui,采用for循环
m=len(u)
print("左奇异向量个数\n"+str(m))
n=len(v[0])
print("右奇异向量个数\n{}".format(n))
e=np.zeros((m,n))
print(e)
for j in range(m):
    uj=u[:,j].reshape(m,1)
    vj=v[j].reshape(1,n)
    usv1 = s[j] * np.dot(uj, vj)
    e+= s[j] * np.dot(uj, vj)
    print("uj\n", uj)
    print("vj\n", vj)
    print('完整的奇异值矩阵 {}'.format(j,usv1))
    print(e)
print("原始矩阵\n",b)
if e.any()==b.any():
    print("A*Vi=sigma*Ui成立")
else:
    print("A*Vi=sigma*Ui不成立")
if e.all()==b.any():
    print("A*Vi=sigma*Ui成立")
else:
    print("A*Vi=sigma*Ui不成立")
if e.any()==b.all():
    print("A*Vi=sigma*Ui成立")
else:
    print("A*Vi=sigma*Ui不成立")
if e.all()==b.all():
    print("A*Vi=sigma*Ui成立")
else:
    print("A*Vi=sigma*Ui不成立")
运行结果:

原始矩阵:
 [[3 0]
 [4 -5]]
计算行列式:
 -15.0
转置矩阵:
 [[3 4]
 [0 -5]]
矩阵的逆:
[[1/3 0]
 [4/15 -1/5]]
矩阵的广义逆矩阵:
[[1/3 0]
 [4/15 -1/5]]
矩阵的特征值[-5 3]
矩阵的特征值:
 [-5 3]
矩阵的特征向量
[[0 832040/930249]
 [1 416020/930249]]
A*Vi=
 [[832040/310083]
 [416020/310083]]
lamda*Vi=
 [[832040/310083]
 [416020/310083]]
A*Vi=lamda*Vi成立
原始矩阵
[[3 0 4 -5]
 [6 -9 7 8]
 [9 -2 3 -4]]
原始矩阵
[[3 0]
 [4 -5]
 [6 -9]]
左奇异向量
[[-66275/459456 -427044/760919 -387942/476003]
 [-521729/582797 181141/426263 -9643/71864]
 [-299399/710079 -246567/347158 303290/538023]]
奇异值
[5284490/327921 7847778/716033 535281/167774]
右奇异向量
[[-414013/695073 349499/632818 -291693/579727 -292755/992398]
 [-199579/395827 -176441/804388 -65703/514012 743869/901198]
 [188309/329510 20566/817821 -447827/569658 97576/416935]]
奇异值矩阵
[[5284490/327921 0 0]
 [0 7847778/716033 0]
 [0 0 535281/167774]]
完整的奇异值矩阵
[[923350/666873 -1250827/974295 852932/729243 509556/743077]
 [-206105/87766 -14700/14389 -593775/997372 3842505/999506]
 [483289/470208 37826/836343 -1156349/817859 102082/242527]]
左奇异向量个数
3
右奇异向量个数
4
[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
uj
 [[-66275/459456]
 [-521729/582797]
 [-299399/710079]]
vj
 [[-414013/695073 349499/632818 -291693/579727 -292755/992398]]
完整的奇异值矩阵 0
[[923350/666873 -1250827/974295 852932/729243 509556/743077]
 [6786008/789713 -4643569/582805 6234448/858883 2856855/671287]
 [2703521/667988 -3379624/900583 3101683/907230 1525816/761213]]
uj
 [[-427044/760919]
 [181141/426263]
 [-246567/347158]]
vj
 [[-199579/395827 -176441/804388 -65703/514012 743869/901198]]
完整的奇异值矩阵 1
[[3354962/747875 331/5062 1941785/992803 -2442943/556294]
 [5923527/948575 -7832895/871364 6159017/924299 1321198/163107]
 [3748583/470208 -1710512/836343 3609926/817859 -1072190/242527]]
uj
 [[-387942/476003]
 [-9643/71864]
 [303290/538023]]
vj
 [[188309/329510 20566/817821 -447827/569658 97576/416935]]
完整的奇异值矩阵 2
[[3 0 4 -5]
 [6 -9 7 8]
 [9 -2 3 -4]]
原始矩阵
 [[3 0 4 -5]
 [6 -9 7 8]
 [9 -2 3 -4]]
A*Vi=sigma*Ui成立
A*Vi=sigma*Ui成立
A*Vi=sigma*Ui不成立
A*Vi=sigma*Ui不成立

Process finished with exit code 0

all 和 any还是有区别的,因为奇异矩阵本身就是近似的,所以all不一定等与原始矩阵 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值