public PolynomialND Evaluate(double Val, int Dim) // turn a ND Polynomial into a (N-1)D one { var OrderNew = (int [])Order.Clone(); OrderNew [Dim] = 1; int Length = Order [Dim]; var Id = new Index(OrderNew); var IdOld = new Index(Order); var ans = new PolynomialND(OrderNew); for (int i = 0; i < ans.Coefficients.Length; i++) { double LocalCoeff = 0; var sub = Id.Ind2Sub(i); int[] subAns = (int[])sub.Clone(); for (int j = 0; j < Length; j++) { int idx = IdOld.Sub2Ind(subAns); LocalCoeff = LocalCoeff + Math.Pow(Val, j) * Coefficients [idx]; subAns[Dim]++; } ans.Coefficients [i] = LocalCoeff; } return(ans); }
public static PolynomialND operator *(PolynomialND p2, PolynomialND p1) { var p3Extent = new int[p1.Rank]; for (int i = 0; i < p3Extent.Length; i++) { p3Extent [i] = p1.Order [i] + p2.Order [i]; } var p3 = new PolynomialND(p3Extent); var idA = new Index(p1.Order); var idB = new Index(p2.Order); var idC = new Index(p3.Order); int[] subC = new int[p3.Rank]; for (int i = 0; i < p1.Coefficients.Length; i++) { var subA = idA.Ind2Sub(i); for (int j = 0; j < p2.Coefficients.Length; j++) { var subB = idB.Ind2Sub(j); for (int k = 0; k < subC.Length; k++) { subC [k] = subA [k] + subB [k]; } int idx = idC.Sub2Ind(subC); p3.Coefficients [idx] = p1.Coefficients [i] * p2.Coefficients [j]; } } return(p3); }
public static PolynomialND operator *(PolynomialND p1, double Scalar) { var p2 = new PolynomialND(p1.Order); for (int i = 0; i < p2.Coefficients.Length; i++) { p2.Coefficients [i] = p1.Coefficients [i] * Scalar; } return(p2); }
public static PolynomialND operator +(PolynomialND p2, PolynomialND p1) { int[] extent; if (p1.Rank != p2.Rank) { throw new Exception("Both polynomials need to be the same number of dimensions"); } var coefficients = addArrays(p2.Coefficients, p1.Coefficients, p1.Order, p2.Order, out extent); var p3 = new PolynomialND(extent, coefficients); return(p3); }
public PolynomialND Convert_ND(int Dim, int Rank = 3) { var Order = new int[Rank]; for (int i = 0; i < Rank; i++) { Order [i] = 1; } Order [Dim] = coefficients.Length; var Ans = new PolynomialND(Order, coefficients); return(Ans); }
public PolynomialND Differentiate(int Dim) { int[] OrderNew = (int[])Order.Clone(); OrderNew [Dim]--; var ans = new PolynomialND(OrderNew); var Id_Old = new Index(Order); var Id = new Index(ans.Order); for (int i = 0; i < ans.Coefficients.Length; i++) { var subAns = Id.Ind2Sub(i); subAns [Dim]++; int idx = Id_Old.Sub2Ind(subAns); ans.Coefficients [i] = Coefficients [idx] * subAns [Dim]; } return(ans); }
public PolynomialND Integrate(int Dim) { int[] OrderNew = (int[])Order.Clone(); OrderNew [Dim]++; var ans = new PolynomialND(OrderNew); var Id_Old = new Index(Order); var Id = new Index(ans.Order); for (int i = 0; i < Coefficients.Length; i++) { var subAns = Id_Old.Ind2Sub(i); subAns [Dim]++; int idx = Id.Sub2Ind(subAns); ans.Coefficients [idx] = Coefficients [i] * (1.0d / (double)subAns [Dim]); } return(ans); }