private INonlinearSolution _perform_itr(Rational var1_initial, Rational var2_initial, out int vidRow, out int vidVariable1, out int vidVariable2, out int vidVariable3, out int vidVariable4) { var solver = new NelderMeadSolver(); // By CQN solver convention, the vid for a row will always be 0 solver.AddRow(null, out vidRow); solver.AddGoal(vidRow, 0, true); // By CQN solver convention, first (and in this case only) variable always has the vid of 1 solver.AddVariable(null, out vidVariable1); solver.AddVariable(null, out vidVariable2); solver.AddVariable(null, out vidVariable3); solver.AddVariable(null, out vidVariable4); //solver.AddVariable(null, out vidVariable4); Rational rVariable1 = var1_initial; solver.SetValue(vidVariable1, rVariable1); Rational rVariable2 = var2_initial; solver.SetValue(vidVariable2, rVariable2); //Rational rVariable2 = 0.0001; solver.SetValue(vidVariable2, rVariable2); Rational rVariable3 = -0.2; solver.SetValue(vidVariable3, rVariable3); Rational rVariable4 = 0.0; solver.SetValue(vidVariable4, rVariable4); //Setting the evaluators //solver.FunctionEvaluator = ((m,r,v,n) => { return Math.Pow(v[1] + _decay[1], 2); }); solver.FunctionEvaluator = this.SinxValue; //solver.GradientEvaluator = SinxGradient; var param = new NelderMeadSolverParams(); //param.MaximumSearchPoints = 10; return(solver.Solve(param)); }
public void Config(NelderMeadSolver solver) { Configuration = new NelderMeadSolverParams(); Vector3D pos = FEstimatedPosition[0]; Vector3D min = pos - 0.5 * FTolerancePosition[0]; Vector3D max = pos + 0.5 * FTolerancePosition[0]; solver.SetBounds(1, min.x, max.x); // translation solver.SetBounds(2, min.y, max.y); solver.SetBounds(3, min.z, max.z); for (int b = 4; b <= 6; b++) { solver.SetBounds(b, -0.5, 0.5); // rotation } solver.SetBounds(7, 0.05, 0.49); // fov solver.SetBounds(8, -1, 1); // shift x solver.SetBounds(9, -1, 1); // shift y solver.SetValue(1, pos.x); solver.SetValue(2, pos.y); solver.SetValue(3, pos.z); solver.SetValue(4, VMath.Map(VMath.Random.Next(100), 0, 100, -0.05, 0.05, TMapMode.Float)); solver.SetValue(5, VMath.Map(VMath.Random.Next(100), 0, 100, -0.05, 0.05, TMapMode.Float)); solver.SetValue(6, VMath.Map(VMath.Random.Next(100), 0, 100, -0.05, 0.05, TMapMode.Float)); solver.SetValue(7, 0.01); solver.SetValue(8, 0.01); solver.SetValue(9, 0.20); }