示例#1
0
        /// <summary>
        /// Целевая функция
        /// </summary>
        /// <param name="p">массив оптимизируемых параметров</param>
        /// <returns>значение целевой функции</returns>
        async public Task <double> ValueAt(double[] p)
        {
            BeamParams b = CurrentBeam.Clone();

            b.FitParameters = p;
            //return 1.0 / Correlation(b);
            //return 1.0 / PatternIntensity(b);
            return(1.0 / (await Task.Run <double>(() => JointHist2(b))));
            //return 1.0 / JointHist3(b);
        }
示例#2
0
        async private void DumpChisqDistributions(string fname)
        {
            int    i, j;
            double shiftPixelStep = 0.2;
            double shiftStep      = 0.02;
            double angleStep      = 0.05;

            double[] ds = new double[8];
            double[,] chq = new double[9, 101];

            // В версии без подгонки центра шарика изменения его положения следует передавать через CurrentBeam
            BeamParams bbackup = CurrentBeam.Clone();

            for (i = 0; i < 8; i++)
            {
                // Вектор шага
                for (j = 0; j < 8; j++)
                {
                    ds[j] = 0;
                }
                if (i < 2)
                {
                    ds[i] = shiftPixelStep;
                }
                else if (i == 7)
                {
                    ds[i] = angleStep;
                }
                else if (i == 6)
                {
                    ds[i] = shiftStep * 0.01;              // размер пиксела с учетом расстояния до пленки
                }
                else
                {
                    ds[i] = shiftStep;
                }

                CurrentBeam = bbackup.Clone();
                for (j = 0; j < 50; j++)
                {
                    shiftBeam(CurrentBeam, ds, -1.0);
                }
                for (j = 0; j <= 100; j++)
                {
                    chq[i, j] = await ValueAt(CurrentBeam.FitParameters);

                    shiftBeam(CurrentBeam, ds, 1.0);
                }
            }

            System.IO.StreamWriter file = new System.IO.StreamWriter(fname);

            file.WriteLine("\tB.O.X\tB.O.Y\tB.CC.X\tB.CC.Y\tB.Mlc.X\tB.Mlc.Y\tB.PS\tB.FCA");

            for (i = 0; i < 8; i++)
            {
                for (j = 0; j <= 100; j++)
                {
                    file.Write("{0}", j - 50);
                    for (i = 0; i < 8; i++)
                    {
                        file.Write("\t{0}", chq[i, j]);
                    }
                    file.WriteLine();
                }
            }

            file.Close();

            CurrentBeam = bbackup.Clone();
        }