/// <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); }
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(); }