NLopt的windows环境下安装

NLopt官网

c/c++环境配置

需要使用到的工具有cmakeMinGW,具体安装教程请自行搜索,网上有很多

step1 下载所需的安装包

在这里插入图片描述
点击v2.6.2.tar.gz下载完成后解压,文件结构如图
在这里插入图片描述

step2 打开cmd,进入到解压后的文件夹

输入如下命令,创建build文件夹

mkdir build
cd build

使用cmake编译生成makefile

cmake -G"MinGW Makefiles" ..

在这里插入图片描述
编译完成后,得到makefile文件
在这里插入图片描述
然后,输入mimgw32-make
在这里插入图片描述

step3 管理员身份打开cmd,重新进入到build文件夹下

输入mingw32-make install,可以看到,默认安装到C盘Program Files(x86)文件夹下
在这里插入图片描述
进入该文件夹中,发现新增了一个名为nlopt的文件夹,打开
在这里插入图片描述
bin\libnlopt.dllinclude\nlopt.hinclude\nlopt.hpplib\libnlopt.dll.a就是c/c++环境下所需要的的文件

step4 测试

libnlopt.dllnlopt.hnlopt.hpplibnlopt.dll.a放在和测试文件同一文件夹下
在这里插入图片描述
测试文件hello.cpp代码(测试代码来自这里):

#include <stdio.h>
#include <math.h>
#include "nlopt.h"
#define INF (1.0/0.0)

double utility(unsigned n, const double *x, double *grad, void *data){
  grad[0]=1.0/x[0];
  grad[1]=1.0/x[1];
  printf("%f, %f, %f ", x[0],x[1],log(x[0])+log(x[1]));
  return log(x[0])+log(x[1]);
}

double constraint(unsigned n, const double *x, double *grad, void *data){
  double *p=(double *)data;
  grad[0]=*p;
  grad[1]=*(p+1);
  printf("Constraint: %f\n", x[0]*(*p)+x[1]*(*(p+1))-5);
  return x[0]*(*p)+x[1]*(*(p+1))-5;
}

double inconstraint(unsigned n, const double *x, double *grad, void *data){
  grad[0]=1;
  grad[1]=-1;
  return x[0]-x[1];
}

int main(int argc, char const *argv[]) {
  double p[2]={1,2};
  double tol=1e-8;
  double lb[2]={0,0};
  double ub[2]={INF,INF};
  double x[2]={1,1};
  double f_max=-INF;
  // set up optimizer
  nlopt_opt opter=nlopt_create(NLOPT_LD_SLSQP, 2);
  // lower and upper bound
  nlopt_set_lower_bounds(opter, lb);
  nlopt_set_upper_bounds(opter, ub);
  // objective function
  nlopt_set_max_objective(opter, utility, NULL);
  // equality constraint
  nlopt_add_equality_constraint(opter, constraint, p, tol);
  // inequality constraint
  nlopt_add_inequality_constraint(opter, inconstraint, NULL, tol);
  // stopping criterion
  nlopt_set_xtol_rel(opter, tol);
  nlopt_set_ftol_abs(opter, tol);
  nlopt_set_force_stop(opter, tol);
  // optimize
  nlopt_result result=nlopt_optimize(opter, x, &f_max);
  if (result)
    printf("Maximum utility=%f, x=(%f,%f)\n", f_max, x[0], x[1]);
  // free
  nlopt_destroy(opter);
  return 0;
}

命令行输入指令g++ hello.cpp libnlopt.dll -o hello生成可执行文件;
输入./hello执行,结果如下
在这里插入图片描述
注:
在这里插入图片描述
直接下载上图中的两个文件可以省略前三步,将dll文件链接进GCC可以省略在命令中加入libnlopt.dll文件,具体步骤如下:

进入到mingw文件夹下,按照路径lib\gcc\x86_64-w64-mingw32\8.1.0打开文件夹,然后将文件libnlopt.dll.a粘贴到该目录下,输入命令g++ hello.cpp -lnlopt -o hello注意,要加-lnlopt
在这里插入图片描述

Matlab环境配置

在这里插入图片描述
根据上面那段英文的意思,需要将nlopt_optimize.c编译成为可供matlab调用的MEX文件,并将结果放入Matlab路径或工作目录中,还需要将其他.m文件(主要实现常量和文档)放入与MEX文件相同的目录中。

但是,在上面前三步完成后,会生成一个matlab文件夹,这里面包括matlab环境所需要的文件,并且nlopt_optimize.c文件已经编译成了MEX文件,因此,直接将整个文件夹和你的测试程序放入同一路径下即可调用nlopt库
在这里插入图片描述
调用matlab接口需要了解opt结构。 所有的优化参数(维度、算法、终止标准、约束、目标函数等)都是通过给opt结构分配字段来指定的,只需将字段分配给这个结构,然后调用nlopt_optimize(opt)函数来执行优化。每个opt结构都需要通过opt.algorithm =algorithm指定算法。

具体介绍请参考官网Matlab使用

测试

myfunc.m

function [val, gradient] = myfunc(x)
    val = sqrt(x(2));
    if (nargout > 1)
        gradient = [0, 0.5 / val];
    end
end

myconstraint.m

function [val, gradient] = myconstraint(x,a,b)
    val = (a*x(1) + b)^3 - x(2);
    if (nargout > 1)
        gradient = [3*a*(a*x(1) + b)^2, -1];
    end
end

test.m

opt.algorithm = NLOPT_LD_MMA;
opt.lower_bounds = [-inf, 0];
opt.min_objective = @myfunc;
opt.fc = { (@(x) myconstraint(x,2,0)), (@(x) myconstraint(x,-1,1)) };
opt.fc_tol = [1e-8, 1e-8];
opt.xtol_rel = 1e-4;
[xopt, fmin, retcode] = nlopt_optimize(opt, [1.234 5.678]);

测试结果
在这里插入图片描述

xopt = 0.3333  0.2963
fmin = 0.5443
retcode = 4

注:测试matlab时,myfunc.mmyconstraint.mtest.m都要,运行test.m

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值