def _form_fr(self, fl):
"""Form the generalized active force.
Computes the vector of the generalized active force vector.
Used to compute E.o.M. in the form Fr + Fr* = 0.
Parameters
==========
fl : list
Takes in a list of (Point, Vector) or (ReferenceFrame, Vector)
tuples which represent the force at a point or torque on a frame.
"""
if not hasattr(fl, '__iter__'):
raise TypeError('Force pairs must be supplied in an iterable.')
N = self._inertial
self._forcelist = fl[:]
u = self._u
o = len(u) # number of gen. speeds
b = len(fl) # number of forces
FR = zeros(o, 1)
# pull out relevant velocities for constructing partial velocities
vel_list = []
f_list = []
for i in fl:
if isinstance(i[0], ReferenceFrame):
vel_list += [i[0].ang_vel_in(N)]
elif isinstance(i[0], Point):
vel_list += [i[0].vel(N)]
else:
raise TypeError('First entry in pair must be point or frame.')
f_list += [i[1]]
partials = self._partial_velocity(vel_list, u, N)
# Fill Fr with dot product of partial velocities and forces
for i in range(o):
for j in range(b):
FR[i] += partials[j][i] & f_list[j]
# In case there are dependent speeds
m = len(self._udep) # number of dependent speeds
if m != 0:
p = o - m
FRtilde = FR[:p, 0]
FRold = FR[p:o, 0]
FRtilde += self._Ars.T * FRold
FR = FRtilde
self._fr = FR
return FR
评论列表
文章目录