@@ -90,4 +90,31 @@ def run(*args, **kwargs):
9090 mgr .set_matrix (A )
9191 mgr .set_tolerances (rtol = rtol , atol = atol , maxit = maxit )
9292 x = mgr .solve (b )
93- return x
93+ return x
94+
95+ from .nodetype import CNodeType , PortConf , DataType
96+
97+ __all__ = ["EigenSolver" ]
98+
99+ class EigenSolver (CNodeType ):
100+ TITLE : str = "特征值求解器"
101+ PATH : str = "解法器.特征值"
102+ INPUT_SLOTS = [
103+ PortConf ("S" , DataType .TENSOR , title = "刚度矩阵 S" ),
104+ PortConf ("M" , DataType .TENSOR , title = "质量矩阵 M" ),
105+ PortConf ("neigen" , DataType .INT , title = "求取的特征值个数" , default = 6 , min_val = 1 ),
106+ PortConf ("which" , DataType .STRING , title = "eigsh which" , default = 'SM' ),
107+ ]
108+ OUTPUT_SLOTS = [
109+ PortConf ("val" , DataType .TENSOR , title = "特征值" ),
110+ PortConf ("vec" , DataType .TENSOR , title = "特征向量" ),
111+ ]
112+
113+ @staticmethod
114+ def run (* args , ** kwargs ):
115+ from scipy .sparse .linalg import eigsh
116+ S = kwargs .get ('S' )
117+ M = kwargs .get ('M' )
118+ neigen = kwargs .get ('neigen' )
119+ val , vec = eigsh (S , k = neigen , M = M , which = kwargs .get ('which' , 'SM' ), tol = 1e-6 , maxiter = 1000 )
120+ return val , vec
0 commit comments