基于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.hqwc.cn/news/132953.html

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

相关文章

VulnHub 兰皮昂 1 Lampiao

一、信息收集 发现开发了22、80、1898端口 访问1898端口&#xff1a; 2.目录扫描 dirb http://192.168.103.179:1898 访问robots.txt目录 发现版本是 Drupal 7.54, 2017-02-01 二、漏洞利用 1.利用msf use 4 set RHOTS 192.168.103.179set RPORT 1898run #运行 shell #she…

Python in Visual Studio Code 2023年10月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展于 2023 年 10 月发布&#xff01; 此版本包括以下公告&#xff1a; Python 调试器扩展更新弃用 Python 3.7 支持Pylint 扩展更换时的 Lint 选项Mypy 扩展报告的范围和守护程序模式G…

02Maven核心程序的下载与settings.xml文件的配置,环境变量的配置

Maven核心程序的解压与配置 Maven的下载与解压 Maven官网下载安装包 将下载的Maven核心程序压缩包apache-maven-3.8.4-bin.zip解压到一个非中文且没有空格的目录 Maven的核心配置文件 在Maven的解压目录conf中我们需要配置Maven的核心配置文件settings.xml 配置本地仓库位置…

【Node.js】路由

基础使用 写法一&#xff1a; // server.js const http require(http); const fs require(fs); const route require(./route) http.createServer(function (req, res) {const myURL new URL(req.url, http://127.0.0.1)route(res, myURL.pathname)res.end() }).listen…

Redis - php通过ssh方式连接到redis服务器

1.应用场景 主要用于使用php通过ssh方式连接到redis服务器&#xff0c;进行一些操作. 2.学习/操作 1.文档阅读 chatgpt & 其他资料 SSH - 学习与实践探究_ssh应用场景 2.整理输出 2.1 是什么 TBD 2.2 为什么需要「应用场景」 TBD 2.3 什么时候出现「历史发展」 TBD 2.4 …

HTTP协议是什么

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议&#xff0c;是一种网络通信协议。 超文本&#xff1a;所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据。…

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要&#xff1a; 生物系统有大量的视觉运动检测神经元&#xff0c;其中一些神经元可以优先对特定的视觉区域做出反应。然而&#xff0c;关于如何使用它们来开发用于全向碰撞检测的神经网络模型&#xff0c;很少有人做过工作。为此&#…

Unity可视化Shader工具ASE介绍——5、ASE快捷键和常用节点介绍

大家好&#xff0c;我是阿赵。   继续介绍Unity可视化Shader插件ASE。这次来说一些常用节点的快捷键&#xff0c;顺便介绍一些常用的节点。   用过UE引擎的朋友可能会发现&#xff0c;ASE的整体用法和UE的材质节点编辑器非常的像&#xff0c;甚至连很多节点的快捷键都和UE的…

Apache Solr9.3 快速上手

Apache Solr 简介 Solr是Apache的顶级开源项目&#xff0c;使用java开发 &#xff0c;基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句&#xff0c;而且它可扩展、可配置&#xff0c;同时它对Lucene的性能进行了优化。 安装 下载 : 下载地址解压 : tar -zxv…

一文理清JVM结构

JVM结构介绍 JVM一共分为三个组成部分: 1 类加载子系统 主要是将class文件加载到内存中的一个系统&#xff0c;其核心组件是类加载器 2 运行时数据区子系统 1 JVM私有部分 1 虚拟机栈 描述的是Java方法执行的内存模型&#xff1a;每个方法在执行的同时都会创建一个栈帧&…

cap分布式理论

cap 理论 cap是实现分布式系统的思想。 由3个元素组成。 Consistency&#xff08;一致性&#xff09; 在任何对等 server 上读取的数据都是最新版&#xff0c;不会读取出旧数据。比如 zookeeper 集群&#xff0c;从任何一台节点读取出来的数据是一致的。 Availability&…

Java架构师系统架构设计资源估算

目录 1 认识资源估算1.1 预估未来发展1.2 资源估算的意义 2 资源估算方法2.1 确定系统目标2.2 并发用户数2.3 指标数据 3 资源估算的经验法则4 资源估算的常见参考数据4.1 带宽估算4.2 nginx估算4.3 tomcat估算4.4 操作系统估算4.5 redis估算4.6 mysql估算 5 并发人数估算5.1 请…