IPOPT工具解决非线性规划最优化问题使用案例 |
您所在的位置:网站首页 › snopt工具箱 › IPOPT工具解决非线性规划最优化问题使用案例 |
IPOPT工具解决非线性规划最优化问题使用案例
By Andrew( [email protected] ) 2013-08-07简介 ipopt是一个解决非线性规划最优化问题的工具集,当然,它也可以用于解决线性规划问题的求解。它提供了c/c++接口,非常易于使用。 问题 解决类似下面的非线性问题:
Ipopt工具采用内点法求解非线性优化问题。 求解前的准备需要计算 1. 梯度 计算目标函数的梯度,和约束条件Jacobian矩阵 2. Hessian矩阵 delta and lambda are parameters for object function and constraints functions (lambda is multiplier of Lagrangian) 示例 求解下面的最优化问题: 第一步: 求解目标函数的梯度: 第二步: 求解约束条件的Jacobian矩阵: 第三步: 求解目标函数和约束条件的Hessian矩阵,即求解 得到
至此,准备工作已经就绪,接下来调用Ipopt 的API接口进行计算。 1.get_nlp_info设置下面的参数 a) n=4;//变量x个数 b) m=2;//约束条件个数 c) nnz_jac_g=8;//Jacobian非零个数 d) Nnz_h_lag=10;//Hessian非零个数 2.get_bounds_info 设置下面的参数 a) x_l[i]设置xi的下界值 b) x_u[i]设置xi的上界值 c) g_l[i]设置约束i的下界值 d) g_u[i]设置约束i的上界值 3.get_start_point设置下面参数 a) x[i]设置第i个变量的初始迭代值 4.eval_f设置下面参数 a) object_value设置目标函数计算方式(本例:object_value=x0*x3*(x0+x1+x2) + x2) 5.eval_grad_f设置目标函数的梯度 a) grad_f[i]设置目标函数对第i个变量的偏导,本例如下: 6.eval_g设置约束条件 a) G[i]约束条件i,本例如下: 7.eval_jac_g设置Jacobian矩阵 a) iRow和jCol设置非零行列的坐标 b) Values设置矩阵迭代值,如果values==NULL,即尚未初始化时,需要设置Jacobian矩阵哪些下标位置非零,如下图: Value==NULL(左);value != NULL(右) 8.eval_h设置Hessian矩阵 a) iRow和jCol设置非零行列的坐标 b) obj_factor为目标函数系数 c) lambda[i]为第i个约束的拉格朗日乘子 d) values设置矩阵的迭代求值,本例只有目标函数和两个约束条件,因此如所示。 i. 目标函数 ii. 约束1 iii. 约束2
9.finalize_solution求解 a) status为返回的求解状态 b) obj_value:最优值 c) x:最优解变量取值 d) z_l 拉格朗日乘子下界 e) z_u 拉格朗日乘子上届 f) lambda 最优解拉格朗日乘子取值 C++ APISvn地址:https://projects.coin-or.org/svn/Ipopt/stable/3.11 示例程序位于源代码:Ipopt/test路径下。
自定义类继承于TNLP (public TNLP),使用命名空间:Ipopt (using namespace Ipopt)
程序实现以下虚函数即可。 /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style);
/** Method to return the bounds for my problem */ virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u);
/** Method to return the starting point for the algorithm */ virtual bool get_starting_point(Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda);
/** Method to return the objective value */ virtual bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value);
/** Method to return the gradient of the objective */ virtual bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f);
/** Method to return the constraint residuals */ virtual bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g);
/** Method to return: * 1) The structure of the jacobian (if "values" is NULL) * 2) The values of the jacobian (if "values" is not NULL) */ virtual bool eval_jac_g(Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index *jCol, Number* values);
/** Method to return: * 1) The structure of the hessian of the lagrangian (if "values" is NULL) * 2) The values of the hessian of the lagrangian (if "values" is not NULL) */ virtual bool eval_h(Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values);
//@}
/** @name Solution Methods */ //@{ /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution(SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq); //@} |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |