Fit.cs

using System;

using System.Collections.Generic;

using System.Text;

 

namespace FitPolynom

{

    public class Fit

    {

        public static double Polynom(double[] factors, double x)

        {

            int power = factors.Length;

            double result = 0.0;

 

            foreach(var factor in factors)

            {

                result += factor;

                if ((--power) > 0)

                    result *= x;

            }

 

            return result;

        }

 

        public static double[] Polynom(double[] factors, double[] x)

        {

            var result = new double[x.Length];

            for (int index = 0; index < x.Length; index++)

                result[index] = Polynom(factors, x[index]);

 

            return result;

        }

 

        public static double Derivative(double x, int power)

        {

            double result = 1.0;

            while (power-- > 0)

                result *= x;

 

            return result;

        }

 

 

        public static double[] Derivative(double[] x, int power)

        {

            var result = new double[x.Length];

            for (int index = 0; index < x.Length; index++)

                result[index] = Derivative(x[index], power);

 

            return result;

        }

 

        public static double Multiply(double[] x1, double[] x2)

        {

            var result = 0.0;

            int count = Math.Min(x1.Length, x2.Length);

            for (int index = 0; index < count; index++)

                result += x1[index] * x2[index];

 

            return result;

        }

 

        public int power;

 

        public Fit(int power)

        {

            this.power = power;

        }

 

        public double[,] BuildMatrix(double[] x, double[] y)

        {

            var matrix = new double[power + 1, power + 2];

            for (int row = 0; row <= power; row++)

            {

                for (int col = 0; col <= power; col++)

                {

                    matrix[row, col] = Multiply(Derivative(x, power - row), Derivative(x, power - col));

                }

 

                matrix[row, power + 1] = Multiply(y, Derivative(x, power - row));

            }

 

            return matrix;

        }

 

        public double[] SolveMatrix(double[,] matrix)

        {

            var result = new double[power + 1];

 

            for (int index = 0; index <= power; index++)

            {

                for (int row = 0; row <= power; row++)

                {

                    if (row == index)

                        continue;

 

                    var scale = matrix[row, index] / matrix[index, index];

                    for (int col = 0; col <= power + 1; col++)

                        matrix[row, col] -= scale * matrix[index, col];

                }

 

                var factor = matrix[index, index];

                for (int col = 0; col <= power + 1; col++)

                    matrix[index, col] /= factor;

            }

 

            for (int index = 0; index <= power; index++)

                result[index] = matrix[index, power + 1];

 

            return result;

        }

    }

}