70 lines
1.5 KiB
C++
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;
|
|
} |