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;
}
}
}