public RegressionModel LinReg(bool isUpgraded) //строим линейную регрессию для одного У
        {
            RegressionModel models = new RegressionModel(x, y, isUpgraded);

            models.GOST = GOST;
            models.mark = mark;
            int[] typesF    = new int[x.Count];
            int   numNotes  = data.GetLength(0);
            int   numParams = x.Count;
            int   info      = 100;                              //результат выполнения подпрограммы alglib

            double[,] xy = new double[numNotes, numParams + 1]; //таблица из всех иксов и одного у
            //подготавливаем массив данных
            if (!isUpgraded)                                    //для простой модели просто переносим все данные
            {
                for (int i = 0; i < numNotes; i++)
                {
                    for (int j = 0; j < numParams; j++)
                    {
                        xy[i, j] = data[i, y.Count + j];  //Convert.ToDouble(plavka.Rows[i].ItemArray[y.Count + j]); //поскольку сначала все y
                    }
                }
            }
            else
            {
                typesF = UpgradeFuncModel();
            }

            for (int i = 0; i < y.Count; i++) //для каждого свойства y
            {
                if (isUpgraded)               //для улучшенной модели применяем функции
                {
                    for (int k = 0; k < numNotes; k++)
                    {
                        for (int j = 0; j < numParams; j++)
                        {
                            xy[k, j] = FunctionTypeConverter.CalcFx(typesF[j], data[k, y.Count + j]); // Convert.ToDouble(plavka.Rows[k].ItemArray[y.Count + j]));
                        }
                    }
                    models.typesF = typesF;
                }

                for (int j = 0; j < numNotes; j++)
                {
                    xy[j, numParams] = data[j, i];// Convert.ToDouble(plavka.Rows[j].ItemArray[i]); //заполняем последний столбец для нужного свойства
                }
                //строим 1 модель для конкретного свойства
                RegEquation model = BuildOneModel(xy, numParams, numNotes, ref info);
                if (info < 0) //ошибка произошла, возвращаем ее в классе модели
                {
                    models.buildInfo = info;
                    return(models);
                }
                models.equation.Add(model);
            }
            return(models);
        }
        public double Calculate(double[] x, int[] typesF)
        {
            double result = 0;

            for (int i = 0; i < x.Length; i++)
            {
                result += FunctionTypeConverter.CalcFx(typesF[i], x[i]) * weights[i];
            }
            result += weights[x.Length]; //прибавляем свободный член
            return(result);
        }
        private int[] UpgradeFuncModel() //находим функции для Х, при которых ковариация с У максимальна
        {
            int[] funcTypes = new int[x.Count];
            int   numNotes  = data.GetLength(0);
            int   numParams = x.Count;

            for (int i = 0; i < numParams; i++) //для каждого параметра
            {
                double[] Y = new double[numNotes], Xbase = new double[numNotes], X = new double[numNotes];
                for (int w = 0; w < numNotes; w++)
                {
                    Xbase[w] = data[w, y.Count + i];                              //начальный массив X
                }
                double max_sum = -1;
                for (int k = 0; k < FunctionTypeConverter.funcNum; k++)
                {
                    double temp_sum = 0;
                    for (int w = 0; w < numNotes; w++)
                    {
                        X[w] = FunctionTypeConverter.CalcFx(k, Xbase[w]);
                    }
                    for (int j = 0; j < y.Count; j++) //суммируем корреляции со всеми У
                    {
                        for (int w = 0; w < numNotes; w++)
                        {
                            Y[w] = data[w, j];                                 //Convert.ToDouble(plavka.Rows[w].ItemArray[j]); //заполнили массив свойства
                        }
                        temp_sum += Math.Pow(alglib.pearsoncorr2(X, Y), 2);
                    }
                    if (temp_sum > max_sum)
                    {
                        max_sum      = temp_sum;
                        funcTypes[i] = k;
                    }
                }
            }

            return(funcTypes);
        }