Half Power Estimation of $\zeta$


In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1969)

We simulate a dynamic testing, using a low sampled, random error affected sequence of frequencies to compute a random error affected sequence of dynamic amplification factors for $\zeta=3.5\%$.


In [2]:
b = np.linspace(0.5, 1.5, 51) + (np.random.random(51)-0.5)/100
z = 0.035
D = 1/np.sqrt((1-b*b)**2+(2*z*b)**2) * (1 + (np.random.random(51)-0.5)/100)
plt.plot(b, D) ;  plt.ylim((0, 15)) ; plt.grid();
print('max of curve', max(D), '\tmax approx.', 1/2/z, '\texact', 1/2/z/np.sqrt(1-z*z))


max of curve 14.209054403465506 	max approx. 14.285714285714285 	exact 14.294472332992134

We find the reference response value using the measured maximum value and plot a zone around the max value, using a reference line at $D_\text{max}/\sqrt2$


In [3]:
Dmax = max(D)
D2 = Dmax/np.sqrt(2)

plt.plot(b, D, 'k-*')
plt.yticks((D2, Dmax))
plt.xlim((0.9, 1.1))
plt.grid()


We plot 2 ranges around the crossings with the reference value


In [4]:
plt.plot(b, D)
plt.yticks((D2, Dmax))
plt.xlim((0.950, 0.965))
plt.grid()
plt.show()
plt.plot(b, D)
plt.yticks((D2, Dmax))
plt.xlim((1.025, 1.040))
plt.grid();


My estimates for the half-power frequencies are $f_1 = 0.9635$ and $f_2 = 1.0336$, and using these values in the half-power formula gives us our estimate of $\zeta$.


In [5]:
f1 = 0.9618
f2 = 1.0346
print(z, (f2-f1)/(f2+f1))


0.035 0.036465638148667594