public CubicSpline(Point[] inputPoints) { buildRanges(inputPoints); splines = new Polynomial[ranges.Length]; double[] h = new double[points.Length]; for (int i = 1; i < points.Length; i++) { h[i] = points[i].getX() - points[i - 1].getX(); } TriDiagonalMatrix matrix = new TriDiagonalMatrix(points.Length - 2); double[] F = new double[points.Length - 2]; // Построение системы динейных уравнений относительно coeff_c[i], коэффициент при x^2 for (int i = 2; i < points.Length; i++) { matrix[i - 2].a = h[i - 1]; matrix[i - 2].c = 2 * (h[i] + h[i - 1]); matrix[i - 2].b = h[i]; F[i - 2] = 3 * ((points[i].getY() - points[i - 1].getY()) / h[i] - (points[i - 1].getY() - points[i - 2].getY()) / h[i - 1]); } matrix[0].a = 0; matrix[matrix.Length - 1].b = 0; // Находим коэффициенты 'с' double[] c = new double[points.Length + 1]; c[0] = 0; c[1] = 0; double[] t = matrix.solve(F); Array.Copy(t, 0, c, 2, t.Length); c[c.Length - 1] = 0; // Вычисляем оставшмеся коэффициетны и создаем сплайны for (int i = 1; i < c.Length - 1; i++) { double a = points[i - 1].getY(); // свободный коэффициент double d = (c[i + 1] - c[i]) / (3 * h[i]); // коэффициент при x^3 double b = (points[i].getY() - points[i - 1].getY()) / h[i] - (2 * c[i] + c[i + 1]) * h[i] / 3; // коэффициент при x^1 splines[i - 1] = new Polynomial(new double[] { a, b, c[i], d }); } }