gctl_optimization/example/data/gaussian2d.cpp
2025-04-08 08:37:45 +08:00

70 lines
1.5 KiB
C++

/**
* @defgroup MAIN main
*
* @brief 测试非线形最优化中的局部极小值问题
*
* @author Zhangyi
* @date 2020
*/
#include "gctl/core.h"
#include "gctl/io.h"
// 声明我们所使用的二维高斯分布的参数
static std::vector<gctl::gaussian_para2d> 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<double> 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;
}