Example #1
0
 void btnOk_Click(object sender, EventArgs e)
 {
     try
     {
         Regression[] arrReg = new Regression[matrY.GetLength(1)];
         repSmp = repHSmp = repId = repHId = repCorr = repHCorr = repGen = "";
         Sample[] arrSX = new Sample[matrX.GetLength(1)];
         for (int j = 0; j < arrSX.Length; j++)
         {
             double[] arrX = new double[matrX.GetLength(0)];
             for (int i = 0; i < matrX.GetLength(0); i++)
             {
                 arrX[i] = matrX[i, j];
             }
             arrSX[j] = new Sample(arrXName[j], string.Format("x<sub>{0}</sub>", j + 1), arrX);
             arrSX[j].Calculate();
             repSmp  += arrSX[j].GetReport();
             repHSmp += arrSX[j].GetHypReport();
         }
         repId = "ПАРАМЕТРИЧЕСКАЯ ИДЕНТИФИКАЦИЯ<br>";
         Sample[] arrSY = new Sample[matrY.GetLength(1)];
         for (int j = 0; j < matrY.GetLength(1); j++)
         {
             Sample[] arrTSX = new Sample[matrX.GetLength(1)];
             for (int k = 0; k < matrX.GetLength(1); k++)
             {
                 arrTSX[k] = new TranSample(arrSX[k],
                                            dgv.Rows[k].Cells[j + 1].Value.ToString());
             }
             double[] arrY = new double[matrY.GetLength(0)];
             for (int i = 0; i < matrY.GetLength(0); i++)
             {
                 arrY[i] = matrY[i, j];
             }
             Sample smpY = new Sample(arrYName[j], string.Format("y<sub>{0}</sub>", j + 1), arrY);
             smpY.Calculate();
             arrSY[j]  = smpY;
             repSmp   += smpY.GetReport();
             repHSmp  += smpY.GetHypReport();
             arrReg[j] = new Regression(smpY, arrTSX);
             repId    += arrReg[j].GetRegReport() + "<br>";
             repCorr  += arrReg[j].GetCorrReport();
             if (cbH.Checked)
             {
                 arrReg[j].CheckHypothesises(double.Parse(tbAlpha.Text));
                 repHId   += arrReg[j].GetHypRegrReport();
                 repHCorr += arrReg[j].GetHypCorrReport();
             }
         }
         Sample[] arrSYX = new Sample[matrX.GetLength(1) + matrY.GetLength(1) - 1];
         for (int i = 0; i < arrSY.Length - 1; i++)
         {
             arrSYX[i] = arrSY[i + 1];
         }
         for (int i = 0; i < arrSX.Length; i++)
         {
             arrSYX[arrSY.Length - 1 + i] = arrSX[i];
         }
         Regression reg = new Regression(arrSY[0], arrSYX);
         repCorrXY = reg.GetCorrReport().Replace("<P>ПОКАЗАТЕЛЬ: y<sub>1</sub><BR>", "");
         if (cbG.Checked)
         {
             Quality.GenErr(matrX, matrY, arrReg, int.Parse(tbN.Text), double.Parse(tbA.Text),
                            double.Parse(tbB.Text), out arrI, out matrXM, out matrYM);
             repGen += string.Format("ПАРАМЕТРЫ ГЕНЕРАЦИИ<br>n = {0}<br>A = {1}<br>B = {2}<br><br>",
                                     tbN.Text, tbA.Text, tbB.Text);
             repGen += "ПЕРЕЧЕНЬ ИЗМЕНЕННЫХ НАБЛЮДЕНИЙ<br>";
             foreach (int i in arrI)
             {
                 repGen += string.Format("{0} ", i + 1);
             }
         }
         else
         {
             matrXM = matrX;
             matrYM = matrY;
         }
         DialogResult = DialogResult.OK;
         Close();
     }
     catch
     {
         MessageBox.Show("Ошибка генерации");
     }
 }
Example #2
0
        void btnOpt_Click(object sender, EventArgs e)
        {
            string rep = "";

            Variable[] arrQ, arrU;
            Import(out arrQ, out arrU);
            Sample[]   arrSmp   = new Sample[arrU.Length];
            double[][] arrCoeff = new double[arrQ.Length][];
            for (int i = 0; i < arrU.Length; i++)
            {
                arrSmp[i] = new Sample(arrU[i].name, arrU[i].id, arrU[i].arr);
            }
            for (int i = 0; i < arrQ.Length; i++)
            {
                Sample[] arrTSmp = new Sample[arrSmp.Length];
                for (int j = 0; j < arrTSmp.Length; j++)
                {
                    arrTSmp[j] = new TranSample(arrSmp[j], dgvU[i + 2, j].Value.ToString());
                }
                Sample     smp = new Sample(arrQ[i].name, arrQ[i].id, arrQ[i].arr);
                Regression r   = new Regression(smp, arrSmp);
                arrCoeff[i] = r.arrB;
                rep        += r.GetRegReport() + "<br>";
            }
            string[] arrStage = new string[dgvStage.Rows.Count];
            for (int i = 0; i < arrStage.Length; i++)
            {
                arrStage[i] = dgvStage[0, i].Value.ToString();
            }
            StageForm sf = new StageForm(arrStage);

            sf.ShowDialog();
            List <string> lNU = new List <string>(), lU = new List <string>();
            int           k;

            for (k = 0; k < arrStage.Length; k++)
            {
                if (sf.stage == arrStage[k])
                {
                    break;
                }
                else
                {
                    lNU.AddRange(dgvStage[1, k].Value.ToString().Split(new char[] { ' ', ',' },
                                                                       StringSplitOptions.RemoveEmptyEntries));
                }
            }
            ExpForm ef = new ExpForm(lNU.ToArray(), arrU);

            ef.ShowDialog();
            for (int i = 0; i < arrU.Length; i++)
            {
                if (!lNU.Contains(string.Format("{0}", i + 1)))
                {
                    lU.Add(arrU[i].name);
                }
            }
            int p = lU.Count, n = arrQ.Length;

            int[] arrI = new int[p], arrNI = new int[arrU.Length - p];
            for (int i = 0; i < p; i++)
            {
                for (int j = 0; j < arrU.Length; j++)
                {
                    if (arrU[j].name == lU[i])
                    {
                        arrI[i] = j;
                        break;
                    }
                }
            }
            for (int i = 0; i < arrNI.Length; i++)
            {
                for (int j = 0; j < arrU.Length; j++)
                {
                    if (arrU[j].name == lNU[i])
                    {
                        arrNI[i] = j;
                        break;
                    }
                }
            }
            string[,] matrFunc = new string[p, n];
            for (int i = 0; i < p; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    matrFunc[i, j] = dgvU[j + 2, arrI[i]].Value.ToString();
                }
            }
            double[][] arrC = new double[n][];
            for (int j = 0; j < n; j++)
            {
                arrC[j] = new double[p + 1];
                double s = arrCoeff[j][0];
                for (int i = 0; i < arrU.Length; i++)
                {
                    for (k = 0; k < p; k++)
                    {
                        if (arrI[k] == i)
                        {
                            break;
                        }
                    }
                    if (k < p)
                    {
                        arrC[j][k + 1] = arrCoeff[j][i + 1];
                    }
                    else
                    {
                        for (k = 0; k < p; k++)
                        {
                            if (arrNI[k] == i)
                            {
                                break;
                            }
                        }
                        s += arrCoeff[j][i + 1] * F(ef.arr[k], dgvU[j + 2, i].Value.ToString());
                    }
                }
                arrC[j][0] = s;
            }
            double[] arrUMin = new double[p], arrUMax = new double[p], arrUSMin = new double[p];
            for (int i = 0; i < p; i++)
            {
                arrUMin[i]  = double.Parse(dgvUParam[1, arrI[i]].Value.ToString());
                arrUMax[i]  = double.Parse(dgvUParam[2, arrI[i]].Value.ToString());
                arrUSMin[i] = double.Parse(dgvUParam[3, arrI[i]].Value.ToString());
            }
            double[] arrYOpt = new double[n], arrYMin = new double[n], arrYMax = new double[n], arrAlpha = new double[n];
            for (int i = 0; i < n; i++)
            {
                arrYOpt[i]  = double.Parse(dgvQParam[4, i].Value.ToString());
                arrYMin[i]  = double.Parse(dgvQParam[2, i].Value.ToString());
                arrYMax[i]  = double.Parse(dgvQParam[3, i].Value.ToString());
                arrAlpha[i] = double.Parse(dgvQParam[1, i].Value.ToString());
            }
            double          R    = double.Parse(tbR.Text);
            HJInitialParams init = new HJInitialParams(double.Parse(tbDU.Text), double.Parse(tbDF.Text),
                                                       arrCoeff, matrFunc, arrUMin, arrUMax, arrUSMin, arrYOpt, arrYMin, arrYMax, arrAlpha, R);
            int iterNum = 0;
            List <HJIteration> lIter = new List <HJIteration>();

            double[] arrX = new double[2 * p], arrXDelta = new double[2 * p];
            double   xEps = double.Parse(tbDU.Text);

            for (int i = 0; i < 2 * p; i++)
            {
                arrX[i]      = 0.5;
                arrXDelta[i] = xEps;
            }
            HJIteration it  = new HJIteration(arrX, arrXDelta);
            HJOptimizer opt = new HJOptimizer();

            opt.Initialize(init);
            //double C = double.Parse(tbC.Text);
            double f = double.MaxValue, fEps = double.Parse(tbDF.Text);

            rep += "ОПТИМИЗАЦИЯ МЕТОДОМ ХУКА-ДЖИВСА<br><table border = 1 cellspacing = 0><tr>";
            for (int i = 0; i < p; i++)
            {
                rep += "<td>" + lU[i];
            }
            rep += "<td>Целевая функция";
            rep += it.ToHtml(init, 3);
            //do
            {
                do
                {
                    it = (HJIteration)opt.DoIteration(it);
                    if (it == null)
                    {
                        break;
                    }
                    lIter.Add(it);
                    iterNum++;
                    rep += it.ToHtml(init, 3);
                }while (iterNum < 1000);
                //double FNext = lIter.Last().fRes;
                //if (Math.Abs(FNext - f) < fEps)
                //    break;
                //f = FNext;
                //R *= C;
                //init = new HJInitialParams(double.Parse(tbDU.Text), double.Parse(tbDF.Text),
                //    arrCoeff, matrFunc, arrUMin, arrUMax, arrUSMin, arrYOpt, arrYMin, arrYMax, arrAlpha, R);
                //it = new HJIteration(lIter.Last().arrX, arrXDelta);
            }
            //while (true);
            rep += "</table><br>";
            rep += "РЕЗУЛЬТАТЫ ОПТИМИЗАЦИИ<br>";
            for (int i = 0; i < p; i++)
            {
                rep += string.Format("m<sub>{0}</sub> = {1:f4}<br>", i + 1, lIter.Last().arrX[i]);
            }
            Random rnd = new Random();

            for (int i = 0; i < p; i++)
            {
                rep += string.Format("s<sub>{0}</sub> = {1:f4}<br>", i + 1, lIter.Last().arrX[i + p]);
            }
            rep += string.Format("<br>Целевая функция:<br>F = {0:f4}<br>", init.GetFuncValue(lIter.Last().arrX));

            rep += "<br>Значения параметров распределений показателей качества<br>";
            for (int i = 0; i < n; i++)
            {
                rep += string.Format("mu<sub>{0}</sub> = {1:f4}<br>", i + 1, init.arrMu[i]);
                rep += string.Format("sigma<sub>{0}</sub> = {1:f4}<br>", i + 1, init.arrSigma[i]);
            }
            rep += "<br>Значения показателей качества<br>";
            for (int i = 0; i < n; i++)
            {
                rep += string.Format("y<sub>{0}</sub> = {1:f4}<br>", i + 1, init.arrY[i]);
            }
            rep += "<br>Технологические факторы до и после оптимизации<br>";
            rep += "Нормированные средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации";
            for (int i = 0; i < p; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, 0,
                                     lIter.Last().arrX[i]);
            }
            rep += "</table><br>Средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации";
            for (int i = 0; i < p; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, arrU[i].Inv(0),
                                     arrU[i].Inv(lIter.Last().arrX[i]));
            }
            rep += "</table><br>Нормированные средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации";
            for (int i = 0; i < p; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, 1,
                                     lIter.Last().arrX[p + i]);
            }
            rep += "</table><br>Средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации";
            for (int i = 0; i < p; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, arrU[i].sigma,
                                     arrU[i].sigma * lIter.Last().arrX[p + i]);
            }
            rep += "</table>";

            rep += "<br>Показатели качества до и после оптимизации<br>";
            rep += "Нормированные средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации";
            for (int i = 0; i < n; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, 0,
                                     init.arrMu[i]);
            }
            rep += "</table><br>Средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации";
            for (int i = 0; i < n; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, arrQ[i].Inv(0),
                                     arrQ[i].Inv(init.arrMu[i]));
            }
            rep += "</table><br>Нормированные средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации";
            for (int i = 0; i < n; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, 1,
                                     init.arrSigma[i]);
            }
            rep += "</table><br>Средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" +
                   "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации";
            for (int i = 0; i < n; i++)
            {
                rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, arrQ[i].sigma,
                                     arrQ[i].sigma * init.arrSigma[i]);
            }
            rep += "</table>";

            List <Sample> lSmp = new List <Sample>();

            for (int i = 1; i < arrQ.Length; i++)
            {
                lSmp.Add(new Sample(arrQ[i].name, string.Format("y{0}", i + 1), arrQ[i].arr));
            }
            lSmp.AddRange(arrSmp);
            Regression reg = new Regression(new Sample(arrQ[0].name, "y0", arrQ[0].arr), lSmp.ToArray());

            rep += reg.GetCorrReport();
            ResForm rf = new ResForm(rep);

            rf.Show();
            List <double[]> lArr = new List <double[]>();
            List <string>   lName = new List <string>();
            List <double>   lMu = new List <double>(), lSigma = new List <double>();

            for (int i = 0; i < arrU.Length; i++)
            {
                lName.Add(arrU[i].name);
                lMu.Add(arrU[i].Inv(lIter.Last().arrX[i]));
                lSigma.Add(arrU[i].sigma * lIter.Last().arrX[i + p]);
                double[] arr = new double[arrU[i].arr.Length];
                for (int j = 0; j < arr.Length; j++)
                {
                    arr[j] = arrU[i].Inv(arrU[i].arr[j]);
                }
                lArr.Add(arr);
            }
            for (int i = 0; i < arrQ.Length; i++)
            {
                lName.Add(arrQ[i].name);
                lMu.Add(arrQ[i].Inv(init.arrMu[i]));
                lSigma.Add(arrQ[i].sigma * init.arrSigma[i]);
                double[] arr = new double[arrQ[i].arr.Length];
                for (int j = 0; j < arr.Length; j++)
                {
                    arr[j] = arrQ[i].Inv(arrQ[i].arr[j]);
                }
                lArr.Add(arr);
            }
            DistForm df = new DistForm(lName.ToArray(), lArr.ToArray(), lMu.ToArray(), lSigma.ToArray());

            df.Show();
        }