Axial extension
EA/L = 600 000
Illustrative Example 11.1 from Mario Paz and William Leigh is especially useful because one small model checks frame rotation, consistent mass, direct assembly and the generalized eigenvalue problem. No stage is hidden inside a large mesh.
Two prismatic frame elements meet at node 2. Nodes 1 and 3 are fully fixed, leaving only the three middle-node components out of nine global DOFs: ux2, uy2 and θ2.
| Parameter | Value | Role in the matrices |
|---|---|---|
| A | 6 in² | Axial EA/L and mass ρAL |
| I | 100 in⁴ | Bending coefficients EI/L³, EI/L², EI/L |
| E | 107 lb/in² | Stiffness |
| ρ | 0.7 lb·s²/in⁴ | The file stores volumetric mass density; ρA=4.20 |
| L | 100 in | Both elements |
Exact inclined-element coordinates are (100/√2, 100/√2). The input file therefore uses 70.7106781186548, rather than the rounded 70.7: the latter would change the first element length by 0.0151%.
The whole model fits into a short input file. The load is retained from the original example, but the method RunModal does not use it.
nodes
3
0,0,0
70.7106781186548,70.7106781186548,0
170.710678118655,70.7106781186548,0
elems_113
2
113,1,2,6,10000000,0.7,100
113,2,3,6,10000000,0.7,100
bcfix
2
1,1,0,0,0
1,3,0,0,0
bcforce_stat
1
10,2,0,-10,0
For a frame node, the DOF map is [ux, uy, thetaZ]. The free DOFs of node 2 therefore have global numbers [4 5 6], and the constrained DOFs are [1 2 3 7 8 9].
Both elements have identical properties and length, hence identical local matrices. Numerical stiffness coefficients:
EA/L = 600 000
12EI/L³ = 12 000
6EI/L² = 600 000
4EI/L = 40 000 000
2EI/L = 20 000 000
The local stiffness matrix, ordered as [u1 v1 θ1 u2 v2 θ2]:
k(local) = 10^6 ×
[ 0.600 0 0 -0.600 0 0
0 0.012 0.600 0 -0.012 0.600
0 0.600 40.000 0 -0.600 20.000
-0.600 0 0 0.600 0 0
0 -0.012 -0.600 0 0.012 -0.600
0 0.600 20.000 0 -0.600 40.000 ]
For consistent mass, the factor preceding the dimensionless template is particularly convenient:
ρAL/420 = 0.7·6·100/420 = 1
m(local) =
[ 140 0 0 70 0 0
0 156 2200 0 54 -1300
0 2200 40000 0 1300 -30000
70 0 0 140 0 0
0 54 1300 0 156 -2200
0 -1300 -30000 0 -2200 40000 ]
A static problem would use only K. Here eigenvalues depend on the ratio of stiffness to inertia, so a sign or coefficient error in consistent mass directly changes frequencies and mode shapes.
For the first element, c=s=1/√2. The book factors out 1/√2; the implementation writes the same direction cosines directly:
T1 = 1/sqrt(2) ×
[ 1 1 0 0 0 0
-1 1 0 0 0 0
0 0 sqrt(2) 0 0 0
0 0 0 1 1 0
0 0 0 -1 1 0
0 0 0 0 0 sqrt(2) ]
T2 = I
The same transformation applies to stiffness and mass:
k(global) = TT k(local) T
m(global) = TT m(local) T
This is where the inclined element couples global components x, y and rotation. The horizontal element needs no transformation.
Once the outer nodes are fixed, summing the free–free blocks of the two elements is sufficient. This is the same direct method that sums contributions by global DOF map in a larger model.
K1(ff) =
[ 306000 294000 424264.0687
294000 306000 -424264.0687
424264.0687 -424264.0687 40000000 ]
M1(ff) =
[ 148 -8 1555.6349
-8 148 -1555.6349
1555.6349 -1555.6349 40000 ]
K2(ff) =
[ 600000 0 0
0 12000 600000
0 600000 40000000 ]
M2(ff) =
[ 140 0 0
0 156 2200
0 2200 40000 ]
Kff = K1(ff) + K2(ff)
= 10^6 ×
[ 0.906000 0.294000 0.424264
0.294000 0.318000 0.175736
0.424264 0.175736 80.000000 ]
Mff = M1(ff) + M2(ff)
=
[ 288 -8 1555.635
-8 304 644.365
1555.635 644.365 80000 ]
Rounding 0.424264 → 0.424, 0.175736 → 0.176, 1555.635 → 1556 and 644.365 → 644 gives exactly the matrices printed in the book.
A nonzero solution exists when:
det(Kff − ω²Mff) = 0
Numerically, the generalized problem is solved: eig(Kff, Mff). Its eigenvalues equal λ=ω², after which we calculate ω=√λ and f=ω/(2π).
| Mode | λ = ω², full-precision calculation | λ in the book | ω, rad/s | f, Hz |
|---|---|---|---|---|
| 1 | 638.5045874482 | 638.5 | 25.26864831 | 4.021630284 |
| 2 | 976.5825465395 | 976.6 | 31.25032074 | 4.973643019 |
| 3 | 4211.5971088025 | 4211.6 | 64.89681894 | 10.328649526 |
The book gives 25.26 and 31.24 rad/s, although normal rounding of square roots of the printed λ values gives 25.27 and 31.25. Frequencies in hertz and full calculations agree; this is a small rounding peculiarity in the source, not a solver discrepancy.
Each mode is scaled so that φiTMφi=1. Columns of the modal matrix:
Phi =
[ 0.02182975 0.00497889 0.05830737
-0.05270167 0.00206232 0.02415170
0 0.00340929 -0.00162915 ]
The printed book values [0.0218, -0.0527, 0], [0.00498, 0.00206, 0.00341] and [0.0583, 0.0241, -0.0016] are rounded versions of these columns.
Two required numerical checks:
ΦTMffΦ = I
ri = Kffφi − λiMffφi ≈ 0
The eigenvector sign is arbitrary: φ and −φ describe the same mode. The test therefore first mass-normalizes each column, then aligns its sign with the reference before comparing components.
addpath(pwd);
setup;
problem = StructFEProblem( ...
fullfile('examples', 'cases', ...
'CaseFig11.7p363 MarioPaz.txt'), ...
struct('verbose', false, 'plotting', false));
model = problem.GetAnalysisModel();
result = problem.RunModal();
Kff = full(model.stiffness(result.freeDOFs, result.freeDOFs))
Mff = full(model.mass(result.freeDOFs, result.freeDOFs))
lambda = result.eigenvalues
omega = result.angularFrequenciesRadPerSec
frequencyHz = result.frequenciesHz
Phi = result.modeShapes(result.freeDOFs, :)
The automated check is in tests/test_mario_paz_modal.m and runs with the complete suite:
addpath(pwd); setup; run_octave_tests;
Exact reconstructed values are compared with combined relative and absolute tolerances. Rounded book values receive tolerances matching their printed precision. Modes are normalized and sign-aligned separately; orthogonality and eigenpair residuals are also checked.
The matrix K doubles, M is unchanged, so all frequencies should multiply by √2.
The matrix M doubles, K is unchanged, so all frequencies should divide by √2.
Observe how a small geometric error changes both matrices and turns the first mode’s zero rotational component into a small nonzero value.
Explore a copy of the matrix without changing the main file. Explain why arbitrarily zeroing rows and columns destroys positive definiteness and the physical meaning of the problem.
CaseFig11.7p363 MarioPaz.txt — exact geometry, properties and supports;createStructuralElement.m — local matrices and transformation;assembleGlobalMatrices.m — direct sparse assembly;solveModal.m — reduction and generalized eigenvalue problem;tests/test_mario_paz_modal.m — numerical reference and robust comparisons;