コード例 #1
0
        public void SquareUnitMatrixEigensystem()
        {
            int          d = 3;
            SquareMatrix I = UnitMatrix.OfDimension(d).ToSquareMatrix();
            ComplexEigendecomposition E = I.Eigendecomposition();

            Assert.IsTrue(E.Dimension == d);
            for (int i = 0; i < d; i++)
            {
                Complex val = E.Eigenpairs[i].Eigenvalue;
                Assert.IsTrue(val == 1.0);
                ComplexColumnVector vec = E.Eigenpairs[i].Eigenvector;
                for (int j = 0; j < d; j++)
                {
                    if (i == j)
                    {
                        Assert.IsTrue(vec[j] == 1.0);
                    }
                    else
                    {
                        Assert.IsTrue(vec[j] == 0.0);
                    }
                }
            }
        }
コード例 #2
0
        public void ComplexColumnVectorArithmetic()
        {
            ComplexColumnVector u = new ComplexColumnVector(Complex.I, Complex.Zero, Complex.One);

            Assert.IsTrue(u.Dimension == 3);

            Assert.IsTrue(1.0 * u == u);
        }
コード例 #3
0
        public void ComplexColumnVectorManipulations()
        {
            ComplexColumnVector u = new ComplexColumnVector(3);

            u[0] = Complex.I;
            u[2] = Complex.One;
            Assert.IsTrue(u.Dimension == 3);

            ComplexColumnVector v = u.Copy();

            Assert.IsTrue(v == u);
            v[0] += 1.0;
            Assert.IsTrue(v != u);
        }
コード例 #4
0
        public void ComplexColunVectorAsMatrix()
        {
            ComplexColumnVector u = new ComplexColumnVector(Complex.I, Complex.Zero, Complex.One);

            Assert.IsTrue(u.ColumnCount == 1);
            Assert.IsTrue(u.RowCount == u.Dimension);

            for (int r = 0; r < u.Dimension; r++)
            {
                Assert.IsTrue(u[r, 0] == u[r]);
            }

            for (int r = 0; r < u.Dimension; r++)
            {
                u[r, 0] = 0.0;
            }
        }
コード例 #5
0
        public void ComplexVector()
        {
            ComplexColumnVector v = new ComplexColumnVector(
                Complex.One, Complex.Zero, Complex.I
                );

            Assert.IsTrue(v.Dimension == 3);
            Assert.IsTrue(v[2] == Complex.I);

            ComplexColumnVector v2 = 2.0 * v;

            Assert.IsTrue(v2[1] == 0.0);

            ComplexColumnVector vi = Complex.I * v;

            Assert.IsTrue(vi[2] == -1.0);

            v[1] += 1.0;
            Assert.IsTrue(v[1] == 1.0);
        }
コード例 #6
0
 public void SquareRandomMatrixEigenvalues()
 {
     for (int d = 1; d <= 67; d = d + 11)
     {
         SquareMatrix M              = CreateSquareRandomMatrix(d, d);
         double       tr             = M.Trace();
         DateTime     start          = DateTime.Now;
         ComplexEigendecomposition E = M.Eigendecomposition();
         DateTime finish             = DateTime.Now;
         Console.WriteLine("d={0} t={1} ms", d, (finish - start).Milliseconds);
         Assert.IsTrue(E.Dimension == d);
         Complex[] es = new Complex[d];
         for (int i = 0; i < d; i++)
         {
             es[i] = E.Eigenpairs[i].Eigenvalue;
             ComplexColumnVector v = E.Eigenpairs[i].Eigenvector;
             Assert.IsTrue(TestUtilities.IsNearlyEigenpair(M, v, es[i]));
         }
         Assert.IsTrue(TestUtilities.IsSumNearlyEqual(es, tr));
     }
 }
コード例 #7
0
ファイル: TestUtilities.cs プロジェクト: zyzhu/metanumerics
        public static bool IsNearlyEigenpair(AnySquareMatrix A, ComplexColumnVector v, Complex a)
        {
            int d = A.Dimension;

            // compute products

            /*
             * Complex[] Av = new Complex[d];
             * for (int i=0; i<d; i++) {
             *  Av[i] = 0.0;
             *  for (int j=0; j<d; j++) {
             *      Av[i] += A[i,j]*v[j];
             *  }
             * }
             */
            ComplexColumnVector Av = A * v;
            ComplexColumnVector av = a * v;

            // compute tolerance
            double N = A.MaxNorm();
            double n = 0.0;

            for (int i = 0; i < d; i++)
            {
                n += ComplexMath.Abs(v[i]);
            }
            double ep = TargetPrecision * (N * n / d + ComplexMath.Abs(a) * n);

            // compare elements within tolerance
            for (int i = 0; i < d; i++)
            {
                if (ComplexMath.Abs(Av[i] - av[i]) > ep)
                {
                    return(false);
                }
            }
            return(true);
        }
コード例 #8
0
 public void SquareVandermondeMatrixEigenvalues()
 {
     for (int d = 1; d <= 8; d++)
     {
         SquareMatrix H              = CreateVandermondeMatrix(d);
         double       tr             = H.Trace();
         ComplexEigendecomposition E = H.Eigendecomposition();
         double sum = 0.0;
         foreach (ComplexEigenpair pair in E.Eigenpairs)
         {
             double e = pair.Eigenvalue.Re;
             sum += e;
             ComplexColumnVector vc = pair.Eigenvector;
             ColumnVector        v  = new ColumnVector(d);
             for (int j = 0; j < d; j++)
             {
                 v[j] = vc[j].Re;
             }
             Assert.IsTrue(TestUtilities.IsNearlyEigenpair(H, v, e));
         }
         Assert.IsTrue(TestUtilities.IsNearlyEqual(tr, sum));
     }
 }