def form_identify_dof(form): r"""Identify the DOF of a form diagram. Parameters ---------- form : FormDiagram The form diagram. Returns ------- k : int Dimension of the null space (nullity) of the equilibrium matrix. Number of independent states of self-stress. m : int Size of the left null space of the equilibrium matrix. Number of (infenitesimal) mechanisms. ind : list Indices of the independent edges. Notes ----- The equilibrium matrix of the form diagram is .. math:: \mathbf{E} = \begin{bmatrix} \mathbf{C}_{i}^{t}\mathbf{U} \\ \mathbf{C}_{i}^{t}\mathbf{V} \end{bmatrix} If ``k == 0`` and ``m == 0``, the system described by the equilibrium matrix is statically determined. If ``k > 0`` and ``m == 0``, the system is statically indetermined with `k` idependent states of stress. If ``k == 0`` asnd ``m > 0``, the system is unstable, with `m` independent mechanisms. The dimension of a vector space (such as the null space) is the number of vectors of a basis of that vector space. A set of vectors forms a basis of a vector space if they are linearly independent vectors and every vector of the space is a linear combination of this set. Examples -------- >>> """ k_i = form.key_index() xy = form.vertices_attributes('xy') fixed = [k_i[key] for key in form.fixed()] free = list(set(range(len(form.vertex))) - set(fixed)) edges = [(k_i[u], k_i[v]) for u, v in form.edges()] C = connectivity_matrix(edges) E = equilibrium_matrix(C, xy, free) k, m = dof(E) ind = nonpivots(rref(E)) return k, m, [edges[i] for i in ind]
def form_identify_dof(form, **kwargs): algo = kwargs.get('algo') or 'sympy' k2i = form.key_index() xyz = form.vertices_attributes('xyz') fixed = [k2i[key] for key in form.anchors()] free = list(set(range(form.number_of_vertices())) - set(fixed)) edges = [(k2i[u], k2i[v]) for u, v in form.edges_where({'_is_edge': True})] C = connectivity_matrix(edges) E = equilibrium_matrix(C, xyz, free) return nonpivots(rref(E, algo=algo))