public static Polynomial Lagrange(DomainType[] x, DomainType[] y) { if (x.Length != y.Length) { throw new System.ArgumentException("x と y の次数は等しくなければいけません。"); } int len = x.Length; Polynomial p = (Polynomial)(CoefType)0.0; Polynomial X = Polynomial.X(1); for (int i = 0; i < len; ++i) { Polynomial q = (Polynomial)(CoefType)y[i]; for (int j = 0; j < len; ++j) { if (i == j) { continue; } Polynomial temp = (X - (CoefType)x[j]); temp /= (x[i] - x[j]); q *= (X - (CoefType)x[j]) / (x[i] - (CoefType)x[j]); } p += q; } return(p); }
/// <summary> /// チェビシェフ多項式を計算する。 /// </summary> /// <param name="n">次数</param> /// <returns>次数 n のチェビシェフ多項式</returns> public static Polynomial Chebyshev(int n) { if (n == 0) { return(Polynomial.X(0, 1)); } else if (n == 1) { return(Polynomial.X(1, 1)); } return(Polynomial.X(1, 2) * Polynomial.Chebyshev(n - 1) - Polynomial.Chebyshev(n - 2)); }
/// <summary> /// チェビシェフ有理式(elliptic rational)を計算する。 /// </summary> /// <param name="n">次数</param> /// <param name="l">x > 1 における極小値</param> /// <returns>次数 n のチェビシェフ有理式</returns> public static Rational Elliptic(int n, double l) { double m1 = 1 / (l * l); double m1p = 1 - m1; double Kk1 = Ellip.K(m1); double Kk1p = Ellip.K(m1p); double m = Ellip.InverseQ(Math.Exp(-Math.PI * Kk1p / (n * Kk1))); double Kk = Ellip.K(m); Polynomial num = Polynomial.X(0, 1); Polynomial denom = Polynomial.X(0, 1); Rational r = new Rational(Polynomial.X(0, 1), Polynomial.X(0, 1)); double g = 1; for (int i = n - 1; i > 0; i -= 2) { double u = Kk * (double)i / n; double sn = Ellip.Sn(u, m); double w = sn * sn; g *= (m * w - 1) / (1 / w - 1); num *= Polynomial.X(2, 1 / w) - 1; denom *= Polynomial.X(2, m * w) - 1; } if ((n & 1) == 1) { num *= Polynomial.X(1); } num *= g; return(new Rational(num, denom)); }
/// <summary> /// x の n 乗を返す。 /// </summary> /// <param name="n">指数</param> /// <returns>x の n 乗</returns> public static Polynomial X(int n) { return(Polynomial.X(n, 1)); }