def diff_simple(self, frame, sys=None): sys = sys or pynamics.get_system() v = self.express(frame).components[frame] dv = sys.derivative(v) newvec = Vector({frame: dv}) newvec.clean() return newvec
def __init__(self, name, frame, pCM, mass, inertia_CM, system=None, about_point=None, about_point_d=None, about_point_dd=None, vCM=None, aCM=None, wNBody=None, alNBody=None, inertia_about_point=None): system = system or pynamics.get_system() name = name or self.generate_name() self.name = name self.frame = frame self.system = system self.pCM = pCM self.mass = mass self.inertia_CM = inertia_CM self.vCM = vCM or self.pCM.time_derivative(self.system.newtonian, self.system) self.aCM = aCM or self.vCM.time_derivative(self.system.newtonian, self.system) if about_point is None: self.about_point = pCM self.about_point_d = self.vCM self.about_point_dd = self.aCM else: self.about_point = about_point self.about_point_d = about_point_d or self.about_point.time_derivative( self.system.newtonian, self.system) self.about_point_dd = about_point_dd or self.about_point_d.time_derivative( self.system.newtonian, self.system) self.inertia_about_point = inertia_about_point or pynamics.inertia.shift_from_cm( self.inertia_CM, self.pCM, self.about_point, self.mass, self.frame) self.gravityvector = None self.forcegravity = None self.wNBody = wNBody or self.system.newtonian.getw_(self.frame) self.alNBody = alNBody or self.wNBody.time_derivative( self.system.newtonian, self.system) # self.linearmomentum = self.mass*self.vCM # self.angularmomentum = self.inertia.dot(self.wNBody) self.system.bodies.append(self) pynamics.addself(self, name) self.effectiveforces = []
def __init__(self,y_exp, system=None, constant_values = None,state_variables = None): import sympy system = system or pynamics.get_system() state_variables = state_variables or system.get_state_variables() constant_values = constant_values or system.constant_values self.y_expression = sympy.Matrix(y_exp) cons_s = list(constant_values.keys()) self.cons_v = [constant_values[key] for key in cons_s] self.fy_expression = sympy.lambdify(state_variables+cons_s+[system.t],self.y_expression)
def w_from_fixed_axis(axis, q, frame, sys=None): sys = sys or pynamics.get_system() axis = sympy.Matrix(axis) l_2 = axis.dot(axis) axis = axis / (l_2**.5) w = sys.derivative(q) w_ = w * Vector({frame: axis}) return w_
def rotate_fixed_axis(self,fromframe,axis,q,system = None): system = system or pynamics.get_system() rotation = Rotation.build_fixed_axis(fromframe,self,axis,q,system) rotational_velocity = RotationalVelocity.build_fixed_axis(fromframe,self,axis,q,system) self.add_rotation(rotation) self.add_w(rotational_velocity) fromframe.add_rotation(rotation) fromframe.add_w(rotational_velocity) fromframe.R_tree.add_branch(self.R_tree) fromframe.w_tree.add_branch(self.w_tree)
def time_derivative(self, reference_frame=None, system=None): system = system or pynamics.get_system() reference_frame = reference_frame or system.newtonian result = Vector() for frame, vector in self.components.items(): result += Vector({frame: system.derivative(vector)}) v1 = Vector({frame: vector}) w_ = reference_frame.getw_(frame).express(frame) result += w_.cross(v1, frame='mid') result.clean() return result
def __new__(self, value=None, name=None, system=None): name = name or self.generate_name() system = system or pynamics.get_system() obj = sympy.Symbol.__new__(self, name) # obj.value = value system.add_constant(obj) if value is not None: system.add_constant_value(obj, value) return obj
def __init__(self, y_exp, system=None, constant_values=None, state_variables=None, dot=None): system = system or pynamics.get_system() dot = dot or [system.newtonian.x, system.newtonian.y] y_exp = [ item for item2 in y_exp for item in [item2.dot(dotitem) for dotitem in dot] ] Output.__init__(self, y_exp, system, constant_values, state_variables)
def __new__(cls,name=None,system = None,limit = 3,ii=0,ini = None): system = system or pynamics.get_system() name = name or cls.generate_name() output = [] differentiables = [] for kk,jj in enumerate(range(ii,limit)): if kk==0: subname = name variable = sympy.Symbol.__new__(cls,subname) else: subname = name+'_'+'d'*kk # if jj==limit-1: # variable = Variable(subname) # else: # variable = sympy.Symbol.__new__(cls,subname) variable = sympy.Symbol.__new__(cls,subname) pynamics.addself(variable,subname) output.append(variable) # if jj!=limit-1: # differentiables.append(variable) # system.add_q(variable,jj) differentiables.append(variable) system.add_q(variable,jj) # for item in differentiables: # system.set_derivative(item,None) for kk,(a,a_d) in enumerate(zip(output[:-1],output[1:])): system.set_derivative(a,a_d) if ini is not None: system.set_ini(a,ini[kk]) if len(output)==1: return output[0] else: return output
def __new__(cls, name=None, system=None, limit=3, ii=0, ini=None, output_full=True): system = system or pynamics.get_system() name = name or cls.generate_name() output = [] for kk, jj in enumerate(range(ii, limit)): if kk == 0: subname = name variable = sympy.Symbol.__new__(cls, subname) else: subname = name + '_' + 'd' * kk # if jj==limit-1: # variable = Variable(subname) # else: # variable = sympy.Symbol.__new__(cls,subname) variable = sympy.Symbol.__new__(cls, subname) output.append(variable) system.add_q(variable, jj) for item in output: item.set_derivative(sympy.Number(0)) for kk, (a, a_d) in enumerate(zip(output[:-1], output[1:])): system.set_derivative(a, a_d) a.set_derivative(a_d) if ini is not None: system.set_ini(a, ini[kk]) if output_full: if len(output) == 1: return output[0] else: return output else: return output[0]
def build_fixed_axis(axis, q, frame, sys=None): sys = sys or pynamics.get_system() axis = sympy.Matrix(axis) l_2 = axis.dot(axis) axis = axis / (l_2**.5) e0 = axis[0] e1 = axis[1] e2 = axis[2] c = axis * axis.T a = (sympy.Matrix.eye(3) - c) * cos(q) b = sympy.Matrix([[0, -e2, e1], [e2, 0, -e0], [-e1, e0, 0]]) * sin(q) R = a + b + c R = R.T return R, axis
def __init__(self, pCM, mass, name=None, system=None, vCM=None, aCM=None): system = system or pynamics.get_system() name = name or self.generate_name() self.name = name self.pCM = pCM self.mass = mass self.system = system self.vCM = vCM or self.pCM.time_derivative(self.system.newtonian, self.system) self.aCM = aCM or self.vCM.time_derivative(self.system.newtonian, self.system) self.gravityvector = None self.forcegravity = None self.system.particles.append(self) self.effectiveforces = []