void aproksymuj(int stopien = 1) // stopien to stopień wielomianu aproksymującego
{
int N = Convert.ToInt32(TextBox1.Text); // liczba próbek funkcji
double a = Convert.ToDouble(TextBox3.Text); // poczatek przedziału
double b = Convert.ToDouble(TextBox4.Text); // koniec przedziału
double h = (b - a) / (N - 1); // krok - odległości między prókami
double blad2 = 0, blad = 0, bladMAX = 0; // zmienne do liczenia błędów
double[] X = new double[N]; // punkty
double[] Y = new double[N]; // próbki w punktach
try
{
NCalc.Expression Funkcja = new NCalc.Expression(TextBox2.Text); // eyrażenie Ncalc
Funkcja.Parameters["pi"] = Math.PI; // parametr pi
for (int i = 0; i < N; i++) // próbkowanie funkcji
{
X[i] = a + i*h;
Funkcja.Parameters["x"] = X[i];
Y[i] = (double)Funkcja.Evaluate();
}
Label1.Text = "OK";
for (int i = 0; i < N; i++) // wykres próbek
Chart1.Series[0].Points.AddXY(X[i], Y[i]);
// Poszukiwanie wsp wielomianu aproksymującego - wektor wsp
///na podstawie rozwiązania układu równań G*wsp = R
MathNet.Numerics.LinearAlgebra.Double.Matrix G = new MathNet.Numerics.LinearAlgebra.Double.DenseMatrix(stopien+1,stopien+1);
MathNet.Numerics.LinearAlgebra.Double.Matrix R = new MathNet.Numerics.LinearAlgebra.Double.DenseMatrix(stopien + 1, 1);
double g = 0.0;
for (int i = 0; i <= stopien; i++) // obliczanie elementów Macierzy G
{
for (int k = 0; k <= stopien; k++)
{
g = 0.0;
for (int j = 0; j < N; j++)
g += Math.Pow(X[j], i + k);
G[i, k] = g;
}
}
for (int k = 0; k <= stopien; k++) // obliczanie elementów wektora R
{
g = 0.0;
for (int j = 0; j < N; j++)
g += Y[j] * Math.Pow(X[j], k);
R[k,0] = g;
}
var lu = G.LU(); // rozwiązywanie układu równań G*wsp = R
var A = lu.Solve(R);
Chart1.ChartAreas[0].AxisX.Minimum = a; // początek skali osi x wykresu
Chart1.ChartAreas[0].AxisX.Maximum = b;
double[] wsp = new double[stopien + 1]; // podstawianie macierzy A do wsp
for (int i = 0; i < stopien + 1; i++)
wsp[i] = A[i, 0];
for (double x = a; x <= b + 0.01; x += (b - a)/300) // wykres wielomianu aproksymującego
Chart1.Series[1].Points.AddXY(x, MathNet.Numerics.Evaluate.Polynomial(x, wsp));
for (int i = 0; i < N; i++) // liczenie błędów
{
blad = (MathNet.Numerics.Evaluate.Polynomial(X[i], wsp) - Y[i]);
blad2 += blad * blad;
if (Math.Abs(blad) > bladMAX) bladMAX = Math.Abs(blad);
}
blad2 = blad2 / N;
// wyderuk błędów
Label2.Text = (blad2).ToString();
Label3.Text = Math.Sqrt(blad2).ToString();
Label4.Text = bladMAX.ToString();
}
catch (Exception ex)
{
Label1.Text = ex.Message;
}
}