using System.Linq; using System.Numerics; using Skeleton.Samples; using Skeleton.Utils.Helpers; namespace SkeletonTest.tests; public static class JordanPowerTest { private static readonly Complex ii = new Complex(0, 1); [DatapointSource] public static readonly Complex[] Basic0TestData = 10.ScaleSamples(-1, 1).UCSamples().ToArray(); [Theory] public static void J22TestBasic0(Complex eigenValue) { C22 block = new( eigenValue, 1, 0, eigenValue ); Assert.IsTrue(AlgebraHelper.JordanBlock2Power(eigenValue, 0).IsEqualApprox(C22.One)); Assert.IsTrue( ( AlgebraHelper.JordanBlock2Power(eigenValue, 3.4d) * AlgebraHelper.JordanBlock2Power(eigenValue, -3.4d) ).IsEqualApprox(C22.One) ); Assert.IsTrue( ( AlgebraHelper.JordanBlock2Power(eigenValue, -2 - ii) * AlgebraHelper.JordanBlock2Power(eigenValue, 2 + ii) ).IsEqualApprox(C22.One) ); } [Test] public static void J22TestBasic1() { C22 u2 = new( 1 + 2 * ii, 1, 0, 1 + 2 * ii ); Complex eigenValue = 1 + 2 * ii; Assert.IsTrue(AlgebraHelper.JordanBlock2Power(eigenValue, 3 - ii).IsEqualApprox(new C22( (-11 - 2 * ii) * Complex.Pow(1 + 2 * ii, -ii), (-5 + 15 * ii) * Complex.Pow(1 + 2 * ii, -ii), 0, (-11 - 2 * ii) * Complex.Pow(1 + 2 * ii, -ii) ))); Assert.IsTrue(AlgebraHelper.JordanBlock2Power(eigenValue, 2).IsEqualApprox(u2*u2)); } [Test] public static void J22TestBasic2() { Assert.IsTrue(AlgebraHelper.JordanBlock2Power(0, 2).IsEqualApprox(C22.Zero)); Assert.IsTrue(AlgebraHelper.JordanBlock2Power(0, 0).IsEqualApprox(C22.One)); } [Theory] public static void J33TestBasic0(Complex eigenValue) { C33 uw = new( eigenValue, 1, 0, 0, eigenValue, 1, 0, 0, eigenValue ); Assert.IsTrue( ( AlgebraHelper.JordanBlock3Power(eigenValue, 4.2) * AlgebraHelper.JordanBlock3Power(eigenValue, -4.2) ).IsEqualApprox(C33.One) ); Assert.IsTrue(AlgebraHelper.JordanBlock3Power(eigenValue, 2).IsEqualApprox(uw * uw)); } [Test] public static void J33TestBasic1() { C33 ux = new( 0, 1, 0, 0, 0, 1, 0, 0, 0 ); Assert.IsTrue(AlgebraHelper.JordanBlock3Power(0, 0).IsEqualApprox(C33.One)); Assert.IsTrue(AlgebraHelper.JordanBlock3Power(0, 1).IsEqualApprox(ux)); Assert.IsTrue(AlgebraHelper.JordanBlock3Power(0, 2).IsEqualApprox(new C33( 0, 0, 1, 0, 0, 0, 0, 0, 0 ))); Assert.IsTrue(AlgebraHelper.JordanBlock3Power(0, 3).IsEqualApprox(C33.Zero)); } [Theory] public static void J44Test(Complex eigenValue) { C44 uf = new( eigenValue, 1, 0, 0, 0, eigenValue, 1, 0, 0, 0, eigenValue, 1, 0, 0, 0, eigenValue ); Assert.IsTrue(AlgebraHelper.JordanBlock4Power(eigenValue, 0).IsEqualApprox(C44.One)); Assert.IsTrue(AlgebraHelper.JordanBlock4Power(eigenValue, 1).IsEqualApprox(uf)); Assert.IsTrue(AlgebraHelper.JordanBlock4Power(eigenValue, 2).IsEqualApprox(uf * uf)); Assert.IsTrue(AlgebraHelper.JordanBlock4Power(eigenValue, 3).IsEqualApprox(uf * uf * uf)); Assert.IsTrue(AlgebraHelper.JordanBlock4Power(eigenValue, 4).IsEqualApprox(uf * uf * uf * uf)); Assert.IsTrue( ( uf * AlgebraHelper.JordanBlock4Power(eigenValue, 1.4) ).IsEqualApprox( AlgebraHelper.JordanBlock4Power(eigenValue, 2.4) ) ); } }