%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (12.0, 3.2)
import numpy as np
from IPython.display import display, HTML
M = 15.2E3 # kg
P0 = 800.0 # N
w0 = 2*np.pi*8.0 # rad/s
t0 = 5.0 # s
TR = 0.25
For a specific value of $\zeta$ we want to determine the maximum value of $K$ for which the transmissibility ratio is not greater than TR.
Starting from the definition of the transmissibility ratio.
$\text{TR} \ge \frac{\sqrt{1+(2\zeta\beta)^2}}{\sqrt{(1-\beta^2)^2+(2\zeta\beta)^2}} \quad\rightarrow\quad \text{TR}^2((\beta^2-1)^2 +(2\zeta\beta)^2)) - 1 - (2\zeta\beta)^2 \ge 0$
Solving for $\beta^2$, observing that $\beta^2=M\omega^2_0/K$ we can find directly the maximum stiffness needed to not exceed the maximum steady-state transmitted force.
def max_K(M, z, w0, TR):
T =TR**2
fz2 = 4*z*z
fz4 = fz2**2
K = (2*T + fz2 - T*fz2 - np.sqrt((1-2*T+T*T)*fz4 + 4*fz2*(T-T*T) + 4*T)) / (2*T-2)
return M*w0*w0*K
K01 = max_K(M, 0.01, w0, TR)
K10 = max_K(M, 0.10, w0, TR)
The damping coefficient is $C=2\zeta\sqrt{KM}$
C01 = 2*np.sqrt(M*K01)*0.01
C10 = 2*np.sqrt(M*K10)*0.10
The required output
print('The suspension system for z=0.01')
print('\tK =%E N/m,\tC =%E Ns/m.'%(K01, C01))
print('The suspension system for z=0.10')
print('\tK =%E N/m,\tC =%E Ns/m.'%(K10, C10))
factor = 4
t = np.linspace(0, 6, 600*factor+1)
a = t/t0
f = w0*t0*np.where(t<t0, a*a*(1-a/3), a-1/3)
plt.plot(t,f)
plt.xlabel('$t/s$')
plt.ylabel('Phase/rad, $\\phi(t)$')
plt.grid();
w = w0*np.where(t<t0, a*(2-a), 1)
plt.plot(t, w)
plt.xlabel('$t/s$')
plt.ylabel('Angular velocity/(rad/s), $\\dot\\phi(t)=\\omega(t)$')
plt.grid();
angacc = w0*np.where(t<t0, 2*(1-a), 0)/t0
plt.plot(t, angacc)
plt.xlabel('$t/s$')
plt.ylabel('Angular acceleration, $\\ddot\\phi(t)$')
plt.grid();
p = P0 * (w*w*np.sin(f)-angacc*np.cos(f)) / w0**2
plt.plot(t, p)
plt.xlabel('$t/s$')
plt.ylabel('$p(t)/{}$N')
plt.grid();
plt.plot(t, w*w*np.sin(f)*P0/w0/w0, label='$\\omega^2\\sin\\phi$')
plt.plot(t, angacc*np.cos(f)*P0/w0/w0, label='$\\dot\\omega\\cos\\phi$')
plt.legend()
plt.xlim((0, 2))
plt.ylim((-300, 300))
plt.title('Relative importance of different contributions to unbalanced force');
Straightforward implementation, we print also the peak value of the transmitted force
h = 0.01/factor
for m, c, k, zeta in ((M, C01, K01, '0.01'), (M, C10, K10, '0.10')):
k_ = k + 3*c/h + 6*m/h/h
c_ = 3*c + 6*m/h
m_ = 3*m + c*h/2
x0, v0 = 0, 0
x, v = [x0], [v0]
for p0, p1 in zip(p[:-1], p[1:]):
a0 = (p0-c*v0-k*x0)/m
dp = p1 - p0 + c_*v0 + m_*a0
dx = dp/k_
x0 = x0 + dx
v0 = 3*dx/h - 2*v0 - a0*h/2
x.append(x0), v.append(v0)
x, v = np.array(x), np.array(v)
f = k*x+c*v ; f0 = np.max(np.abs(f))
display(HTML('''
<h3>$\\zeta=%s$</h3>
Peak value of transmitted force $f_0=%f\,{}$N.'''%(zeta, f0)))
plt.plot(t, f)
plt.xlabel('$t/{}$s')
plt.ylabel('$f(t)/{}$N')
plt.grid()
plt.show();
If you don;t want to solve a quadratic equation, you can use a numerical root finder, that can be initialized using the value $\beta^2=1+1/\text{TR}$, valid for an undamped system.
from scipy.optimize import newton
z = 0.10;
f = lambda b2: (1+4*z*z*b2)/((1-b2)**2+4*z*z*b2)-TR**2
b2 = newton(f, (TR+1)/TR)
print('K|z=0.10 =', M*w0*w0/b2,'N/m')