74 lines
2.0 KiB
C#
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);
|
|
}
|
|
} |