Пример #1
0
class TestScene:
    def setup_method(self):
        self.body = BodyT([1, 1, 1], [2, 2, 2], [1, 1, 1])
        self.test_scene = Scene(self.body, self.Fx, self.Fy, 0, 0)
        self.g = 9.81
        self.m = 1
        self.circle = CircleT(1, 2, 1, 1)

    def Fx(self, t):
        return 5 if t < 5 else 0

    def Fy(self, t):
        return -self.g * self.m if t < 3 else self.g * self.m

    def teardown_method(self):
        self.test_scene = None
        self.body = None
        self.m = None
        self.g = None

    def test_get_shape(self):
        assert self.test_scene.get_shape() == self.body

    def test_get_init_velo(self):
        x, y = self.test_scene.get_init_velo()
        assert x == 0 and y == 0

    def test_set_shape(self):
        self.test_scene.set_shape(self.circle)
        assert self.test_scene.get_shape() == self.circle

    def test_set_init_velo(self):
        self.test_scene.set_init_velo(0, 1)
        x, y = self.test_scene.get_init_velo()
        assert x == 0 and y == 1

    def test_sim(self):
        x, y = self.test_scene.sim(2, 2)
        a = [0.0, 2.0]
        b = [[1.0, 2., 0.0, 0.0],
             [4.333333335602872, -4.540000004452837, 3.333333333333334, -6.54]]
        temp1 = x
        temp2 = y
        for i in range(len(x)):
            temp1[i] -= a[i]
        assert abs(max(temp1)) / abs(max(a)) < 0.0001

        for i in range(len(y)):
            for j in range(len(y[i])):
                temp2[i][j] -= b[i][j]

        for i in range(len(y)):
            assert abs(max(temp2[i])) / abs(max(b[i])) < 0.0001
Пример #2
0
def test_Scene_set_init_velo_1():
    x = randrange(-10e6, 10e6)
    y = randrange(-10e6, 10e6)
    s = randrange(1, 10e6)
    m = randrange(1, 10e6)

    v_x = randrange(-10e6, 10e6)
    v_y = randrange(-10e6, 10e6)

    def F_x(t):
        return randrange(-50, 50) * t + randrange(-50, 50)

    def F_y(t):
        return randrange(-50, 50) * t + randrange(-50, 50)

    t = TriangleT(x, y, s, m)

    scene = Scene(t, F_x, F_y, v_x, v_y)

    new_v_x = randrange(-10e6, 10e6)
    new_v_y = randrange(-10e6, 10e6)

    scene.set_init_velo(new_v_x, new_v_y)

    assert scene.get_init_velo() == (new_v_x, new_v_y)
Пример #3
0
def test_Scene_sim_4():
    x = randrange(-10e6, 10e6)
    y = randrange(-10e6, 10e6)
    s = randrange(1, 10e6)
    m = randrange(1, 10e6)

    v_x = randrange(-10e6, 10e6)
    v_y = randrange(-10e6, 10e6)

    t_final = randrange(1, 1000)
    nsteps = randrange(100, 100000)

    def F_x(t):
        if t > 100:
            return 0
        else:
            return t**2

    def F_y(t):
        if t < 40:
            return -9.81 * m
        else:
            return 9.81 * m

    t = TriangleT(x, y, s, m)

    scene = Scene(t, F_x, F_y, v_x, v_y)

    mass = scene.get_shape().mass()

    def ode(w, t):
        return w[2], w[3], F_x(t) / mass, F_y(t) / mass

    cm_x = scene.get_shape().cm_x()
    cm_y = scene.get_shape().cm_y()

    results = scene.sim(t_final, nsteps)
    t_result = results[0]
    w_result = results[1]
    v = scene.get_init_velo()

    t_calc = [i * t_final / (nsteps - 1) for i in range(nsteps)]
    w_calc = sp.odeint(ode, [cm_x, cm_y, v[0], v[1]], t_calc)

    w_success = True
    for i, j in zip(w_calc, w_result):
        for a, b in zip(i, j):
            if not math.isclose(a, b, rel_tol=0.0001):
                w_success = False

    assert t_result == t_calc and w_success
Пример #4
0
class TestSceneT():
    def setup_method(self, method):
        self.circle1 = CircleT(1, 2, 4, 9)
        self.triangle1 = TriangleT(2, 7, 3, 4)
        self.scene1 = Scene(self.circle1, Fx, Fy, 0, 0)
        self.scene2 = Scene(self.triangle1, Fx, Fy, 0, 0)

    def teardown_method(self, method):
        self.circle1 = None
        self.triangle1 = None
        self.scene1 = None
        self.scene = None

    def test_get_shape(self):
        assert self.scene1.get_shape() == self.circle1

    def test_get_shape2(self):
        assert self.scene2.get_shape() == self.triangle1

    def test_get_unbal_forces(self):
        assert self.scene1.get_unbal_forces() == (Fx, Fy)

    def test_get_init_velo(self):
        assert self.scene1.get_init_velo() == (0, 0)

    def test_set_shape(self):
        self.scene1.set_shape(self.triangle1)
        assert self.scene1.get_shape() == self.triangle1

    def test_set_unbal_forces(self):
        self.scene1.set_unbal_forces(Fx2, Fy2)
        assert self.scene1.get_unbal_forces() == (Fx2, Fy2)

    def test_set_init_velo(self):
        self.scene1.set_init_velo(2, 10)
        assert self.scene1.get_init_velo() == (2, 10)

    def test_sim(self):
        t, wsol = self.scene1.sim(5, 3)
        t_expec = [0, 2.5, 5]
        wsol_expec = [[1, 2, 0, 0], [1, -25.25, 0, -21.8], [1, -107, 0, -43.6]]

        for i in range(len(t)):
            if t_expec[i] == 0:
                assert t[i] == t_expec[i]
            else:
                assert (t[i] - t_expec[i]) / t_expec[i] < epsilon

        for j in range(len(wsol)):
            for i in range(len(wsol[j])):
                if wsol_expec[j][i] == 0:
                    assert wsol[j][i] == wsol_expec[j][i]
                else:
                    assert (wsol[j][i] -
                            wsol_expec[j][i]) / wsol_expec[j][i] < epsilon

    def test_sim2(self):
        t, wsol = self.scene2.sim(4, 5)
        t_expec = [0.0, 1.0, 2.0, 3.0, 4.0]
        wsol_expec = [[2, 7, 0, 0], [2, -2.81, 0, -19.62],
                      [2, -32.24, 0, -39.24], [2, -81.29, 0, -58.86],
                      [2, -149.96, 0, -78.48]]

        for i in range(len(t)):
            if t_expec[i] == 0:
                assert t[i] == t_expec[i]
            else:
                assert (t[i] - t_expec[i]) / t_expec[i] < epsilon

        for j in range(len(wsol)):
            for i in range(len(wsol[j])):
                if wsol_expec[j][i] == 0:
                    assert wsol[j][i] == wsol_expec[j][i]
                else:
                    assert (wsol[j][i] -
                            wsol_expec[j][i]) / wsol_expec[j][i] < epsilon
Пример #5
0
# cm should be (0, 0)

b2 = BodyT([11, 9, 9, 11], [11, 11, 9, 9], [10, 10, 10, 10])
print(b2.cm_x(), b2.cm_y(), b2.mass(), b2.m_inert())
# cm for b2 should be shifted to 10, 10; b.m_inert() should be equal to b2.m_inert()

lst = [c, t, b, b2]
for s in lst:
    print(s.cm_x(), s.cm_y(), s.mass(), s.m_inert())

S = Scene(c, Fx, Fy, 0, 0)

# exercise interface for Scene
S.get_shape()
S.get_unbal_forces()
S.get_init_velo()

# exercise setters for Scene
S.set_shape(c)
S.set_unbal_forces(Fx, Fy)
S.set_init_velo(0, 0)

t, wsol = S.sim(10, 100)

for t1, w1 in zip(t, wsol):
    print("t=", t1, "rx=", w1[0], "ry=", w1[1], "vx=", w1[2], "vy=", w1[3])

# extract ry values
print(wsol[0:, 1])

#plot(wsol, t)