Пример #1
0
        public string Polinomial(double[] xi, double[] yi, int xl)
        {
            int n = xi.Length;

            double[,] matriz = new double[xl + 1, xl + 2];
            double sx = 0, sy = 0, st = 0, sr = 0;

            for (int i = 0; i < n; i++)
            {
                sx += xi[i];
                sy += yi[i];
            }
            double promy = sy / n;

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < xl + 1; j++)
                {
                    for (int k = 0; k < xl + 1; k++)
                    {
                        matriz[j, k] += Math.Pow(xi[i], j + k);
                    }
                    matriz[j, xl + 1] += yi[i] * Math.Pow(xi[i], j);
                }
            }
            var a = new Gauss();

            double[] sol = a.GaussJordan(matriz, xl + 1);//Cambio xl por xl+1
            for (int i = 0; i < n; i++)
            {
                st += Math.Pow(promy - yi[i], 2); //st += Math.Pow(promy / yi[i], 2)
                double s = 0;
                for (int j = 0; j < xl + 1; j++)
                {
                    s += (sol[j] * Math.Pow(xi[i], j));     //s += (Math.Pow(sol[j], i) * Math.Pow(xi[i], j))
                }
                sr += Math.Pow((s - yi[i]), 2);
            }
            //sr += yi[0];
            double r = Math.Sqrt((st - sr) / st) * 100;

            Coeficiente = r;
            string SolF = null;

            for (int i = xl + 1; i > 0; i--) //for (int i = 0; i < xl+1; i++)
            {
                if (i == 1)
                {
                    SolF = SolF + Convert.ToString(Math.Round(sol[i - 1], 4)) + (i - 1) + " ";
                }
                else
                {
                    SolF = SolF + Convert.ToString(Math.Round(sol[i - 1], 4)) + "X" + (i - 1) + " + ";
                }
            }
            return(SolF);
        }
Пример #2
0
        public string[] RegresionPolinomial(int puntos, double[] xi, double[] yi)   //NO ANDA
        {
            string[] final;
            double[] rdo   = null;
            double   CoeCo = 0;
            int      n     = 2;

            while (CoeCo < 80)                           //Mientras el coeficiente sea menor que 80, vuelvue a resolver aumentando la potencia.
            {
                n = n + 1;                               //Incrementa la potencia.
                double[,] matriz = new double[n, n + 1]; //armando la matriz
                double x;
                double y = 0;
                for (int k = 0; k < puntos; k++)
                {
                    y = y + yi[k];      //Sumatoria de Yi
                }
                for (int i = 0; i < n; i++)
                {
                    for (int j = 0; j <= n; j++)   //empieza a recorrerla matriz de nxn+1 elementos, es decir grado n-1.
                    {
                        if (i == 0 && j == 0)      //Pregunta si es el primero.
                        {
                            matriz[0, 0] = puntos; //El primer valor es el unico diferente.
                        }
                        else                       //No es el primero, sigue operando normalmente.
                        {
                            double valf = 0;
                            for (int k = 0; k < puntos; k++)
                            {
                                if (j < n) //Pregunta si el valor no es el ultimo de cada fila.
                                {
                                    x    = Math.Pow(xi[k], i + j);
                                    valf = x;                   //Calcula el valor de esa pos.
                                }
                                else
                                {
                                    x    = Math.Pow(xi[k], i); // Calcula el valor de la ultima pos de cada fila.
                                    valf = y * x;
                                }
                            }
                            matriz[i, j] = valf;   //Arma la matriz con los valores.
                        }
                    }
                }
                var a = new Gauss();
                rdo = a.GaussJordan(matriz, n);   //Resuelve la matriz con el metodo Gauss-Jordan.
                double recP = y / puntos;         //Recta promedio entre los puntos
                double sr = 0, st = 0;
                double sri  = 0;
                double xres = 0;
                for (int k = 0; k < puntos; k++)
                {
                    for (int i = 1; i < n; i++)
                    {
                        xres = xres - rdo[i] * xi[k];
                    }
                    sri = sri + Math.Pow(yi[k] - n - xres, 2); //Valor de la funcion en ese punto (xi).
                    st  = st + Math.Abs(yi[k] - recP);         //Dif de los puntos con la recta promedio.
                    sr  = sr + Math.Abs(yi[k] - sri);          //Dif de los puntos con la funcion calculada.
                }
                CoeCo = Math.Sqrt((st - sr) / st) * 100;       //Coeficiente de correlacion.
            }
            final = new string[n];
            for (int i = 0; i < n; i++)
            {
                final[i] = Convert.ToString(rdo[i]);
            }
            return(final);
        }