import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
stepsize = 0.01
'''
这里有个问题 就是特征值的排列方式可能跟下一个的顺序不一样,所以就会导致求导时候的错位。
这里需要在求导的时候,搞一下吧。
另外,矩阵的特征值,会不会突然变异?有跃迁?需要设置一个,检测的一些。
'''
def EigVect(Matrix):
eigs,vectors = np.linalg.eig(Matrix)
return eigs,vectors
def test1ForContinueOfEig(eigss=[]):
plt.figure()
eigss1 = np.array(eigss)
for i in eigss1.shape[1]:
plt.plot(eigss1[:,i])
plt.title('tezhengzhi')
plt.xlabel('x')
plt.show()
def EigDaoshu(Eig1=1,Eig2=2,stepsize=0.01):
if abs((Eig1-Eig2)/Eig1)>5:
raise Exception('特征值变化超过原来的10倍,出现奇异的点了')
return (Eig1-Eig2)/stepsize
def VectDaoshu(Vect1=[2,2],Vect2=[1,1],stepsize=0.01):
result = (Vect1-Vect2)/Vect1
for item in result:
if abs(item)>5:
raise Exception('向量变化超过原来的十倍啦,应该是出现奇异的点了')
return (Vect1-Vect2)/stepsize
def isnear(eigs):
if abs(eigs[0]-eigs[1])<stepsize:
raise Exception('两个特征值很相近,无法得出哪个特征值是哪个,换换矩阵吧')
return True
'''
解决的情形是[0.4,0.6] [0.61,0.39] 这里第一位和第二位的就需要换一个位置
'''
def sorteigs(eig1,eig2,eig3,vect1,vect2,vect3):
if abs(eig1[0]-eig2[0])<abs(eig1[0]-eig2[1]):
pass
else:
print('需要换位2....')
eig2[0],eig2[1] = eig2[1],eig2[0]
vect2[0],vect2[1] = vect2[1],vect2[0]
if abs(eig2[0]-eig3[0])<abs(eig2[0]-eig3[1]):
pass
else:
print('需要换位3....')
eig3[0],eig3[1] = eig3[1],eig3[0]
vect3[0],vect3[1] = vect3[1],vect3[0]
return eig1,eig2,eig3,vect1,vect2,vect3
函数说明
函数 |
函数名称 |
备注 |
EigVect |
求特征值和特征向量 |
|
test1ForContinueOfEig |
测试特征值是否连续 |
还没用到 |
EigDaoshu |
特征值导数 |
|
VectDaoshu |
特征向量导数 |
|
isnear |
是否相邻 |
为下面函数所用 |
sorteigs |
特征值从小到大排序 |
使得特征值变化连续 |