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
特征值从小到大排序 使得特征值变化连续