OpenSees Cloud
OpenSees AMI
Eigenvalues of the Stiffness Matrix
Original Post - 16 Jan 2023 - Michael H. Scott
Visit Structural Analysis Is Simple on Substack.
Students are exposed to eigenvalues and eigenvectors a few times through their structural engineering education. After the math department’s obligatory treatment to sophomores with definitions, characteristic polynomials, and toy matrices, two to three years pass before students see eigenanalysis again as first year graduate students:
- Structural dynamics - find natural modes of vibration of a structural model
- Nonlinear structural analysis - find buckling modes of a structural model
- Structural mechanics - find principal stretches and directions at a material point
If a civil engineering student does not go on to graduate school, they will never give eigenanalysis another thought after their sophomore year–just some thing they had to learn for a math class, forgotten on the way out of the final exam.
So, I propose we teach undergraduates eigenanalysis again–in a structural engineering course–before students robe up and walk across the stage.
In indeterminate structural analysis at the junior or senior level, after direct assembly, which is not all that interesting, pause and ask “what is the significance of the eigenvalues and eigenvectors (the eigenpairs) of the stiffness matrix we just assembled?”
The eigenpairs give the principal stretches (eigenvalues) and directions (eigenvectors), not of a material point, but of a structural model untainted by mass or axial loads.
Consider the portal frame shown below.
Using direct assembly, or OpenSees and
printA
,
the stiffness matrix is
EQUATION
The resulting eigenvalues and eigenvectors of the stiffness matrix are
EQUATION
How one calculates the eigenpairs is not important.
The eigenvector associated with the lowest eigenvalue is side sway,
plotted below using
opsvis
.
Easy!
While the eigenvector associated with the highest eigenvalue puts all members into double flexure. Ouch!
A small eigenvalue means the model has no problem deforming into the associated mode (eigenvector). And a large eigenvalue indicates the model’s disdain for the associated mode.
The eigenvalue is like activation energy. Watching a movie is easy while writing a journal article takes, or should take, a lot of effort. Writing blog posts and cleaning the floor are somewhere in between.
I’ve covered eigenpairs of the stiffness matrix a few times when teaching undergraduate structural analysis in Eastchester. Students usually like the concept. One year, I overheard a student tell their chatty classmates, “Hey, be quiet. This is interesting.” Definitely a highlight of my teaching career.
You can use the standard eigenvalue solver in OpenSees to get the eigenpairs of the stiffness matrix.
To get the mode shapes shown in this post, apply \(\lambda{\bf v}\) as nodal loads, then do a static analysis. The resulting nodal displacements are the eigenvector components.
In a linear static analysis, we solve the equilibrium equations \({\bf K}{\bf U}={\bf P}\). The eigenvalue equation is \({\bf K}{\bf v}=\lambda{\bf v}\), which says there are joint loads that produce joint displacements in direct proportion to those loads. So, if the applied nodal loads are \({\bf P}=\lambda {\bf v}\), the nodal displacements must be \({\bf U}={\bf v}\). This might be obvious to some readers, but it’s not so obvious to others.
OpenSees code below for applying eigenpairs as nodal loads.
#
# Define your model
#
Nmodes = 7 # Or whatever
lam = ops.eigen('standard','symmBandLapack',Nmodes)
ops.analysis('Static')
ops.timeSeries('Constant',1)
for n in range(Nmodes):
ops.pattern('Plain',1,1)
for nd in ops.getNodeTags():
P = np.multiply(lam[n],ops.nodeEigenvector(nd,n+1))
ops.load(nd,*P)
ops.analyze(1)
ops.remove('loadPattern',1)
Direct assembly and the “eigenvalue lecture” are at the end of my undergraduate structural analysis course. Direct assembly is then the review material at the beginning of my graduate course on matrix methods of structural analysis. Here is a video showing direct assembly for the frame in this post.