예제 #1
0
 def test_matmul(self) -> None:
     self.assertEqual(rows((range(3), range(3, 6))) @ rows((range(6, 9), range(9, 12))), 145)
     self.assertEqual(row(range(5, -1, -1)) @ row(range(6)), 20)
     self.assertEqual(column(range(5, -1, -1)) @ column(range(6)), 20)
     self.assertEqual(vector(range(5, -1, -1)) @ vector(range(6)), 20)
     self.assertRaises(DimensionError, matmul, row(range(5)), column(range(5)))
     self.assertRaises(DimensionError, matmul, row(range(5)), row(range(6)))
예제 #2
0
 def test_1(self) -> None:
     field = ElectrostaticField()
     field.charges = [DiscreteCharge(vector((0, 0)), 1)]
     a = abs(field.force(DiscreteCharge(vector((1, 0)), 1)))
     field.charges = [DiscreteCharge(vector((0, 0)), 2)]
     b = abs(field.force(DiscreteCharge(vector((1, -1)), -2)))
     self.assertLess(a, b)
예제 #3
0
    def test_double_integrate(self) -> None:
        self.assertAlmostEqual(
            double_integrate(lambda x, y: x * y**2,
                             0,
                             1,
                             lambda x: 0,
                             pos,
                             steps=100,
                             integrator=MidpointIntegrator()), 1 / 15, 3)
        self.assertAlmostEqual(
            double_integrate(lambda x, y: x * y**2,
                             0,
                             1,
                             lambda x: 0,
                             pos,
                             steps=100,
                             integrator=TrapezoidIntegrator()), 1 / 15, 3)
        self.assertAlmostEqual(
            double_integrate(lambda x, y: x * y**2,
                             0,
                             1,
                             lambda x: 0,
                             pos,
                             steps=100,
                             integrator=SimpsonIntegrator()), 1 / 15)
        self.assertAlmostEqual(
            double_integrate(lambda x, y: x**2 * y,
                             0,
                             1,
                             lambda x: 0,
                             pos,
                             steps=100,
                             integrator=MidpointIntegrator()), 0.1, 4)
        self.assertAlmostEqual(
            double_integrate(lambda x, y: x**2 * y,
                             0,
                             1,
                             lambda x: 0,
                             pos,
                             steps=100,
                             integrator=TrapezoidIntegrator()), 0.1, 4)
        self.assertAlmostEqual(
            double_integrate(lambda x, y: x**2 * y,
                             0,
                             1,
                             lambda x: 0,
                             pos,
                             steps=100,
                             integrator=SimpsonIntegrator()), 0.1)

        self.assertIterableAlmostEqual(
            double_integrate(
                lambda x, y: vector((2 * y, 2 * x + y**2, 3 * x * y)),
                -10,
                1,
                lambda x: -2 * x,
                lambda x: x,
                steps=100,
            ), vector((-1001, -5497.25, 11248.875)))
예제 #4
0
 def test_add(self) -> None:
     self.assertEqual(
         rows((range(3), range(3, 6))) + rows((range(6, 9), range(9, 12))), rows(((6, 8, 10), (12, 14, 16))))
     self.assertEqual(row(range(5, -1, -1)) + row(range(6)), row((5,) * 6))
     self.assertEqual(column(range(5, -1, -1)) + column(range(6)), column((5,) * 6))
     self.assertEqual(vector(range(5, -1, -1)) + vector(range(6)), vector((5,) * 6))
     self.assertRaises(TypeError, add, row(range(5)), 5)
     self.assertRaises(DimensionError, add, row(range(5)), column(range(5)))
     self.assertRaises(DimensionError, add, row(range(5)), row(range(6)))
     self.assertRaises(DimensionError, add, row(range(5)), vector(range(5)))
예제 #5
0
    def test_getitem(self) -> None:
        self.assertEqual(rows((range(3), range(3, 6)))[4], 4)
        self.assertEqual(row(range(6))[4], 4)
        self.assertEqual(column(range(6))[4], 4)
        self.assertEqual(vector(range(6))[4], 4)

        self.assertIterableEqual(rows((range(3), range(3, 6)))[2:5], range(2, 5))
        self.assertIterableEqual(row(range(6))[2:5], range(2, 5))
        self.assertIterableEqual(column(range(6))[2:5], range(2, 5))
        self.assertIterableEqual(vector(range(6))[2:5], range(2, 5))
예제 #6
0
 def test_2(self) -> None:
     field = ElectrostaticField()
     field.charges = [
         DiscreteCharge(vector((0, 0)), 2),
         DiscreteCharge(vector((0.5, sqrt(1 - 0.5**2))), -1)
     ]
     e = field.intensity(vector((1, 0)))
     self.assertGreater(e[0], 0)
     self.assertGreater(e[1], 0)
     self.assertLess(e[1], e[0])
예제 #7
0
 def test_3(self) -> None:
     q, a = -1e-9, 1
     field = ElectrostaticField()
     field.charges = [
         DiscreteCharge(vector((a, 0, 0)), q),
         DiscreteCharge(vector((0, a, 0)), q),
         DiscreteCharge(vector((0, 0, a)), q),
     ]
     self.assertIterableAlmostEqual(field.intensity(zero_vector(3)),
                                    repeat(8.987551792261172, 3))
     self.assertIterableAlmostEqual(field.intensity(vector((0, 0, 100))),
                                    (0, 0, -0.0027142443154663546), 4)
예제 #8
0
    def test_triple_integrate(self) -> None:
        self.assertAlmostEqual(
            triple_integrate(
                lambda x, y, z: sin(x) * cos(y) * z,
                -5,
                1,
                lambda x: -10,
                pos,
                lambda x, y: -x * y * 2,
                mul,
                steps=50,
                integrator=MidpointIntegrator(),
            ), 1289.4240604730014, -1)
        self.assertAlmostEqual(
            triple_integrate(
                lambda x, y, z: sin(x) * cos(y) * z,
                -5,
                1,
                lambda x: -10,
                pos,
                lambda x, y: -x * y * 2,
                mul,
                steps=50,
                integrator=TrapezoidIntegrator(),
            ), 1289.4240604730014, -1)
        self.assertAlmostEqual(
            triple_integrate(
                lambda x, y, z: sin(x) * cos(y) * z,
                -5,
                1,
                lambda x: -10,
                pos,
                lambda x, y: -x * y * 2,
                mul,
                steps=50,
                integrator=SimpsonIntegrator(),
            ), 1289.4240604730014, 3)

        self.assertIterableAlmostEqual(
            triple_integrate(
                lambda x, y, z: vector((1**(x * y * z), x + y + z, x * y * z)),
                -1,
                2,
                lambda x: -x,
                lambda x: 2 * x,
                lambda x, y: -x * y,
                lambda x, y: 2 * x * y,
                steps=10,
            ), vector((16.875, 136.35, 179.296875)), 0)
예제 #9
0
 def test_mul(self) -> None:
     self.assertEqual(
         rows((range(3), range(3, 6))) * rows((range(2), range(2, 4), range(4, 6))), rows(((10, 13), (28, 40))))
     self.assertEqual(row(range(5, -1, -1)) * column(range(6)), singleton_matrix(20))
     self.assertEqual(column(range(6)) * row(range(6)), rows((
         (0,) * 6, range(6), range(0, 12, 2), range(0, 18, 3), range(0, 24, 4), range(0, 30, 5),
     )))
     self.assertEqual(row(range(5, -1, -1)) * vector(range(6)), singleton_vector(20))
     self.assertRaises(DimensionError, mul, row(range(5)), row(range(5)))
     self.assertRaises(DimensionError, mul, row(range(5)), column(range(6)))
예제 #10
0
    def test_integrate(self) -> None:
        self.assertAlmostEqual(
            integrate(lambda x: x**2,
                      -1,
                      1,
                      steps=100,
                      integrator=MidpointIntegrator()), 2 / 3, 3)
        self.assertAlmostEqual(
            integrate(lambda x: x**2,
                      -1,
                      1,
                      steps=100,
                      integrator=TrapezoidIntegrator()), 2 / 3, 3)
        self.assertAlmostEqual(
            integrate(lambda x: x**2,
                      -1,
                      1,
                      steps=100,
                      integrator=SimpsonIntegrator()), 2 / 3)
        self.assertAlmostEqual(
            integrate(sin,
                      0,
                      2 * pi,
                      steps=100,
                      integrator=MidpointIntegrator()), 0)
        self.assertAlmostEqual(
            integrate(sin,
                      0,
                      2 * pi,
                      steps=100,
                      integrator=TrapezoidIntegrator()), 0)
        self.assertAlmostEqual(
            integrate(sin,
                      0,
                      2 * pi,
                      steps=100,
                      integrator=SimpsonIntegrator()), 0)

        self.assertIterableAlmostEqual(
            integrate(lambda x: vector((0, 2 * x, 3 * x**2)), -1, 1,
                      steps=100), vector((0, 0, 2)))
예제 #11
0
 def test_w(self) -> None:
     self.assertEqual(vector(range(1, 1)).w, 0)
     self.assertEqual(vector(range(1, 2)).w, 0)
     self.assertEqual(vector(range(1, 3)).w, 0)
     self.assertEqual(vector(range(1, 4)).w, 0)
     self.assertEqual(vector(range(1, 5)).w, 4)
     self.assertEqual(vector(range(1, 6)).w, 4)
예제 #12
0
    def test_parallel_to(self) -> None:
        self.assertTrue(vector((1, 0, 0)).parallel_to(vector((100, 0, 0))))
        self.assertTrue(vector((1, 0, 0)).parallel_to(vector((-100, 0, 0))))
        self.assertFalse(vector((1, 0, 0)).parallel_to(vector((-100, 1, 0))))

        self.assertTrue(i.parallel_to(i))
        self.assertFalse(i.parallel_to(j))
        self.assertFalse(i.parallel_to(k))
        self.assertFalse(j.parallel_to(i))
        self.assertTrue(j.parallel_to(j))
        self.assertFalse(j.parallel_to(k))
        self.assertFalse(k.parallel_to(i))
        self.assertFalse(k.parallel_to(j))
        self.assertTrue(k.parallel_to(k))
예제 #13
0
 def test_pos(self) -> None:
     self.assertEqual(+rows((range(3), range(3, 6))), rows((range(3), range(3, 6))))
     self.assertEqual(+row(range(6)), row(range(6)))
     self.assertEqual(+column(range(6)), column(range(6)))
     self.assertEqual(+vector(range(6)), vector(range(6)))
예제 #14
0
 def test_div(self) -> None:
     self.assertEqual(rows((range(0, 15, 5), range(15, 30, 5))) / 5, rows((range(3), range(3, 6))))
     self.assertEqual(row(range(25, -1, -5)) / 5, row(range(5, -1, -1)))
     self.assertEqual(column(range(25, -1, -5)) / 5, column(range(5, -1, -1)))
     self.assertEqual(vector(range(25, -1, -5)) / 5, vector(range(5, -1, -1)))
예제 #15
0
 def test_rmul(self) -> None:
     self.assertEqual(5 * rows((range(3), range(3, 6))), rows((range(0, 15, 5), range(15, 30, 5))))
     self.assertEqual(5 * row(range(5, -1, -1)), row(range(25, -1, -5)))
     self.assertEqual(5 * column(range(5, -1, -1)), column(range(25, -1, -5)))
     self.assertEqual(5 * vector(range(5, -1, -1)), vector(range(25, -1, -5)))
예제 #16
0
 def test_sub(self) -> None:
     self.assertEqual(
         rows((range(3), range(3, 6))) - rows((range(6, 9), range(9, 12))), rows(((-6, -6, -6), (-6, -6, -6))))
     self.assertEqual(row(range(5, -1, -1)) - row(range(6)), row(range(5, -6, -2)))
     self.assertEqual(column(range(5, -1, -1)) - column(range(6)), column(range(5, -6, -2)))
     self.assertEqual(vector(range(5, -1, -1)) - vector(range(6)), vector(range(5, -6, -2)))
예제 #17
0
 def test_norm(self) -> None:
     self.assertAlmostEqual(norm(row((1 / sqrt(2), 1 / sqrt(2)))), 1)
     self.assertAlmostEqual(norm(column((1, 0, 0))), 1)
     self.assertAlmostEqual(norm(vector(range(5))), abs(vector(range(5))))
     self.assertAlmostEqual(norm(identity_matrix(2)), sqrt(2))
예제 #18
0
 def test_one_vector(self) -> None:
     self.assertEqual(one_vector(0), empty_vector())
     self.assertEqual(one_vector(5), vector((1,) * 5))
예제 #19
0
 def test_zero_vector(self) -> None:
     self.assertEqual(zero_vector(0), empty_vector())
     self.assertEqual(zero_vector(5), vector((0,) * 5))
예제 #20
0
 def test_unit(self) -> None:
     self.assertIterableAlmostEqual(vector((1, 1)).unit, vector((1 / sqrt(2), 1 / sqrt(2))))
     self.assertIterableAlmostEqual(vector((100, 0)).unit, vector((1, 0)))
     self.assertIterableAlmostEqual(vector((0, 100, 0)).unit, j)
예제 #21
0
 def test_vector(self) -> None:
     self.assertEqual(vector(range(5)).dimensions, (5,))
예제 #22
0
 def test_projection_on(self) -> None:
     self.assertIterableAlmostEqual(vector((1, 1, 1)).projection_on(i), vector((1, 0, 0)))
     self.assertIterableAlmostEqual(vector((100, 100, 100)).projection_on(i), vector((100, 0, 0)))
     self.assertIterableAlmostEqual(vector((100, 100, 100)).projection_on(j), vector((0, 100, 0)))
     self.assertIterableAlmostEqual(vector((100, 100, 100)).projection_on(k), vector((0, 0, 100)))
예제 #23
0
 def test_angle_between(self) -> None:
     self.assertAlmostEqual(vector((1, 0)).angle_between(vector((0, 10))), pi / 2)
     self.assertAlmostEqual(vector((1, 0)).angle_between(vector((1000, 0))), 0)
     self.assertAlmostEqual(vector((1, 0)).angle_between(vector((-1000, 0))), pi)
예제 #24
0
 def test_neg(self) -> None:
     self.assertEqual(-rows((range(3), range(3, 6))), rows((range(0, -3, -1), range(-3, -6, -1))))
     self.assertEqual(-row(range(6)), rows((range(0, -6, -1),)))
     self.assertEqual(-column(range(6)), rows(tuple((-x,) for x in range(6))))
     self.assertEqual(-vector(range(6)), vector(range(0, -6, -1)))
예제 #25
0
 def test_singleton_vector(self) -> None:
     self.assertEqual(singleton_vector(5), vector((5,)))
     self.assertEqual(singleton_vector(0), vector((0,)))
     self.assertEqual(singleton_vector(10), vector((10,)))
예제 #26
0
 def test_full_vector(self) -> None:
     self.assertEqual(full_vector(int, 5), vector(range(5)))