当前位置: 首页 > news >正文

网站开发流程抚州高德地图网页版

网站开发流程抚州,高德地图网页版,潍坊网站建设 58,设计师服务平台台本文中将详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题#xff0c;结合给出的带约束的最优化问题示例#xff0c;给出相应的完整的C程序#xff0c;并给出详细的解释和注释#xff0c;以及编译规则等 一、Ipopt库的安装和测试 本部分内容在之前的文章《Ubuntu2…   本文中将详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题结合给出的带约束的最优化问题示例给出相应的完整的C程序并给出详细的解释和注释以及编译规则等 一、Ipopt库的安装和测试 本部分内容在之前的文章《Ubuntu20.04安装Ipopt的流程介绍及报错解决方法亲测简单有效》中已经详细介绍过了链接如下 https://blog.csdn.net/qq_44339029/article/details/133679131 二、使用Ipopt非线性求解器求解带约束的最优化问题的程序示例 0、明确要求解的带约束的最优化问题 首先我们来看一个简单的带约束的最优化问题其包含两个不等式约束和1个等式约束详情如下 f ( x 1 − 10.24 ) 2 5.21 x 2 9.9 ( x 3 − x 4 ) 2 f(x_1-10.24)^25.21x_29.9(x_3-x_4)^2 f(x1​−10.24)25.21x2​9.9(x3​−x4​)2 g 1 : 2 ≤ x 3 − x 4 ≤ 10 g 2 : 2.99 ≤ x 2 ≤ 100 g 3 : x 2 x 4 \begin{aligned}g_1 : 2\leq x_3-x_4\leq10\\ g_2 : 2.99\leq x_2\leq100\\ g_3 : x_2x_4\end{aligned} g1​g2​g3​​:::​2≤x3​−x4​≤102.99≤x2​≤100x2​x4​​ 其中 x 1 x_1 x1​、 x 2 x_2 x2​、 x 3 x_3 x3​、 x 4 x_4 x4​的取值范围均为0~100易知使得上述目标函数 f f f取值最小的解为10.24、2.99、4.99、2.99。 下面介绍如何编程使用Ipopt非线性求解器求解该问题 1. 引入头文件和命名空间 #include iostream #include cassert #include cppad/ipopt/solve.hpp using CppAD::AD;引入必要的C头文件包括iostream用于输入输出cassert用于C风格的assert以及cppad/ipopt/solve.hpp用于Ipopt求解器和CppAD库的接口。然后在一个匿名的命名空间中引入了AD类型这是CppAD库中用于自动微分Automatic Differentiation的数据类型。 2. 定义FG_eval类 namespace {class FG_eval {public:typedef CPPAD_TESTVECTOR(ADdouble) ADvector;void operator()(ADvector fg, const ADvector x) {// ...}}; }在匿名命名空间中定义一个FG_eval类用于计算目标函数和约束条件的值。这个类也是调用使用CppAD和Ipopt库所需的最重要的接口这个类中的operator()函数是用于计算问题的目标函数和约束条件的核心部分。它接受两个向量fg用于存储目标函数值和约束条件值x用于存储优化变量。 3. 定义operator()函数 接下来我们根据第0步中明确的目标函数及约束条件来编写核心的operator函数示例如下 void FG_eval::operator()(ADvector fg, const ADvector x) {assert(fg.size() 4);assert(x.size() 4);ADdouble x1 x[0];ADdouble x2 x[1];ADdouble x3 x[2];ADdouble x4 x[3];fg[0] (x1 - 10.24) * (x1 - 10.24) 5.21 * x2 9.9 * (x3 - x4) * (x3 - x4);fg[1] x3 - x4;fg[2] x2;fg[3] x2 - x4;// 打印计算结果std::cout fg[0]: fg[0] std::endl;std::cout fg[1]: fg[1] std::endl;std::cout fg[2]: fg[2] std::endl;std::cout fg[3]: fg[3] std::endl; }operator()函数接受fg和x向量然后根据问题的定义计算目标函数和约束条件的值并将它们存储在fg向量中。同时它也打印出这些值 其中fg[0]即为目标函数表达式、fg[1]、fg[2]、fg[3]中依次对应了第0步中设定的三个约束不等式约束直接写即可等式约束的等式左右两边同时减去右边的项使等式右边变为0。 4. 定义主函数get_started该函数名字可任取 定义一个主函数设定自变量的初始值以及自变量和约束的上下限设定和提供调用Ipopt非线性求解器求解所需要的变量然后调用求解器进行求解并进行验证等操作程序示例如下 bool get_started(void) { bool ok true;size_t i;typedef CPPAD_TESTVECTOR( double ) Dvector;size_t nx 4;size_t ng 3;Dvector xi(nx);xi[0] 10.0;xi[1] 5.0;xi[2] 5.0;xi[3] 100.0;Dvector xl(nx), xu(nx);for(i 0; i nx; i){ xl[i] 0;xu[i] 100;}Dvector gl(ng), gu(ng);gl[0] 2; gu[0] 10;gl[1] 2.99; gu[1] 100;gl[2] 0; gu[2] 0;FG_eval fg_eval;std::string options;options Integer print_level 0\n;options String sb yes\n;options Integer max_iter 10\n;options Numeric tol 1e-6\n;options String derivative_test second-order\n;options Numeric point_perturbation_radius 0.\n;CppAD::ipopt::solve_resultDvector solution;CppAD::ipopt::solveDvector, FG_eval(options, xi, xl, xu, gl, gu, fg_eval, solution);ok solution.status CppAD::ipopt::solve_resultDvector::success;double check_x[] { 10.24, 2.99, 4.99, 2.99 }; double rel_tol 1e-6; // relative tolerancedouble abs_tol 1e-6; // absolute tolerancefor(i 0; i nx; i){ ok CppAD::NearEqual(check_x[i], solution.x[i], rel_tol, abs_tol ); std::cout x[ i ] solution.x[i] std::endl;}return ok; }以下是程序的详细解释 1. bool get_started(void)程序逻辑流程的主要函数get_started函数定义了问题的基本参数如变量数量、约束数量、变量的初始值以及变量和约束的上下界。然后它创建了一个FG_eval对象来计算目标函数和约束条件设置了Ipopt求解器的选项并最终调用求解器来解决问题。 2. bool ok true;定义一个布尔变量 ok用于表示问题是否成功求解。一开始将其初始化为 true。 3. 类型别名 Dvector通过 typedef CPPAD_TESTVECTOR(double) Dvector; 定义了一个 Dvector 类型它是CppAD库中的向量类型用于存储双精度double数值。 4. size_t nx 4;定义一个 size_t 类型的变量 nx表示问题中独立变量自变量的数量即问题的变量维度。在这个示例中有4个独立的自变量。 5. size_t ng 3;定义一个 size_t 类型的变量 ng表示问题中的约束数量即约束的维度。在这个示例中有3个约束条件。 6. 创建 Dvector 向量 xi用于存储问题的独立变量自变量。这个向量有4个元素对应于4个自变量。 7. 设置初始猜测值 xi为 xi 向量中的每个元素分别赋初值为检验算法性能这里设定了一个较差的初始值。 - xi[0] 10.0;- xi[1] 5.0;- xi[2] 5.0;- xi[3] 100.0;8. 定义变量和约束条件的上下界 - 创建 Dvector 向量 xl 和 xu它们分别表示变量的下界和上界并根据第0步中的设定的自变量的取值范围0~100进行设定 - 创建 Dvector 向量 gl 和 gu它们分别表示约束条件的下界和上界并根据第0步中三个约束的进行设定对于前两个不等式约束直接设定即可第三个等式约束即 x 2 − x 4 0 x_2-x_40 x2​−x4​0,因此上下限均设为0即可。 9. 创建 FG_eval 类的对象 fg_evalFG_eval 即我们第二步中设定的类用于计算目标函数和约束条件的值。这是问题的目标函数和约束条件的具体定义。 10. 创建字符串 options用于存储Ipopt求解器的选项包括设置输出级别、最大迭代次数、收敛容差等详情如下所示 - options Integer print_level 0\n;将输出级别设置为0以关闭求解器的详细输出只打印关键信息。- options String sb yes\n;使用平衡约束优化方法。- options Integer max_iter 10\n;设置最大迭代次数为10次。- options Numeric tol 1e-6\n;设置迭代停止的收敛容差为1e-6。- options String derivative_test second-order\n;启用二阶导数测试用于检查目标函数和约束条件的导数是否正确。- options Numeric point_perturbation_radius 0.\n;将随机扰动的半径设置为0表示不使用扰动进行数值近似求导。11. 创建 CppAD::ipopt::solve_resultDvector solution;用于存储求解结果的对象。 12. 调用 CppAD::ipopt::solve 函数使用Ipopt求解器解决非线性规划问题。传递了问题选项、独立变量的初始值、变量的上下界、约束条件的上下界、问题的定义fg_eval 对象以及存储结果的 solution 对象。 13. 检查求解器的状态如果状态为成功success则将 ok 变量保持为真表示问题已成功求解。 注下面的第(14)~(16)部分是为了验证求解是否正确为非必要步骤 14 创建 check_x 数组包含问题的精确解。这些值是问题的已知精确解。 15. 设置相对容差和绝对容差的阈值这些值用于控制验证解的精度。 16. 遍历问题中的每个变量进行解的验证使用 CppAD::NearEqual 函数来比较问题的解与精确解是否足够接近。如果它们的差距在相对容差和绝对容差的范围内ok 变量将保持为真并打印每个变量的解。 17.返回 ok 变量表示问题是否成功求解。 5. C主函数main int main(void) {std::cout Ipopt with CppAD Testing std::endl;bool result get_started();std::cout Final checking: result std::endl; }main函数是程序的入口点它简单地调用get_started函数来执行非线性规划问题的求解并打印结果。 6. ☆☆☆带详细注释的完整程序☆☆☆ # include iostream // C style asserts # include cassert // 包含Ipopt求解器头文件 # include cppad/ipopt/solve.hpp// 在一个匿名的命名空间中引入了一个AD类型它是CppAD库中用于自动微分Automatic Differentiation的数据类型。AD类型可以用来表示变量和函数使其具备微分能力。 namespace {using CppAD::AD;class FG_eval {public:typedef CPPAD_TESTVECTOR( ADdouble ) ADvector;// fg: function that evaluates the objective and constraints using the syntax// 定义一个函数运算符用于计算目标函数和约束条件的值void operator()(ADvector fg, const ADvector x){ //使用assert来设定fg和x的大小以确保它们与问题的维度匹配//fg 向量用于存储目标函数值和约束条件值x向量用于存储优化变量assert( fg.size() 4 );assert( x.size() 4 );// 将 x 中的优化变量分配给 AD 类型的变量 x1 到 x4。这是在使用C Algorithmic DifferentiationCppAD时定义问题中的独立变量的方式。ADdouble x1 x[0];ADdouble x2 x[1];ADdouble x3 x[2];ADdouble x4 x[3];// 计算目标函数的值将其存储在 fg[0] 中。这里使用了 x1 到 x4 这些 AD 类型的变量这意味着这个表达式将被自动微分以便后续的梯度计算。fg[0] (x1-10.24) * (x1-10.24) 5.21*x2 9.9*(x3-x4)*(x3-x4);// 分别计算三个约束条件的值并将它们存储在 fg[1] 和 fg[2]、 fg[3]中。fg[1] x3-x4;fg[2] x2;fg[3] x2-x4;//std::cout fg[0]: fg[0] std::endl;std::cout fg[1]: fg[1] std::endl;std::cout fg[2]: fg[2] std::endl;std::cout fg[3]: fg[3] std::endl;return;}}; }// 该函数用于设置和解决非线性规划问题 // 它首先定义了问题的一些基本参数如变量数量、约束数量、变量的初始值、变量和约束的上下界等 // 然后创建一个FG_eval对象用于计算目标函数和约束条件 // 最后使用CppAD::ipopt::solve函数来解决问题并将结果存储在solution中 bool get_started(void) { bool ok true;size_t i;// 创建了一个类型别名 Dvector它是CppAD库中的一个向量类型用于存储双精度double数值。这个向量类型是CppAD库的一部分通常用于存储问题的变量、约束和其他向量。typedef CPPAD_TESTVECTOR( double ) Dvector;// 声明了一个 size_t 类型的变量 nx它表示问题中独立变量自变量的数量也就是问题的变量维度。在这个示例中有4个独立变量因此 nx 的值为4。size_t nx 4;// 声明了一个 size_t 类型的变量 ng它表示问题中的约束数量也就是约束的维度。在这个示例中有3个约束条件因此 ng 的值为3。size_t ng 3;// 创建了一个名为 xi 的 Dvector 类型的向量用于存储问题的独立变量自变量。这个向量有4个元素对应于4个自变量。Dvector xi(nx);// 分别为这4个独立变量设置了初始值。这些值将用作问题的初始猜测作为非线性规划求解器的起点。xi[0] 10.0;xi[1] 5.0;xi[2] 5.0;xi[3] 100.0;//设置问题的变量自变量和约束条件的上下界限制条件。Dvector xl(nx), xu(nx);for(i 0; i nx; i){ xl[i] 0;xu[i] 100;}Dvector gl(ng), gu(ng);gl[0] 2; gu[0] 10;gl[1] 2.99; gu[1] 100;gl[2] 0; gu[2] 0;// 创建了 FG_eval 类的对象 fg_eval用于计算目标函数和约束条件的值。这是问题的目标函数和约束条件的具体定义。FG_eval fg_eval;// 创建了一个字符串 options用于存储Ipopt求解器的选项。std::string options;// 设置了求解器选项将 print_level 参数设置为0以关闭求解器的输出即不会在控制台打印详细信息只打印关键信息。options Integer print_level 0\n;// 将 sb 参数设置为 yes这表示使用平衡约束优化方法。options String sb yes\n;// 设置最大迭代次数为10次。options Integer max_iter 10\n;// approximate accuracy in first order necessary conditions;// see Mathematical Programming, Volume 106, Number 1,// Pages 25-57, Equation (6)// 设置迭代停止的收敛容差为1e-6。options Numeric tol 1e-6\n;// 启用了二阶导数测试用于检查目标函数和约束条件的导数是否正确。options String derivative_test second-order\n;// maximum amount of random pertubation; e.g.,// when evaluation finite diff// 将随机扰动的半径设置为0表示不使用扰动进行数值近似求导。options Numeric point_perturbation_radius 0.\n;// 创建了一个用于存储求解结果的对象 solutionCppAD::ipopt::solve_resultDvector solution;// 调用了 CppAD::ipopt::solve 函数用于解决非线性规划问题。它传递了问题选项、独立变量的初始值、变量的上下界、约束条件的上下界、问题的定义fg_eval 对象以及存储结果的 solution 对象。CppAD::ipopt::solveDvector, FG_eval(options, xi, xl, xu, gl, gu, fg_eval, solution);//检查求解器的状态如果状态为成功success则 ok 变量将保持为真。这表示问题已成功求解。ok solution.status CppAD::ipopt::solve_resultDvector::success;// 创建一个名为 check_x 的数组其中包含了问题的精确解。这个数组中的值是问题的已知精确解。double check_x[] { 10.24, 2.99, 4.99, 2.99 }; // 设置了相对容差和绝对容差的阈值。这些值用于控制验证解的精度。double rel_tol 1e-6; // relative tolerancedouble abs_tol 1e-6; // absolute tolerance// 遍历问题中的每个变量进行解的验证。for(i 0; i nx; i){ //使用 CppAD::NearEqual 函数来比较问题的解 solution.x[i] 与精确解 check_x[i] 是否足够接近。如果它们的差距在相对容差和绝对容差的范围内ok 变量将保持为真。ok CppAD::NearEqual(check_x[i], solution.x[i], rel_tol, abs_tol ); // 使用 std::cout 打印每个变量的解以便在控制台上查看结果。std::cout x[ i ] solution.x[i] std::endl;}return ok; }// main program that runs all the tests int main(void) { std::cout Ipopt with CppAD Testing std::endl;bool result get_started();std::cout Final checking: result std::endl; } // END C三、编译验证 将上面第二部分第6步中给出的完整的程序保存为CppAD_Ipopt.cpp然后在同一目录下创建一个名为CMakeLists.txt的文件接下来我们需要在CMakeLists.txt文件中编写编译规则如下所示 # 设置CMake的最低版本要求 cmake_minimum_required(VERSION 3.5) # 项目名称 project(CppadIpoptDemo) # 寻找Ipopt包确保你已经安装了Ipopt和CppAD # find_package(Ipopt REQUIRED) # 设置可执行文件的名称和源文件 add_executable(cppad_ipopt_demo CppAD_Ipopt.cpp) # 包含Ipopt的头文件 # target_include_directories(cppad_ipopt_demo PRIVATE ${IPOPT_INCLUDE_DIRS}) # 链接Ipopt库 # target_link_libraries(cppad_ipopt_demo ${IPOPT_LIBRARIES}) TARGET_LINK_LIBRARIES(cppad_ipopt_demo ipopt)保存并关掉CMakeLists.txt文件接下来就利用该文件对CppAD_Ipopt.cpp进行编译在该目录下空白处右键打开终端依次输入以下四条语句 mkdir buildcd buildcmake ..make以上编译结束后在build文件夹下生成了可执行文件cppad_ipopt_demo如下图所示 在当前目录下右键打开终端输入以下指令运行该文件 ./cppad_ipopt_demo运行结果如下可以发现即使在给定的初始解很差的情况下Ipopt非线性求解器依然能够求解出第二部分第0部步中设定的带约束优化问题的最优解。
http://www.w-s-a.com/news/572571/

相关文章:

  • 网站建设案例教程视频空间刷赞网站推广
  • 网站建设借鉴做外贸球衣用什么网站
  • 网站建设的前途微信公众号制作网站
  • 做网站之前要安装什么网站改进建议有哪些
  • 网站建设+管理系统开发山东专业网站建设公司
  • 基础微网站开发咨询中国印花图案设计网站
  • 找最新游戏做视频网站天津市招标投标公共服务平台
  • 电影订票网站怎么做注册地址出租多少钱
  • 做网站的规划和设想怎样做能让招聘网站记住密码
  • 建站知乎网站公告建设方案
  • 济南市住房和城乡建设局官方网站淮阳住房和城乡建设网站
  • 网站的设计特点有哪些seo推广要多少钱
  • wordpress开通多站点好处软件开发外包公司的设计一般多少钱
  • 为什么我的网站做不起来微信网页版登录手机版下载
  • 苏州市建设职业中心网站北京网站优化方法
  • 于飞网站开发溧阳 招网站开发
  • 网站中的宣传册翻页动画怎么做长沙有哪些网络平台公司
  • 如何做视频门户网站网站建设模板ppt
  • 青岛黄岛区网站开发百度云盘登录入口
  • 建设银行甘肃省行网站房地产市场调研报告
  • js 网站制作合肥公司网站建设
  • 最好建网站系统的软件wordpress调用模版
  • 个人网站备案地址阿里云增加网站
  • 自己做网站要办手续吗重庆短视频制作公司排名
  • 哪个全球购网站做的好汉中门户网官网
  • 网站建设有哪几种wordpress 项目选项
  • 成都网站建设开发公司哪家好验证码插件 wordpress
  • 企业网站设计要点泰州市网站制作公司
  • 网站用户运营北京官方网站怎么做
  • 农业门户网站开发做首图的网站