90 lines
2.7 KiB
C#
90 lines
2.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using Skeleton.Algebra.Extensions;
|
|
using Skeleton.DataStructure.Packs.MatrixDecompositions;
|
|
using Skeleton.Samples;
|
|
|
|
namespace Skeleton.Test.tests;
|
|
|
|
public class EigenDecompositionTest
|
|
{
|
|
private static readonly Complex I = Complex.ImaginaryOne;
|
|
[DatapointSource]
|
|
public static readonly C22[] DataPoints =
|
|
30.ScaleSamples(-1, 1).C22InvertibleSamples().ToArray();
|
|
|
|
[Theory]
|
|
public static void DecompositionIdentityTest(C22 data)
|
|
{
|
|
JDPair<C22> decomp = data.EigenDecomposition();
|
|
C22 J = decomp.J;
|
|
C22 D = decomp.D;
|
|
Assert.IsTrue((J * D * J.Inv()).IsEqualApprox(data));
|
|
}
|
|
|
|
[Theory]
|
|
public static void UnitaryDecompositionTest(C22 data)
|
|
{
|
|
U2 unitaryData = new U2(data);
|
|
Console.WriteLine(data.Representation);
|
|
Assert.IsTrue((unitaryData * unitaryData.Hermitian()).IsEqualApprox(U2.One));
|
|
Assert.IsTrue(unitaryData.Det().Magnitude.IsEqualApprox(1));
|
|
JDPair<C22> decomp = unitaryData.EigenDecomposition();
|
|
|
|
C22 J = decomp.J;
|
|
C22 D = decomp.D;
|
|
Assert.IsTrue(D.Property.IsDiagonal);
|
|
Assert.IsTrue((J * J.Hermitian()).IsEqualApprox(C22.One));
|
|
Assert.IsTrue((J * D * J.Inv()).IsEqualApprox(unitaryData));
|
|
}
|
|
|
|
[Test]
|
|
public static void DecompositionTest()
|
|
{
|
|
C22 a = new C22(I, 1, 1, I);
|
|
JDPair<C22> t = a.EigenDecomposition();
|
|
C22 J = t.J;
|
|
C22 D = t.D;
|
|
Assert.IsTrue((J * D * J.Inv()).IsEqualApprox(a));
|
|
}
|
|
|
|
[Test]
|
|
public static void UnitaryDecompositionCase0()
|
|
{
|
|
U2 m = new U2(
|
|
-0.08908708063747477 + 0.44543540318737385 * I, 0.3008484477213831 + 0.8385350351383227 * I,
|
|
-0.5345224838248488 + 0.7126966450997985 * I, 0.04608742177859454 - 0.45191277466233243 * I
|
|
);
|
|
JDPair<C22> t = m.EigenDecomposition();
|
|
C22 J = t.J;
|
|
C22 D = t.D;
|
|
|
|
Assert.IsTrue((J * D * J.Inv()).IsEqualApprox(m));
|
|
Assert.IsTrue((J * J.Hermitian()).IsEqualApprox(C22.One));
|
|
|
|
|
|
//C22 JH = J.Hermitian();
|
|
D.SwapRow(1, 2);
|
|
J.SwapColumn(1, 2);
|
|
Console.WriteLine((J.Hermitian()*m*J).Representation);
|
|
Console.WriteLine(" -- ");
|
|
Console.WriteLine(D.Representation);
|
|
//Assert.IsTrue((JH.Hermitian() * D * JH).IsEqualApprox(m));
|
|
|
|
|
|
}
|
|
|
|
[Test]
|
|
public static void UnitaryDecompositionCase1()
|
|
{
|
|
U2 m = new U2(
|
|
0.8666666666666667 - 0.8666666666666667 * I, -0.4 + 0.46666666666666656 * I,
|
|
-0.8666666666666667 - 0.6 * I, 0.6666666666666667
|
|
);
|
|
Assert.IsTrue((m * m.Hermitian()).IsEqualApprox(C22.One));
|
|
}
|
|
}
|
|
|
|
|