Exemple #1
0
    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
Exemple #2
0
    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 = []
Exemple #3
0
 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)
Exemple #4
0
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_
Exemple #5
0
    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)        
Exemple #6
0
    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]
Exemple #11
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
Exemple #12
0
    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 = []