114 lines
3.4 KiB
C#
114 lines
3.4 KiB
C#
using System.Linq;
|
|
using System.Numerics;
|
|
using Skeleton.Samples;
|
|
using Skeleton.Utils.Helpers;
|
|
|
|
namespace Skeleton.Test.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)
|
|
)
|
|
);
|
|
|
|
}
|
|
|
|
} |