基于NLopt的C语言非线性优化案例

以官方给的例程,重新梳理,以供理解NLopt的使用。

在这里插入图片描述

问题被定义为:
min ⁡ x ∈ R 2 x 2 s u b j e c t t o x 2 ≥ 0 , x 2 ≥ ( a 1 x 1 + b 1 ) 3 , a n d x 2 ≥ ( a 2 x 1 + b 2 ) 3 f o r p a r a m e t e r s a 1 = 2 , b 1 = 0 , a 2 = − 1 , b 2 = 1. \begin{gathered} \min_{\mathbf{x}\in\mathbb{R}^2}\sqrt{x_2} \\ \mathrm{subject~to~}x_2\geq0,x_2\geq(a_1x_1+b_1)^3,\mathrm{and~}x_2\geq(a_2x_1+b_2)^3 \\ \mathrm{for~parameters~a_{1}=2,~b_{1}=0,~a_{2}=-1,~b_{2}=1.} \end{gathered} xR2minx2 subject to x20,x2(a1x1+b1)3,and x2(a2x1+b2)3for parameters a1=2, b1=0, a2=1, b2=1.

使用步骤如下:

  • 创建nlopt对象
  • 设置上下边界
  • 设置不等式约束
  • 设置优化目标
  • 设置迭代停止条件,参考传送门
  • 设置算法起始点
  • 执行优化函数
#include <stdio.h>
#include <math.h>
#include "nlopt.h"
#include <stdlib.h>
#define INF (1.0/0.0)typedef struct {double a, b;
} my_constraint_data; // 约束参数// 目标函数
int item_count = 0;
double myfunc(unsigned n, const double *x, double *grad, void *my_func_data)
{++item_count;if (grad) {grad[0] = 0.0;grad[1] = 0.5 / sqrt(x[1]);}return sqrt(x[1]);
}// 约束函数
double myconstraint(unsigned n, const double *x, double *grad, void *data)
{my_constraint_data *d = (my_constraint_data *) data;double a = d->a, b = d->b;if (grad) {grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b);grad[1] = -1.0;}return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]);}int main()
{// 创建nlopt对象nlopt_opt opt;opt = nlopt_create(NLOPT_LD_MMA, 2); /* algorithm and dimensionality */// 设置上下边界double lb[2] = {-HUGE_VAL, 0 }; /* lower bounds */double ub[2] = {INF, INF};nlopt_set_lower_bounds(opt, lb);nlopt_set_upper_bounds(opt, ub);// 设置优化目标nlopt_set_min_objective(opt, myfunc, NULL);// 添加不等式约束my_constraint_data data[2] = { {2,0}, {-1,1} }; // a1=2,b1=0   a2=-1,b2=1nlopt_add_inequality_constraint(opt, myconstraint, &data[0], 1e-8); // 1e-8是约束的可选容差nlopt_add_inequality_constraint(opt, myconstraint, &data[1], 1e-8);// 优化参数x的相对容差nlopt_set_xtol_rel(opt, 1e-4);double x[2] = { 1.234, 5.678 };  /* `*`some` `initial` `guess`*` */double minf; /* `*`the` `minimum` `objective` `value,` `upon` `return`*` */// 执行优化if (nlopt_optimize(opt, x, &minf) < 0) {printf("nlopt failed!\n");}else {printf("found minimum at f(%g,%g) = %0.10g\n", x[0], x[1], minf);}printf("found minimum after %d evaluations\n", item_count);// 销毁对象nlopt_destroy(opt);return 0;
}

案例2:

#include<iostream>
#include <vector>
#include <string>
#include <iomanip>
#include <nlopt.hpp>
#include <stdio.h>
#include <math.h>
using namespace std;
using namespace nlopt;
/** main.c**  Created on: Oct 9, 2018*      Author: lgh*/
#define INF (1.0/0.0)
int i=0;//目标函数;
double utility(unsigned n, const double *x, double *grad, void *data)
{if(grad){grad[0]=2*x[0];grad[1]=2*x[1];grad[2]=1.0;grad[3]=2*x[3];}printf("迭代次数 i= %d, x[0]=%f, x[1]= %f,x[2]= %f,x[3]= %f,f(x1,x2,x3,x4)=%f\n",i++,x[0],x[1],x[2],x[3],x[0]*x[0]+x[1]*x[1]+x[2]+x[3]*x[3]+10);return ( x[0]*x[0]+x[1]*x[1]+x[2]+x[3]*x[3]+10 );
}//等式限制条件;
double constraint(unsigned n, const double *x, double *grad, void *data)
{if(grad){grad[0]= 1.0;grad[1]= 1.0;grad[2]= 1.0;grad[3]= 1.0;}return (x[0]+x[1]+x[2]+x[3]);
}//不等式限制条件;
double inconstraint(unsigned n, const double *x, double *grad, void *data)
{if(grad){grad[0]= -2*x[0];grad[1]= -2*x[1];}return (-x[0]*x[0]-x[1]*x[1]-100);
}int main(int argc, char const *argv[])
{double tol=1e-8;double lb[4]={-INF,-INF,-INF,-INF};          //x1、x2的下边界;double ub[4]={INF,INF,INF,INF};double x[4]={1, 1, 1, 1};      //给x1、x2赋予初始值;double f_max;nlopt_opt opter=nlopt_create( NLOPT_LD_SLSQP, 4);//设置自变量下限;nlopt_set_lower_bounds(opter, lb);// 目标函数;nlopt_set_min_objective(opter, utility, NULL);// 不等式约束;nlopt_add_inequality_constraint(opter, inconstraint, NULL, tol);// 等式约束;nlopt_add_equality_constraint(opter, constraint, NULL, tol);// 停止时需要的条件;nlopt_set_xtol_rel(opter, tol);// 开始优化;nlopt_result result=nlopt_optimize(opter, x, &f_max);if (result){printf("目标函数最大值=%g, x=(%g,%g)\n", f_max, x[0], x[1], x[2], x[3]);}//freenlopt_destroy(opter);return 0;
}

参考链接:https://www.cnblogs.com/derek-dhb/p/17497953.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript使用类-模态窗口

**上节课我们为这个项目获取了一些DOM元素&#xff0c;现在我们可以继续&#xff1b;**这个模态窗口有一个hidden类&#xff0c;这个类上文我们讲了&#xff0c;他的display为none&#xff1b;如果我们去除这个hidden的话&#xff0c;就可以让这个模态窗口展现出来。如下 cons…

【Debian系统】:安装debian系统之后,很多命令找不到,需要添加sudo之后才能使用,以下解决方法

项目场景&#xff1a; 问题描述 解决方案&#xff1a; 1.临时解决方案 2.永久解决方案 1.首先打开编辑&#xff1a; 2.打开之后最后一行添加代码&#xff1a; 3.最后运行一遍 .bashrc 4.已经可以了&#xff0c;可以试试reboot&#xff0c;重启一下机子 一点一滴才能成长 …

windows的最佳选项卡式窗口管理器软件TidyTabs

下载&#xff1a; https://jmj.cc/s/z1t3kt?pucodeS1wc https://download.csdn.net/download/mo3408/88420433 TidyTabs是一款Windows应用程序&#xff0c;它可以将多个打开的窗口整理成一个选项卡式的界面&#xff0c;使得用户可以更加方便地切换和管理不同的窗口。 Tidy…

京东商品数据:8月京东环境电器行业数据分析

8月份&#xff0c;环境电器大盘市场整体下滑。鲸参谋数据显示&#xff0c;8月京东平台环境电器的大盘将近570万&#xff0c;环比下滑约29%&#xff0c;同比下滑约10%&#xff1b;销售额为25亿&#xff0c;环比下滑约23%&#xff0c;同比下滑约8%。 *数据源于鲸参谋-行业趋势分析…

网工内推 | 技术支持工程师,厂商公司,HCIA即可,有带薪年假

01 华为终端有限公司 招聘岗位&#xff1a;初级技术支持 职责描述&#xff1a; 1、通过远程方式处理华为用户在产品使用过程中各种售后问题&#xff1b; 2、收集并整理消费者声音&#xff0c;提供服务持续优化建议&#xff1b; 3、对服务中发现的热点、难点问题及其他有可能造…

iMazing2023免费版苹果iPhone手机备份应用软件

iMazing是一款功能强大的苹果手机备份软件&#xff0c;它可通过备份功能将通讯录备份到电脑上&#xff0c;并在电脑端iMazing“通讯录”功能中随时查看和导出联系人信息。它自带Wi-Fi自动备份功能&#xff0c;能够保证通讯录备份数据是一直在动态更新的&#xff0c;防止手机中新…

收银系统商品定价设计思考

一、背景 因为门店系统里商品总共也就几万款&#xff0c;一直以来都是根据条码由总部统一定价销售&#xff0c;现在有加盟店&#xff0c;各门店也有进行各自促销活动的需求&#xff0c;这就需要放开门店自主定价权&#xff0c;所以近段时间系统在商品定价上做了扩展。 二、商…

【SCS-CN】SCS-CN模型中CN值的确定

目录 一、说明二、SWAT三、HEC-HMS四、CN值转换公式五、确定CN25.1 ArcSWAT 2009用户指南5.2 SWAT plus Document5.3 National Engineering Handbook5.4 HEC-HMS水文建模系统原理方法应用5.5 Technical Release 55 (TR-55) 六、确定水文土壤单元&#xff08;HSG&#xff09;6.1…

移动应用-Android开发基础\核心知识点

Android开发基础 知识点 1 介绍了解2 系统体系架构3 四大应用组件4 移动操作系统优缺点5 开发工具6 配置工具7 下载相关资源8JDK下载安装流程9配置好SDK和JDK环境10 第一个Hello word11 AS开发前常用设置12模拟器使用运行13 真机调试14 AndroidUI基础布局15 加载展示XML布局16…

JS VUE 用 canvas 给图片加水印

最近写需求&#xff0c;遇到要给图片加水印的需求。 刚开始想的方案是给图片上覆盖一层水印照片&#xff0c;但是这样的话用户直接下载图片水印也会消失。 后来查资料发现用 canvas 就可以给图片加水印&#xff0c;下面是处理过程。 首先我们要确认图片的格式&#xff0c;我们通…

华为云云耀云服务器L实例评测|使用redis事务和lua脚本

文章目录 云服务器的类型云服务优点redis一&#xff0c;关系型数据库&#xff08;sqlserver&#xff0c;mysql&#xff0c;oracle&#xff09;的事务隔离机制说明&#xff1a;redis事务机制 lualua脚本好处&#xff1a;一&#xff0c;怎么在redis中使用lua脚本二&#xff0c;脚…

【网络安全】「漏洞原理」(一)SQL 注入漏洞之概念介绍

前言 严正声明&#xff1a;本博文所讨论的技术仅用于研究学习&#xff0c;旨在增强读者的信息安全意识&#xff0c;提高信息安全防护技能&#xff0c;严禁用于非法活动。任何个人、团体、组织不得用于非法目的&#xff0c;违法犯罪必将受到法律的严厉制裁。 【点击此处即可获…

redis在linux系统的安装与使用

一、单机安装Redis。 1.安装redis依赖 在控制台输入 yum install -y gcc tcl2.上传安装包 下载好的安装包上传到/usr/local/src/ 上传方法&#xff1a; 1.确保你拥有Linux服务器的IP地址、用户名和密码。 2.在Windows上&#xff0c;打开命令提示符&#xff08;Command Promp…

C# redis通过stream实现消息队列以及ack机制

redis实现 查看redis版本 redis需要>5.0 Stream 是 Redis 5.0 引入的一种专门为消息队列设计的数据类型&#xff0c;Stream 是一个包含 0 个或者多个元素的有序队列&#xff0c;这些元素根据 ID 的大小进行有序排列。 它实现了大部分消息队列的功能&#xff1a; 消息 ID…

Unity MRTK Hololens2眼动交互

/** ** UnityVersion : 2021.3.6f1* Description : 眼部交互基类* Author: * CreateTime : 2023-10-11 09:43:20* Version : V1.0.0* * */using System.Collections.Generic; using Microsoft.MixedReality.Toolkit.Input; using UnityEngine;namespace MRTKExtend.EyeTrackin…

神秘的锦衣卫

在看明朝电视剧经常听到的一句台词&#xff1a;锦衣卫办案&#xff0c;闲杂人等速速离开。锦衣卫是明朝特务机构&#xff0c;直接听命于皇帝&#xff0c;是亲军卫之一&#xff0c;也是最重要的一卫。 1、卫所制 卫所制是明代最主要的军事制度&#xff0c;其目标是寓兵于农、屯…

22字符串-简单反转

目录 BM&#xff08;Boyer-Moore&#xff09; 坏字符 好后缀 什么情况用哪个规则&#xff1f; LeetCode之路——151. 反转字符串中的单词 分析: 字符串匹配中除了简单的BF&#xff08;Brute Force&#xff09;、RK&#xff08;Rabin-Karp&#xff09;算法&#xff0c;还有…

PHP Discord获取频道消息功能实现

PHP Discord获取频道消息功能实现 1. 关注对应频道2. 添加机器人3. 配置机器人权限4. 使用 DiscordPHP 类库5. 代码示例 (Laravel 框架)6. 服务器部署 1. 关注对应频道 首先要创建自己的频道, 然后到对应的公告频道中关注这个频道(这时 Discord 会让你选择频道, 选择之前创建的…

区块链游戏的开发框架

链游&#xff08;Blockchain Games&#xff09;是基于区块链技术构建的游戏。它们与传统游戏有一些显著不同之处&#xff0c;因此需要特定的开发框架和工具。以下是一些用于链游开发的开发框架及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专…

基于STM32_DS18B20单总线传感器驱动

基于STM32_DS18B20单总线传感器驱动 文章目录 基于STM32_DS18B20单总线传感器驱动前言一、BS18B20&#xff1f;二、原理1.复位与检验2.基本命令3.唯一ROM识别码4.温度转换 三、驱动代码四、注意事项 前言 本文以一款典型的单总线传感器及其驱动——DS18B20为例&#xff0c;简单…