/// <summary> /// Construct an initial simplex, given starting guesses for the constants, and /// initial step sizes for each dimension /// </summary> /// <param name="simplexConstants"></param> /// <returns></returns> private static Vector[] _initializeVertices(SimplexConstant[] simplexConstants) { int numDimensions = simplexConstants.Length; Vector[] vertices = new Vector[numDimensions + 1]; GaussianDistribution gaussian; // define one point of the simplex as the given initial guesses Vector p0 = new Vector(numDimensions); for (int i = 0; i < numDimensions; i++) { gaussian = new GaussianDistribution(simplexConstants[i].Value, simplexConstants[i].InitialPerturbation); p0[i] = gaussian.NextGaussian(simplexConstants[i].Value, simplexConstants[i].InitialPerturbation); } // now fill in the vertices, creating the additional points as: // P(i) = P(0) + Scale(i) * UnitVector(i) vertices[0] = p0; for (int i = 0; i < numDimensions; i++) { gaussian = new GaussianDistribution(simplexConstants[i].InitialPerturbation, simplexConstants[i].InitialPerturbation / 2); double scale = simplexConstants[i].InitialPerturbation; Vector unitVector = new Vector(numDimensions); unitVector[i] = 1; vertices[i + 1] = p0.Add(unitVector.Multiply(gaussian.NextGaussian(simplexConstants[i].InitialPerturbation, simplexConstants[i].InitialPerturbation / 2))); } return(vertices); }