pyyeti
pyyeti copied to clipboard
Prony Method Analysis for Damping Estimation
Dear Tim,
The Prony method comes as an alternative to the logarithmic decrement method in the case of existence of closely spaced modes of vibration. One can use prony and residuez functions in MATLAB to canulate it but in python I do not know how. Please, take a look at the section 2.3 & 2.4 of the following paper:
https://www.mdpi.com/2076-3417/13/4/2636
Best regards, Mohammad
Thank you, Mohammad, I'll take a look! :-)
Hi Mohammad (@Ayubirad),
I played with Prony's method a little. I don't know what the Matlab functions do, but I created the following little test script to get started. This finds the damping and frequencies accurately using both the ERA method and Prony's method:
import numpy as np
import numpy.polynomial.polynomial as poly
import scipy.linalg as la
from pyyeti import ode
from pyyeti import era
if __name__ == "__main__":
# sum two decaying sinusoids:
amp1 = 4.0 # amplitude
f1 = 0.55 # Hz
w1 = 2 * np.pi * f1
zeta1 = 0.015 # damping ratio
w1damped = w1 * np.sqrt(1 - zeta1**2)
amp2 = 2.0
f2 = 1.7
w2 = 2 * np.pi * f2
zeta2 = 0.024
w2damped = w2 * np.sqrt(1 - zeta2**2)
dt = 0.05
sr = 1 / dt
t = np.arange(0, 3.0, dt)
sig1 = amp1 * np.exp(-w1 * zeta1 * t) * np.sin(w1damped * t)
sig2 = amp1 * np.exp(-w2 * zeta2 * t) * np.sin(w2damped * t)
sig = sig1 + sig2
era_fit = era.ERA(sig, sr=sr, auto=True)
# Ref:
# Hokanson, J.M. (2013). Numerically stable and statistically
# efficient algorithms for large-scale exponential
# fitting. Ph.D. thesis, Rice University.
# Construct the Hankel matrix:
p = 4
H = np.array([sig[i : i + p] for i in range(p)])
y = sig[p : 2 * p]
# Solve eq 2.2: H @ alpha = -y
alpha, residues, rank, s = la.lstsq(H, -y)
# Compute roots:
pn = np.r_[alpha, 1]
eigs = poly.polyroots(pn)
# Convert from z-domain to continuous:
i = np.argsort(abs(eigs.imag), kind="stable")
eigs = eigs[i]
eigs_continuous = np.log(eigs) * sr
freqs, zeta = ode.get_freq_damping(eigs_continuous, suppress_warning=True)
index = np.argsort(freqs, kind="stable")
freqs = freqs[index]
zeta = zeta[index]
print()
print(f"prony's freqs = {freqs}")
print(f"era's freqs = {era_fit.freqs}")
print()
print(f"prony's zeta = {zeta}")
print(f"era's zeta = {era_fit.zeta}")
Let me know if this is helpful!
Best regards, Tim
Hello @twmacro,
I hope this message finds you well. I wanted to express my gratitude for sharing your test script. While reviewing the article, I couldn't help but wonder why the authors specifically chose the Prony method for their analysis. It seems like they could have opted for a more widely recognized approach such as ERA for studying the free vibration components. In their research, they employed the Enhanced Frequency Domain Decomposition method (EFDD) on ambient data for modal identification. Furthermore, they utilized the Prony method on the free decay segment of accelerations to obtain a more precise estimation of the damping ratio.
Once again, thank you for sharing your insights and expertise.
Best regards, Mohammad