Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Gnu科学图书馆的多维最小化_C_Optimization_Numeric_Gsl_Minimization - Fatal编程技术网

C Gnu科学图书馆的多维最小化

C Gnu科学图书馆的多维最小化,c,optimization,numeric,gsl,minimization,C,Optimization,Numeric,Gsl,Minimization,因此,我对GSL中的多维最小化程序有一个问题(我尝试使用的是GSL\u multimin\u fdfminimizer\u vector\u bfgs2,但其他程序产生相同的问题)。我已经定义了我的目标函数和它的梯度,我可以开始迭代,但是算法总是停留在同一点上 现在,我想我的函数或梯度会有一个数学错误。然而,对于一组特定的数据,我知道最佳值,插入这些值会产生一个梯度,在任何地方都是0 如果我以最佳值开始迭代,算法将正确停止并报告成功,但是如果我只对起始向量进行最小程度的干扰,迭代将永远运行,并且

因此,我对GSL中的多维最小化程序有一个问题(我尝试使用的是
GSL\u multimin\u fdfminimizer\u vector\u bfgs2
,但其他程序产生相同的问题)。我已经定义了我的目标函数和它的梯度,我可以开始迭代,但是算法总是停留在同一点上

现在,我想我的函数或梯度会有一个数学错误。然而,对于一组特定的数据,我知道最佳值,插入这些值会产生一个梯度,在任何地方都是0

如果我以最佳值开始迭代,算法将正确停止并报告成功,但是如果我只对起始向量进行最小程度的干扰,迭代将永远运行,并且永远不会找到最佳值

我还重新实现了R中的函数和梯度。我检查了C版本和R版本是否为相同的输入生成相同的输出,这是他们所做的。使用R中的BFGS算法,只需几次迭代即可找到最优值

我使用

 const gsl_multimin_fdfminimizer_type *T;
 gsl_multimin_fdfminimizer *s;

 gsl_multimin_function_fdf lindsey_func;
 const gsl_vector * p[] = {x, y};

 lindsey_func.n = J;
 lindsey_func.f = lindsey_loglik;
 lindsey_func.df = lindsey_gradient;
 lindsey_func.fdf = lindsey_gf;
 lindsey_func.params = p;

 T = gsl_multimin_fdfminimizer_vector_bfgs2;
 s = gsl_multimin_fdfminimizer_alloc(T, J);     

 gsl_multimin_fdfminimizer_set(s, &lindsey_func, beta0, .001, 1e-4);
迭代过程如下所示:

 do
 {
  iter++;
  status = gsl_multimin_fdfminimizer_iterate(s);
  printf("%d\n", status);
  if (status)
       break;

  status = gsl_multimin_test_gradient(s->gradient, 1e-3);

  if (status == GSL_SUCCESS)
  {
     printf("Minimum found at: ");
     printf("[");
     for (j = 0; j < J; j++)
     {
      printf("%.5f, ", gsl_vector_get(s->x, j));
     }
     printf("]\n");
  }
 } while (status == GSL_CONTINUE && iter < iter_max);
do
{
iter++;
状态=gsl\u multimin\u fdfminimizer\u迭代;
printf(“%d\n”,状态);
如果(状态)
打破
状态=gsl\U多分钟\U测试\U梯度(s->梯度,1e-3);
如果(状态==GSL_成功)
{
printf(“最小值为:”);
printf(“[”);
对于(j=0;jx,j));
}
printf(“]\n”);
}
}而(状态==GSL\U继续&&iter
我唯一可以调整的参数是初始步长和
gsl\u multimin\u fdfminimizer\u集合(gsl\u multimin\u fdfminimizer*s,gsl\u multimin\u function\u fdf*fdf,const gsl\u vector*x,double step\u size,double tol)
。在那里尝试不同的值效果很小(有时算法会移动一点),但我找不到任何真正使算法移动的值


谢谢你的建议

我应该补充一点,我的函数有8个自由参数。如果我将问题限制为只有2或3个参数,它就会收敛。有了4个参数,它已经失败了。然而,我认为BFGS应该能够处理3维以上的空间。你说过梯度在任何地方都是0。它在最佳情况下应仅为0。这是一个错误吗?我会仔细检查梯度函数,确保它在所有8维中都是好的,并且没有间断。不,当我插入最佳参数时,梯度只有0。我知道梯度是正确的,因为我在R中得到了相同的数值,优化在那里运行得很好。那么,站在你的立场上,我会得到解算器的源代码,然后进入它。不好玩,我知道。它应该或多或少像OPTIF9一样工作,选择下降方向,用牛顿步进行直线搜索,然后重复。顺便说一句,我喜欢大都会黑斯廷斯。