public static LorentzMatrixUL Matrix(EuclideanVector3 velocity)
        {
            return(new LorentzMatrixUL((i, j) =>
            {
                Symbol gamma = LorentzTransform.Gamma(velocity);

                if (i == 0)
                {
                    if (j == 0)
                    {
                        return gamma;
                    }

                    return -gamma * velocity[j - 1];
                }

                if (j == 0)
                {
                    return -gamma * velocity[i - 1];
                }

                Symbol symbol = (gamma - 1) * velocity[i - 1] * velocity[j - 1] / velocity.InvariantScalar;
                if (i == j)
                {
                    symbol = 1 + symbol;
                }
                return symbol;
            }));
        }
Esempio n. 2
0
        static void TestFieldTransforms(EuclideanVector3 E, EuclideanVector3 B, EuclideanVector3 Ep, EuclideanVector3 Bp, EuclideanVector3 v)
        {
            Symbol gamma = LorentzTransform.Gamma(v);

            Assert.AreEqual(Ep.ParallelComponent(v), E.ParallelComponent(v), "E Parallel component:");
            Assert.AreEqual(Ep.PerpendicularComponent(v), gamma * (E + v.Cross(B)).PerpendicularComponent(v), "E Perpendicular component:");
            Assert.AreEqual(Bp.ParallelComponent(v), B.ParallelComponent(v), "B Parallel component:");
            Assert.AreEqual(Bp.PerpendicularComponent(v), gamma * (B - v.Cross(E)).PerpendicularComponent(v), "B Perpendicular component:");
        }
Esempio n. 3
0
 public RelativisticParticle(Symbol mass, EuclideanVector3 position, Variable time)
 {
     this.Mass = mass;
     this.Position = new LorentzVectorU(time, position);
     Operator dt = new Derivative(time);
     EuclideanVector3 v = dt * position;
     this.Gamma = LorentzTransform.Gamma(v);
     this.Velocity = this.Gamma * new LorentzVectorU(Symbol.One, v);
     this.InvariantTimeDerivative = this.Gamma * dt;
 }
Esempio n. 4
0
        static void TestLorentzTransform(EuclideanVector3 v)
        {
            LorentzVectorVariableU x0 = new LorentzVectorVariableU("t", "x", "y", "z");

            LorentzVectorU x1 = x0.Transform(v);
            LorentzVectorU x2 = x1.Transform(-v);

            Assert.AreEqual(x0, x2);
            Assert.AreEqual(LorentzMatrixUL.One, LorentzTransform.Matrix(v) * LorentzTransform.Matrix(-v));
        }
Esempio n. 5
0
        static void CompareInvariantScalars(ElectromagneticField field1, ElectromagneticField field2)
        {
            EuclideanVector3 E1 = field1.ElectricField;
            EuclideanVector3 B1 = field1.MagneticField;
            EuclideanVector3 E2 = field2.ElectricField;
            EuclideanVector3 B2 = field2.MagneticField;

            //Symbol comparison failure
            // Expected:<2(y^2+z^2)^-1>. Actual:<2(-v^2+1)^-1*(y^2+z^2)^-2*(z^2+v^2*(-z^2-y^2)+y^2)>.
            //Assert.AreEqual(field1.FieldStrengthTensor.InvariantScalar, field2.FieldStrengthTensor.InvariantScalar);
            Assert.AreEqual(field1.FieldStrengthTensor.Dot(field1.DualFieldStrengthTensor), field2.FieldStrengthTensor.Dot(field2.DualFieldStrengthTensor));
        }
Esempio n. 6
0
        static void TestMaxwellsEquations(ElectromagneticField F)
        {
            Operator dt = F.Del.Scalar;
            EuclideanVector3Operator del    = F.Del.Vector;
            Symbol           chargeDensity  = F.CurrentDensity.Scalar;
            EuclideanVector3 currentDensity = F.CurrentDensity.Vector;

            Assert.AreEqual(del.Dot(F.ElectricField), chargeDensity, "Gauss' Law:");
            Assert.AreEqual(del.Dot(F.MagneticField), Symbol.Zero, "Gauss' Law for Magnetism:");
            Assert.AreEqual(del.Cross(F.ElectricField) + dt * F.MagneticField, EuclideanVector3.Zero, "Faraday's Law of Induction");
            Assert.AreEqual(del.Cross(F.MagneticField) - dt * F.ElectricField, currentDensity, "Ampere's Law");
        }
Esempio n. 7
0
 static void TestFieldStrength(LorentzMatrixUU F, EuclideanVector3 E, EuclideanVector3 B)
 {
     Assert.AreEqual(F[0, 0], Symbol.Zero, "F[0, 0]");
     Assert.AreEqual(F[0, 1], E[0], "F[0, 1]");
     Assert.AreEqual(F[0, 2], E[1], "F[0, 2]");
     Assert.AreEqual(F[0, 3], E[2], "F[0, 3]");
     Assert.AreEqual(F[1, 0], -E[0], "F[1, 0]");
     Assert.AreEqual(F[1, 1], Symbol.Zero, "F[1, 1]");
     Assert.AreEqual(F[1, 2], B[2], "F[1, 2]");
     Assert.AreEqual(F[1, 3], -B[1], "F[1, 3]");
     Assert.AreEqual(F[2, 0], -E[1], "F[2, 0]");
     Assert.AreEqual(F[2, 1], -B[2], "F[2, 1]");
     Assert.AreEqual(F[2, 2], Symbol.Zero, "F[2, 2]");
     Assert.AreEqual(F[2, 3], B[0], "F[2, 3]");
     Assert.AreEqual(F[3, 0], -E[2], "F[3, 0]");
     Assert.AreEqual(F[3, 1], B[1], "F[3, 1]");
     Assert.AreEqual(F[3, 2], -B[0], "F[3, 2]");
     Assert.AreEqual(F[3, 3], Symbol.Zero, "F[3, 3]");
 }
Esempio n. 8
0
 public LorentzVectorOperatorU Transform(EuclideanVector3 velocity)
 {
     return(LorentzTransform.Matrix(velocity) * this);
 }
Esempio n. 9
0
 public RelativisticParticle Transform(EuclideanVector3 velocity)
 {
     LorentzMatrixUL L = LorentzTransform.Matrix(velocity);
     return new RelativisticParticle(this.Mass, L * this.Position, this.InvariantTimeDerivative);
 }
Esempio n. 10
0
        static void TestPotential(Func <LorentzVectorVariableU, LorentzVectorU> createPotential, EuclideanVector3 v)
        {
            LorentzVectorVariableU coordinates = new LorentzVectorVariableU("t", "x", "y", "z");

            LorentzVectorU         potential = createPotential(coordinates);
            LorentzVectorOperatorL del       = coordinates.Del;

            ElectromagneticField field0 = new ElectromagneticField(potential, del);

            TestField(field0);

            ElectromagneticField field1 = field0.Transform(v);

            TestField(field1);
            TestFieldTransforms(field0.ElectricField, field0.MagneticField, field1.ElectricField, field1.MagneticField, v);
            CompareInvariantScalars(field0, field1);

            ElectromagneticField field2 = field1.Transform(-v);

            TestField(field2);
            TestFieldTransforms(field1.ElectricField, field1.MagneticField, field2.ElectricField, field2.MagneticField, -v);
            CompareInvariantScalars(field1, field2);

            Assert.AreEqual(field0.Potential, field2.Potential, "A dual transform");
            Assert.AreEqual(field0.Del.ToString(), field2.Del.ToString(), "Del dual transform");
            Assert.AreEqual(field0.ElectricField, field2.ElectricField, "E dual transform");
            Assert.AreEqual(field0.MagneticField, field2.MagneticField, "B dual transform");
            Assert.AreEqual(field0.CurrentDensity, field2.CurrentDensity, "J dual transform");
        }
Esempio n. 11
0
        public ElectromagneticField Transform(EuclideanVector3 velocity)
        {
            LorentzMatrixUL L = LorentzTransform.Matrix(velocity);

            return(new ElectromagneticField(L * this.Potential, L.Invert() * this.Del));
        }
 public static Symbol Gamma(EuclideanVector3 velocity)
 {
     return(1 / Functions.Sqrt(1 - velocity.Dot(velocity)));
 }