Hyperstatic Truss - Compatibility
import ema as em
import matplotlib.pyplot as plt
import numpy as np
%config InlineBackend.figure_format = 'svg'mdl = em.Model(2,2)
n = mdl.dnodes
e = mdl.delems
mdl.node('1', 0.0, 0.0)
mdl.node('2', 8.0, 0.0)
mdl.node('3', 4.0, 3.0)
mdl.node('4', 4.0, 6.0)
mdl.truss('a', n['1'], n['3'])
mdl.truss('b', n['2'], n['3'])
mdl.truss('c', n['1'], n['4'])
mdl.truss('d', n['3'], n['4'])
mdl.truss('e', n['2'], n['4'])
mdl.fix(n['1'], ['x', 'y'])
mdl.fix(n['2'], ['x', 'y'])
mdl.numDOF()[[5, 6], [7, 8], [1, 2], [3, 4]]
fig1, ax1 = plt.subplots(1,1)
em.plot_structure(mdl, ax1)Part 1
Static-Kinematic Matrix Equivalence
\[V = A_f U_f\]
A = em.A_matrix(mdl)
B = em.B_matrix(mdl)\[P_f = B_f Q\]
B.f| $a_1$ | $b_1$ | $c_1$ | $d_1$ | $e_1$ | |
|---|---|---|---|---|---|
| $1$ | 0.8 | -0.8 | 0.00000 | -0.0 | 0.00000 |
| $2$ | 0.6 | 0.6 | 0.00000 | -1.0 | 0.00000 |
| $3$ | 0.0 | 0.0 | 0.55470 | 0.0 | -0.55470 |
| $4$ | 0.0 | 0.0 | 0.83205 | 1.0 | 0.83205 |
B.f.T - A.f| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 1 | 0.0 | 0.0 | 0.0 | 0.0 |
| 2 | 0.0 | 0.0 | 0.0 | 0.0 |
| 3 | 0.0 | 0.0 | 0.0 | 0.0 |
| 4 | 0.0 | 0.0 | 0.0 | 0.0 |
Part 2
Member d length
The kinematic matrix, \(A_f\), is given below:
A.f| $1$ | $2$ | $3$ | $4$ | |
|---|---|---|---|---|
| $a_1$ | 0.8 | 0.6 | 0.0000 | 0.00000 |
| $b_1$ | -0.8 | 0.6 | 0.0000 | 0.00000 |
| $c_1$ | 0.0 | 0.0 | 0.5547 | 0.83205 |
| $d_1$ | -0.0 | -1.0 | 0.0000 | 1.00000 |
| $e_1$ | 0.0 | 0.0 | -0.5547 | 0.83205 |
And the corresponding deformation vector is:
V = em.V_vector(A)
V.set_item('b_1', 0.1)
V.set_item('c_1', 0.2)
V| $V_{{}}$ | |
|---|---|
| $a_1$ | 0.0 |
| $b_1$ | 0.1 |
| $c_1$ | 0.2 |
| $d_1$ | 0.0 |
| $e_1$ | 0.0 |
The free dof displacement vector, \(U_f\), is then computed as follows: \[ U_f = A_f^{-1}V_\epsilon \]
Ve = V[[0,1,2,4]]
Ae = A.f[[0,1,2,4],:]
U = Ae.inv@Ve
U.disp\[\left[\begin{matrix}-0.0625\\0.0833333333333333\\0.180277563773199\\0.120185042515466\end{matrix}\right]\]
Finally the fully deformation vector is computed from \(V=A_fU_f\), which gives the necessary deformation of element d.
Veh = A.f@U
Veh.disp\[\left[\begin{matrix}9.25185853854297 \cdot 10^{-19}\\0.1\\0.2\\0.036851709182133\\1.66986849470959 \cdot 10^{-17}\end{matrix}\right]\]
Element d must therefore elongated by 0.037.
Satisfy Compatibility
The matrix \(\bar{B}_x\) is computed as follows:
mdl.redundant(e['d'], '1')
B.barx| $d_1$ | |
|---|---|
| $a_1$ | 0.833333 |
| $b_1$ | 0.833333 |
| $c_1$ | -0.600925 |
| $d_1$ | 1.000000 |
| $e_1$ | -0.600925 |
This is multiplied by the deformation vector as follows:
residual = B.barx.T@Veh
print(residual)
if residual < 10e-9:
print("Compatibility is satisfied")B.f.ker/-0.56694671B.ker/-0.56694671