Files
Skeleton.Test/tests/JordanPowerTest.cs
2024-11-30 20:11:27 +00:00

118 lines
3.4 KiB
C#

using System.Linq;
using System.Numerics;
using Skeleton.Samples;
using Skeleton.Utils.Helpers;
namespace Skeleton.Test;
[TestFixture]
public class JordanPowerTest : BaseTest
{
private static readonly Complex ii = new Complex(0, 1);
[DatapointSource]
public static readonly Complex[] Basic0TestData = 10
.WithSeed(Seed)
.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)
)
);
}
}