网站实名制认证备案,企业培训公司,百度搜索引擎入口官网,网站设计时多页面切换时什么控件文章目录一、关键输入信息1、优化问题的维度2、优化变量的边界3、优化问题的初始迭代点#xff1a;4、优化问题的数据结构(Structure)#xff1a;5、优化问题函数的值#xff1a;二、C Interface1、Ipopt::TNLP::get_nlp_info2、Ipopt::TNLP::get_bounds_info3、Ipopt::TNLP…文章目录一、关键输入信息1、优化问题的维度2、优化变量的边界3、优化问题的初始迭代点4、优化问题的数据结构(Structure)5、优化问题函数的值二、C Interface1、Ipopt::TNLP::get_nlp_info2、Ipopt::TNLP::get_bounds_info3、Ipopt::TNLP::get_starting_point4、Ipopt::TNLP::eval_f5、Ipopt::TNLP::eval_grad_f6、Ipopt::TNLP::eval_g7、Ipopt::TNLP::eval_jac_g8、Ipopt::TNLP::eval_h9、Ipopt::TNLP::finalize_solutionIpopt(Interior Point OPTimizer)是求解大规模非线性最优化问题的求解库。可以求解如下形式的最优化问题的(局部)最优解。其中f ( x ) : R n → R f(x):R^n → Rf(x):Rn→R是优化目标函数g ( x ) : R n → R m g(x):R^n → R^mg(x):Rn→Rm是约束函数f ( x ) , g ( x ) f(x),g(x)f(x),g(x)可以是非线性和非凸的但是需要二阶微分连续。一、关键输入信息为了求解最优化问题Ipopt需要更多信息如下1、优化问题的维度1优化变量x xx的数目2约束函数g ( x ) g(x)g(x)的数目;2、优化变量的边界1优化变量x xx的边界2约束函数g ( x ) g(x)g(x)的边界3、优化问题的初始迭代点1优化变量x xx的初始值2拉格朗日乘子的初始值(仅仅是在warm start的时候需要)4、优化问题的数据结构(Structure)1约束函数g ( x ) g(x)g(x)的雅可比矩阵的非零元素的数目2拉格朗日函数的海森矩阵的非零元素的数目3约束函数g ( x ) g(x)g(x) 的雅可比稀疏矩阵的非零元素的行索引和列索引(sparsity structurerow and column indices of each of the nonzero entries)4拉格朗日函数的海森稀疏矩阵的非零元素的行索引和列索引(sparsity structurerow and column indices of each of the nonzero entries)5、优化问题函数的值1优化目标函数f ( x ) f(x)f(x)2优化目标函数的梯度函数c cc3约束函数g ( x ) g(x)g(x)4约束函数的雅可比矩阵∇ g ( x ) T ∇g(x)^T∇g(x)T5拉格朗日函数的海森矩阵σ f ∇ 2 f ( x ) ∑ i 1 m λ i ∇ 2 g i ( x ) \sigma_f∇^2f(x) \sum_{i1}^{m}\lambda_i∇^2g_i(x)σf∇2f(x)∑i1mλi∇2gi(x)如果使用拟牛顿法则不需要此矩阵优化问题的维度和边界约束可以直接获得并且来自于问题定义。初始迭代点会影响优化问题的是否收敛或者是否收敛到(局部)最优解不同的初始值可能会导致收敛到不同的局部最优解。计算微分矩阵(雅可比矩阵和海森矩阵)可能有一点复杂Ipopt需要提供约束函数的雅可比矩阵和拉格朗日函数的海森矩阵的非零元素以及他们所在的行索引和列索引并且标准接口是下三角矩阵(海森矩阵是对称矩阵)。矩阵的非零元素确定后在整个求解过程中是不可变的因此非零元素不可以仅仅包含在初始值条件下还需要包括在求解过程中不为零的元素。二、C Interface需要继承纯虚基类Ipopt::TNLP来编写自己的求解类并且需要重载9个Ipopt::TNLP基类的虚函数Ipopt通过Ipopt::IpoptApplication类来求解最优化问题。1、Ipopt::TNLP::get_nlp_infovirtual bool get_nlp_info( Index n, Index m, Index nnz_jac_g, Index nnz_h_lag, IndexStyleEnum index_style ) 0;Ipopt使用这个函数来确定数组的内存分配这里如果发生问题会引起内存泄漏等问题很难去debug。n优化变量x xx的数目m约束函数g ( x ) g(x)g(x)的数目nnz_jac_g雅可比矩阵非零元素的数目nnz_h_lag海森矩阵非零元素的数目index_style稀疏矩阵的索引使用C语言风格(从0开始还是使用Fortran语言风格(从1开始)2、Ipopt::TNLP::get_bounds_infovirtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) 0;Ipopt使用这个函数来确定优化变量x xx的边界和约束函数g ( x ) g(x)g(x)的边界。n优化变量x xx的数目x_l优化变量x xx的下边界数组x_u优化变量x xx的上边界数组m约束函数g ( x ) g(x)g(x)的数目g_l约束函数g ( x ) g(x)g(x)的下边界数组g_u约束函数g ( x ) g(x)g(x)的上边界数组在Ipopt中默认设置边界值需要在( − 1 0 9 , 1 0 9 ) (-10^9, 10^9)(−109,109)范围内当不在此范围时则认为是无穷大或者无穷小。3、Ipopt::TNLP::get_starting_pointvirtual 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 ) 0;Ipopt使用这个函数来确定迭代优化的起点。n优化变量x xx的数目init_x如果是true则需要提供优化变量x xx的初始值x优化变量x xx的初始值其他为dual variables的初始值一般不用设置。在Ipopt中默认是需要设置x xx的初始值。4、Ipopt::TNLP::eval_fvirtual bool eval_f( Index n, const Number* x, bool new_x, Number obj_value ) 0;Ipopt使用这个函数来确定优化目标函数。n优化变量x xx的数目x优化变量x xx的值用来计算f ( x ) f(x)f(x)new_x在此之前调用的eval_*函数是否有错误发生可以忽略obj_valuef ( x ) f(x)f(x)5、Ipopt::TNLP::eval_grad_fvirtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ) 0;Ipopt使用这个函数来确定优化目标函数的梯度。n优化变量x xx的数目x优化变量x xx的值用来计算∇ f ( x ) ∇f(x)∇f(x)new_x在此之前调用的eval_*函数是否有错误发生可以忽略grad_f∇ f ( x ) ∇f(x)∇f(x)数组的大小和x xx的数组大小一致6、Ipopt::TNLP::eval_gvirtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ) 0;Ipopt使用这个函数来确定约束函数g ( x ) g(x)g(x)。n优化变量x xx的数目x优化变量x xx的值用来计算∇ f ( x ) ∇f(x)∇f(x)new_x在此之前调用的eval_*函数是否有错误发生可以忽略m 约束函数g ( x ) g(x)g(x)的数目gg(x)数组的大小和m一致7、Ipopt::TNLP::eval_jac_gvirtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ) 0;Ipopt使用这个函数来确定约束函数g ( x ) g(x)g(x)的雅可比矩阵的非零元素的值以及其在稀疏矩阵中的行索引值和列索引值。雅可比矩阵中的第i ii行和第j列的元素值是g i ( x ) g_i(x)gi(x)对x j x_jxj的导数。n优化变量x xx的数目x优化变量x xx的值用来计算∇ g ( x ) T ∇g(x)^T∇g(x)Tnew_x在此之前调用的eval_*函数是否有错误发生可以忽略m约束函数g ( x ) g(x)g(x)的数目iRow存储雅可比矩阵非零元素在矩阵中的行索引值如果是C语言风格雅可比矩阵索引值从0开始jCol存储雅可比矩阵非零元素在矩阵中的列索引值如果是C语言风格雅可比矩阵索引值从0开始values存储雅可比矩阵中的非零元素需要注意的是①iRow、jCol和values三个数组的大小是一致的并且其储存的值应该和雅可比矩阵非零元素的行索引值、列索引值和非零元素值相对应②数组iRow和jCol只需要被填写一次即第一次调用此函数时填写iRow和jCol第一次调用时x和values都是null当Ipopt需要values的值时传递iRow和jCol将会是null此时对values的值进行填写。8、Ipopt::TNLP::eval_hvirtual 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 )Ipopt使用这个函数来确定拉格朗日函数海森矩阵的非零元素的值以及其在稀疏矩阵中的行索引值和列索引值。n优化变量x xx的数目x优化变量x xx的值用来计算∇ g ( x ) T ∇g(x)^T∇g(x)Tnew_x在此之前调用的eval_*函数是否有错误发生可以忽略obj_factorσ f \sigma_fσfm约束函数g ( x ) g(x)g(x) 的数目lambda拉格朗日乘子λ \lambdaλnew_lambda如果之前调用的函数使用相同的λ \lambdaλ则为false一般忽略nele_hess海森矩阵非零元素的个数(下三角矩阵)iRow存储海森矩阵非零元素在矩阵中的行索引值如果是C语言风格雅可比矩阵索引值从0开始jCol存储海森矩阵非零元素在矩阵中的列索引值如果是C语言风格雅可比矩阵索引值从0开始values存储海森矩阵中的非零元素需要注意的是①iRow、jCol和values三个数组的大小是一致的并且其储存的值应该和海森矩阵非零元素的行索引值、列索引值和非零元素值相对应②数组iRow和jCol只需要被填写一次即第一次调用此函数时填写iRow和jCol第一次调用时x、lambda和values都是null当Ipopt需要values的值时传递iRow和jCol将会是null此时对values的值进行填写③由于海森矩阵是对称阵Ipopt使用下三角矩阵④Ipopt默认是需要海森矩阵的当使用拟牛顿法时则不需要海森矩阵。9、Ipopt::TNLP::finalize_solutionvirtual 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 ) 0;Ipopt使用这个函数来得到最优化问题的求解结果对其重要的值进行介绍。status求解器的状态SUCCESS在满足收敛条件的情况下找到局部最优解MAXITER_EXCEEDED超出最大迭代次数CPUTIME_EXCEEDED超出最大求解时间STOP_AT_ACCEPTABLE_POINT求解收敛在某点不满足期望的容差但是在可接受范围内LOCAL_INFEASIBILITY在可行域内找不到最优解一般是由于bounds和约束设置不合理导致的x优化变量x xx的局部最优解的值