25 inline std::pair<double, double> getMinima(std::vector<std::vector<double>> vals,
int i0,
int j0)
28 int Nzoom = (N + 1) / 2;
34 for (
int i = 0; i < N; ++i)
35 for (
int j = 0; j < N; ++j) {
36 if ((i0 <= i && i < i0 + Nzoom) &&
37 (j0 <= j && j < j0 + Nzoom))
38 minIn = std::min(minIn, vals[i][j]);
40 minOut = std::min(minOut, vals[i][j]);
42 return {minIn, minOut};
46 inline std::vector<double> getMinimum(std::function<
double(
double,
double)> fun,
double xMin,
double xMax,
double yMin,
double yMax)
49 const int Nzoom = (N + 1) / 2;
54 std::vector<std::vector<double>> vals(N);
55 for (
auto& v : vals) v.resize(N);
57 for (
int k = 0; k < kMax; ++k) {
60 for (
int i = 0; i < N; ++i)
61 for (
int j = 0; j < N; ++j) {
62 double x = xMin + i * (xMax - xMin) / (N - 1.);
63 double y = yMin + j * (yMax - yMin) / (N - 1.);
64 vals[i][j] = fun(x, y);
67 if (k == kMax - 1)
break;
69 double mOutMax = -1e50;
70 int iOpt = -1, jOpt = -1;
72 for (
int i = 0; i < N - Nzoom; ++i)
73 for (
int j = 0; j < N - Nzoom; ++j) {
75 std::tie(mIn, mOut) = getMinima(vals, i, j);
87 double xMinNow = xMin + iOpt * (xMax - xMin) / (N - 1.);
88 double xMaxNow = xMin + (iOpt + Nzoom - 1) * (xMax - xMin) / (N - 1.);
90 double yMinNow = yMin + jOpt * (yMax - yMin) / (N - 1.);
91 double yMaxNow = yMin + (jOpt + Nzoom - 1) * (yMax - yMin) / (N - 1.);
102 double minTot = 1e50;
103 int iOpt = -1, jOpt = -1;
105 for (
int i = 0; i < N; ++i)
106 for (
int j = 0; j < N; ++j) {
107 if (vals[i][j] < minTot) {
114 double xMinNow = xMin + iOpt * (xMax - xMin) / (N - 1.);
115 double yMinNow = yMin + jOpt * (yMax - yMin) / (N - 1.);
117 return {xMinNow, yMinNow};