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; /// /// public class C2Polynomial : Polynomial { /// public C2Polynomial() { Coefficients = new Complex[3]; Fix(); } /// public C2Polynomial(Complex a0, Complex a1, Complex a2) { Coefficients = new[] { a0, a1, a2 }; Fix(); } /// /// public Complex A0 => Coefficients[0]; /// /// public Complex A1 => Coefficients[1]; /// /// public Complex A2 => Coefficients[2]; /// public override string Representation => $"{A0.Real} + {A0.Imaginary}i + ({A1.Real} + {A1.Imaginary}i)x + ({A2.Real} + {A2.Imaginary}i)x2"; /// public override int Dim => 2; /// public override Polynomial Derivative => new C1Polynomial(A1, A2 * 2); /// public override IEnumerable 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 }; } ); /// public override BivariantContinuous Re => new PolyCHelper.PolyC2Re(A0, A1, A2); /// public override BivariantContinuous Im => new PolyCHelper.PolyC2Im(A0, A1, A2); /// public override Complex Evaluate(Complex x) { return A0 + x * (A1 + x * A2); } }