/** * @defgroup MAIN main * * @brief 测试非线形最优化中的局部极小值问题 * * @author Zhangyi * @date 2020 */ #include "gctl/core.h" #include "gctl/io.h" // 声明我们所使用的二维高斯分布的参数 static std::vector p; int main(int argc, char *argv[]) { std::ifstream infile; gctl::open_infile(infile, argv[1], ""); gctl::gaussian_para2d tmp_p; std::string tmp_str; std::stringstream tmp_ss; while(getline(infile, tmp_str)) { if (tmp_str[0] == '#') continue; else { gctl::str2ss(tmp_str, tmp_ss); tmp_ss >> tmp_p.mu_x >> tmp_p.mu_y >> tmp_p.sigma_x >> tmp_p.sigma_y >> tmp_p.rho; p.push_back(tmp_p); } } infile.close(); // 我们先来确认高斯分布的参数 生成解空间 int m = 101, n = 101; gctl::array gauss_dist(m*n, 0.0); for (int t = 0; t < p.size(); t++) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { gauss_dist[j + i*m] += -1e+3*gctl::gaussian_dist2d(1.0*j, 1.0*i, p[t]); } } } // 输出最小值及对应的解 double f_min = 1e+30, x_min, y_min; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (gauss_dist[j + i*m] < f_min) { f_min = gauss_dist[j + i*m]; x_min = j; y_min = i; } } } std::cout << "f_min(" << x_min << ", " << y_min << ") = " << std::setprecision(10) << f_min << std::endl; // 保存计算结果 gctl::save_netcdf_grid("gauss_dist", gauss_dist, m, n, 0, 1, 0, 1); return 0; }