Esempio n. 1
0
        public MAC_Regressions(MyToD ToD)
        {
            bool flag_X, flag_F, flag_Fo, flag_Xo; n = ToD.Length;

            flag_X = flag_F = flag_Fo = flag_Xo = true;

            // Копирование данных из таблицы в основные массивы
            ToD.ToArrays(out X, out F);

            // Копирование данных из таблицы во "вспомогательные" массивы
            ToD.ToArrays(out x, out f);

            // установка значение флагов
            for (int i = 0; i < n; i++)
            {
                if (x[i] <= 0)
                {
                    flag_X = false;
                }
                if (x[i] == 0)
                {
                    flag_Xo = false;
                }
                if (f[i] <= 0)
                {
                    flag_F = false;
                }
                if (f[i] == 0)
                {
                    flag_Fo = false;
                }
            }

            #region <--- 1. Вычисление коэффициентов для Линейной функции --->
            Linear_Coefficients();

            for (int i = 0; i < n; i++)
            {
                fi = aa * X[i] + bb; ee += (F[i] - fi) * (F[i] - fi);
            }
            ee = Math.Sqrt(ee) / n;

            a    = aa; b = bb; c = double.NaN; error = ee;
            Kind = TypeOfRegression.Linear; Name = "Линейная функция";
            #endregion <--- 1. Вычисление коэффициентов для Линейной функции --->

            #region <--- 2. Вычисление коэффициентов для Квадратичной функции --->
            Quadratic_Coefficients();

            for (int i = 0; i < n; i++)
            {
                fi = aa * X[i] * X[i] + bb * X[i] + cc; ee += (F[i] - fi) * (F[i] - fi);
            }
            ee = Math.Sqrt(ee) / n;

            if (ee < error)
            {
                a    = aa; b = bb; c = cc; error = ee;
                Kind = TypeOfRegression.Quadratic; Name = "Квадратичная функция";
            }
            #endregion <--- 2. Вычисление коэффициентов для Квадратичной функции --->

            #region <--- 3. Вычисление коэффициентов для Степенной функции --->
            if (flag_X && flag_F)
            {
                for (int i = 0; i < n; i++)
                {
                    x[i] = Math.Log(X[i]); f[i] = Math.Log(F[i]);
                }

                Linear_Coefficients();
                bb = Math.Exp(bb);

                for (int i = 0; i < n; i++)
                {
                    fi = bb * Math.Pow(X[i], aa); ee += (F[i] - fi) * (F[i] - fi);
                }
                ee = Math.Sqrt(ee) / n;
                if (ee < error)
                {
                    a    = aa; b = bb; c = double.NaN; error = ee;
                    Kind = TypeOfRegression.Power; Name = "Степенная функция";
                }
            }
            #endregion <--- 3. Вычисление коэффициентов для Степенной функции --->

            #region <--- 4. Вычисление коэффициентов для Показательной функции --->
            if (flag_F)
            {
                for (int i = 0; i < n; i++)
                {
                    x[i] = X[i]; f[i] = Math.Log(F[i]);
                }

                Linear_Coefficients();
                bb = Math.Exp(bb);

                for (int i = 0; i < n; i++)
                {
                    fi = bb * Math.Exp(X[i] * aa); ee += (F[i] - fi) * (F[i] - fi);
                }
                ee = Math.Sqrt(ee) / n;

                if (ee < error)
                {
                    a    = aa; b = bb; c = double.NaN; error = ee;
                    Kind = TypeOfRegression.Exponential; Name = "Показательная функция";
                }
            }
            #endregion <--- 4. Вычисление коэффициентов для Показательной функции --->

            #region <--- 5. Вычисление коэффициентов для Дробно-линейной функции --->
            if (flag_Fo)
            {
                for (int i = 0; i < n; i++)
                {
                    x[i] = X[i]; f[i] = 1.0 / F[i];
                }

                Linear_Coefficients();

                for (int i = 0; i < n; i++)
                {
                    fi = 1.0 / (bb + X[i] * aa); ee += (F[i] - fi) * (F[i] - fi);
                }
                ee = Math.Sqrt(ee) / n;

                if (ee < error)
                {
                    a    = aa; b = bb; c = double.NaN; error = ee;
                    Kind = TypeOfRegression.Fractional_Linear; Name = "Дробно-линейная функция";
                }
            }
            #endregion <--- 5. Вычисление коэффициентов для Дробно-линейной функции --->

            #region <--- 6. Вычисление коэффициентов для Логарифмической функции --->
            if (flag_X)
            {
                for (int i = 0; i < n; i++)
                {
                    x[i] = Math.Log(X[i]); f[i] = F[i];
                }

                Linear_Coefficients();

                for (int i = 0; i < n; i++)
                {
                    fi = bb + Math.Log(X[i]) * aa; ee += (F[i] - fi) * (F[i] - fi);
                }
                ee = Math.Sqrt(ee) / n;
                if (ee < error)
                {
                    a    = aa; b = bb; c = double.NaN; error = ee;
                    Kind = TypeOfRegression.Logarithmic; Name = "Логарифмическая функция";
                }
            }
            #endregion <--- 6. Вычисление коэффициентов для Логарифмическойфункции --->

            #region <--- 7. Вычисление коэффициентов для Дробно-рациональной функции --->
            if (flag_Xo && flag_Fo)
            {
                for (int i = 0; i < n; i++)
                {
                    x[i] = 1.0 / X[i]; f[i] = 1.0 / F[i];
                }

                Linear_Coefficients();

                for (int i = 0; i < n; i++)
                {
                    fi  = X[i] / (bb * X[i] + aa);
                    ee += (F[i] - fi) * (F[i] - fi);
                }
                ee = Math.Sqrt(ee) / n;
                if (ee < error)
                {
                    a    = bb; b = aa; c = double.NaN; error = ee;
                    Kind = TypeOfRegression.Fractional_Rational; Name = "Дробно-рациональная функция";
                }
            }
            #endregion <--- 7. Вычисление коэффициентов для Дробно-рациональной --->

            #region <--- 8. Вычисление коэффициентов для Гиперболической функции --->
            if (flag_Xo)
            {
                for (int i = 0; i < n; i++)
                {
                    x[i] = 1.0 / X[i]; f[i] = F[i];
                }

                Linear_Coefficients();

                for (int i = 0; i < n; i++)
                {
                    fi = aa / X[i] + bb; ee += (F[i] - fi) * (F[i] - fi);
                }
                ee = Math.Sqrt(ee) / n;
                if (ee < error)
                {
                    a    = aa; b = bb; c = double.NaN; error = ee;
                    Kind = TypeOfRegression.Hyperbolic; Name = "Гиперболическая функция";
                }
            }
            #endregion <--- 8. Вычисление коэффициентов для Гиперболической --->
        }