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));
        }
Beispiel #2
0
        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);
        }