コード例 #1
0
        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 });
            }
        }