Files
Skeleton/src/Analysis/AnalyticFunctions/Polynomials/Implements/C2Polynomial.cs
2024-06-21 21:48:07 +08:00

74 lines
2.0 KiB
C#

using System.Numerics;
using Skeleton.Algebra.Extensions;
using Skeleton.Analysis.BivariantFunctions.Real.Implements;
using Skeleton.Analysis.BivariantFunctions.Real.PolynomialHelpers;
using Skeleton.Utils.Helpers;
namespace Skeleton.Analysis.AnalyticFunctions.Polynomials.Implements;
/// <summary>
/// </summary>
public class C2Polynomial : Polynomial
{
/// <inheritdoc />
public C2Polynomial()
{
Coefficients = new Complex[3];
Fix();
}
/// <inheritdoc />
public C2Polynomial(Complex a0, Complex a1, Complex a2)
{
Coefficients = new[] { a0, a1, a2 };
Fix();
}
/// <summary>
/// </summary>
public Complex A0 => Coefficients[0];
/// <summary>
/// </summary>
public Complex A1 => Coefficients[1];
/// <summary>
/// </summary>
public Complex A2 => Coefficients[2];
/// <inheritdoc />
public override string Representation =>
$"{A0.Real} + {A0.Imaginary}i + ({A1.Real} + {A1.Imaginary}i)x + ({A2.Real} + {A2.Imaginary}i)x2";
/// <inheritdoc />
public override int Dim => 2;
/// <inheritdoc />
public override Polynomial Derivative => new C1Polynomial(A1, A2 * 2);
/// <inheritdoc />
public override IEnumerable<Complex> Roots => Decorators.WithTol(1E-20,
() =>
{
if (A2.IsEqualApprox(0))
return new C1Polynomial(A0, A1).Roots;
if (A0.IsEqualApprox(0))
return new C1Polynomial(A1, A2).Roots.Concat(new[] { Complex.Zero });
Complex x1 = (-A1 + Complex.Sqrt(A1 * A1 - 4 * A2 * A0)) / (2 * A2);
Complex x2 = (-A1 - Complex.Sqrt(A1 * A1 - 4 * A2 * A0)) / (2 * A2);
return new[] { x1, x2 };
}
);
/// <inheritdoc />
public override BivariantContinuous Re => new PolyCHelper.PolyC2Re(A0, A1, A2);
/// <inheritdoc />
public override BivariantContinuous Im => new PolyCHelper.PolyC2Im(A0, A1, A2);
/// <inheritdoc />
public override Complex Evaluate(Complex x)
{
return A0 + x * (A1 + x * A2);
}
}