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); } } } }
public void ComplexColumnVectorArithmetic() { ComplexColumnVector u = new ComplexColumnVector(Complex.I, Complex.Zero, Complex.One); Assert.IsTrue(u.Dimension == 3); Assert.IsTrue(1.0 * u == u); }
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); }
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; } }
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); }
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)); } }
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); }
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)); } }