Frequency analysis#
The function freq() solves the eigenvalue problem
\(([K] + \lambda^2 [M])\{u\} = \{0\}\), where \(\lambda^2 = -\omega_n^2\)
and \(\omega_n\) is the natural frequency in rad/s. The code below is extracted
from one of the structsolve unit tests:
def test_freq_simple():
"""Test frequency analysis with known natural frequencies
For a diagonal system: [K]{u} + omega^2 [M]{u} = 0
K = diag(k1, k2, ...), M = diag(m1, m2, ...)
omega_i = sqrt(ki/mi)
"""
n = 10
k_vals = np.arange(1, n + 1, dtype=float) * 100
m_vals = np.ones(n)
K = csc_matrix(np.diag(k_vals))
M = csc_matrix(np.diag(m_vals))
eigvals, eigvecs = freq(K, M, silent=True, num_eigvalues=5,
sparse_solver=True)
# freq returns lambda2 where [K] + lambda2 [M] = 0
# so lambda2 = -omega^2 = -k/m
# The sorted natural frequencies should match sqrt(k_vals)
assert eigvecs.shape[0] == n