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;

        }

    }