diff --git a/optimization/optimizers/nelder_mead/nelder_mead.h b/optimization/optimizers/nelder_mead/nelder_mead.h
index 662d08597816d3894afe4081882f226b3c19de75..36826b12a30a2508dd615da8bd5d45d022fe6cac 100644
--- a/optimization/optimizers/nelder_mead/nelder_mead.h
+++ b/optimization/optimizers/nelder_mead/nelder_mead.h
@@ -28,6 +28,8 @@ public:
     MatrixDN const& simplex_vertices() const { return simplex_vertices_; }
     VectorN const& simplex_values() const { return simplex_values_; }
 
+    // Constructs a simplex from an initial point by offset all coordinate values.
+    VectorD optimize(Objective& objective, VectorD const& initial_point, Scalar offset = 1);
     // Each row of simplex is a vertex.
     VectorD optimize(Objective& objective, MatrixDN const& simplex);
 
@@ -60,6 +62,23 @@ private:
     static constexpr Scalar tiny_ = 1e-10;
 };
 
+//..................................................................................................
+template <typename Objective, int32_t D>
+auto NelderMead<Objective, D>::optimize(
+    Objective& objective,
+    VectorD const& initial_point,
+    Scalar offset
+) -> VectorD {
+    MatrixDN simplex;
+    simplex.resize(initial_point.size(), initial_point.size() + 1);
+    simplex.col(0) = initial_point;
+    for (uint32_t i = 0; i < initial_point.size(); ++i) {
+        simplex.col(i + 1) = initial_point;
+        simplex(i, i + 1) += offset;
+    }
+    return optimize(objective, simplex);
+}
+
 //..................................................................................................
 template <typename Objective, int32_t D>
 auto NelderMead<Objective, D>::optimize(Objective& objective, MatrixDN const& simplex) -> VectorD {