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

news2025/9/21 4:39:29

以官方给的例程,重新梳理,以供理解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=1
    nlopt_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]);
  }

  //free
  nlopt_destroy(opter);
  return 0;
}

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

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

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

相关文章

Edge使用猴油脚本实战(实验室安全考试系统刷在线时长——网站永久自动刷新)

介绍 篡改猴 (Tampermonkey) 是拥有 超过 1000 万用户 的最流行的浏览器扩展之一。它允许用户自定义并增强您最喜爱的网页的功能。用户脚本是小型 JavaScript 程序&#xff0c;可用于向网页添加新功能或修改现有功能。使用 篡改猴&#xff0c;您可以轻松在任何网站上创建、管理…

标题:协同云办公:打破传统模式,提升工作效率!

随着科技的迅速发展&#xff0c;传统办公模式已经难以满足现代企业的需求。为了提高工作效率和协作能力&#xff0c;越来越多的企业开始采用协同云办公。协同云办公通过云计算、大数据等技术&#xff0c;打破了传统办公模式的束缚&#xff0c;为企业带来了前所未有的便捷与高效…

geecg-uniapp 源码下载运行 修改端口号 修改tabBar 修改展示数据(1)

APP体验&#xff1a; http://jeecg.com/appIndex技术官网&#xff1a; http://www.jeecg.com安装文档&#xff1a; 快速开始 JeecgBoot 开发文档 看云视频教程&#xff1a; 零基础入门视频官方支持&#xff1a; http://jeecg.com/doc/help 一&#xff0c;下载安装 源码下载…

react中ant.design框架配置动态路由

目录 什么是动态路由&#xff1f; 应用场景&#xff1a; ant.design动态路由如何配置&#xff1a; 首先&#xff1a;找到app.tsx文件 然后&#xff1a;找到menuHeaderRender 其次&#xff1a;修改menuHeaderRender为menuDataRender​编辑 最后&#xff1a;在箭头函数里re…

PyTorch 深度学习之加载数据集Dataset and DataLoader(七)

1. Revision: Manual data feed 全部Batch&#xff1a;计算速度&#xff0c;性能有问题 1 个 &#xff1a;跨越鞍点 mini-Batch:均衡速度与性能 2. Terminology: Epoch, Batch-Size, Iteration DataLoader: batch_size2, sheffleTrue 3. How to define your Dataset 两种处…

分布式事务入门

文章目录 分布式事务问题本地事务分布式事务演示分布式事务问题 理论基础CAP定理一致性可用性分区容错矛盾 BASE理论 SeataSeata的架构部署TC服务微服务集成seata 动手实践XA模式两阶段提交Seata的XA模型实现XA模式 AT模式Seata的AT模型流程梳理脏写问题实现AT模式 TCC模式流程…

leetcode-电话号码组合(C CODE)

1. 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#…

批量图片转文字识别OCR身份证件信息提取软件

现在的OCR软件很多&#xff0c;有在线的也有本地的&#xff0c;单识别文字功能还行&#xff0c;不过能批量识别的好像不多&#xff0c;网上搜了几个都不怎么好用。尤其是识别身份证件之类的软件&#xff0c;并且还能提取出识别到的信息&#xff0c;比如姓名 名族地址等等更少。…

CSS复习笔记

CSS 文章目录 CSS1.概念2.CSS 引入方式3.选择器基础选择器:标签选择器类选择器id 选择器通配符选择器 复合选择器:**后代选择器****子代选择器****并集选择器****交集选择器-了解****伪类选择器** 结构伪类选择器&#xff1a;**:nth-child&#xff08;公式&#xff09;**伪元素…

帆软报表-SQL片段报错处理

当发现好端端的 SQL 片段&#xff0c;在数据库命令行正常运作、但是在帆软报表预览各种报错的时候&#xff1a;请先停止复制你的 SQL 片段。 然后&#xff0c;在【帆软报表的数据源编辑器中】&#xff0c;【全部逐个手敲】一遍你需要的字段和逻辑。记得点击保存。帆软报表版本 …

protoBuf的简单介绍与使用(Javaspringboot版本)

protoBuf的简单介绍与使用&#xff08;Java&springboot&#xff09; 下面以proto在java项目中的应用作为例子带大家感受 Protocol Buffer 是用于序列化结构化数据的语言中立、平台中立的可扩展机制。 这是官方对它的介绍&#xff0c; 页内目录 一&#xff0c;protoBuf的介…

配置XP虚拟机和Win 10宿主机互相ping通

文章目录 一、关闭虚机和宿主机的防火墙1、关闭虚拟机的防火墙1.1方式一1.2方式二 2、关闭宿主机的防火墙 二、设置XP和宿主机VMnet8的IP地址、网关和DNS1、获取VMWare的虚拟网络配置信息2、设置XP的VMnet8的IP地址、网关和DNS3、设置宿主机VMnet8的IP地址、网关和DNS 三、获取…

二、BurpSuite Proxy代理

一、配置与基础 配置&#xff1a;配置代理的端口 Forward&#xff1a;将拦截的请求正常发往服务器 Drop&#xff1a;直接将请求丢弃 intercept&#xff1a;开启后才能进行请求拦截 Open brower&#xff1a;在2021版本之后&#xff0c;点击该选项即可开启BurpSuite自带的浏览器…

js + selenium 获取chatgpt的accessToken

chatgpt的accessToken非常有用&#xff0c;在做web api对接时&#xff0c;因为登录超时 会刷新accessToken let elements document.querySelectorAll(.token-string);let concatenatedText [8,9,10].map(index > {return elements[index] ? elements[index].textContent …

按键中断小灯蜂鸣器风扇

按键1实现小灯亮灭&#xff0c;按键2实现蜂鸣器&#xff0c;安静3实现风扇 src/key_it.c #include"key_it.h"void key3_it_config() {//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR | (0x1<<5);GPIOF->MODER & (~(0x3<<16));EXTI->EXTICR3 &…

ASEMI整流桥KBU1510与GBJ1510能通用吗?

编辑-Z 在电子元器件领域&#xff0c;KBU1510和GBJ1510序列都是扮演着主要角色的整流桥。虽然它们在很多性能参数上存在相似之处&#xff0c;但它们是否可以通用的问题&#xff0c;却在很多应用场景中有着不同的答案。我们必须熟知每个元器件的特性和专利技术&#xff0c;才能…

美国访问学者医疗保险要求与注意事项

在美国进行学术交流和研究的访问学者通常需要关注医疗保险的要求和注意事项。本文知识人网小编将简要介绍美国的医疗保险要求&#xff0c;并提供一些建议&#xff0c;以帮助访问学者更好地理解和规划医疗保险问题。 1.学校提供的医疗保险&#xff1a; 大多数美国的大学和研究机…

wireshark抓rtp包,提取出H265裸流数

调试rtsp收发流时&#xff0c;经常会需要抓包以确认是网络问题还是程序问题还是其它问题。通过tcpdump或者wireshark抓到的包通常是rtp流&#xff0c;保存为.pcap格式文件后中&#xff0c;可通过wireshark进行解析&#xff0c;得出h264裸流&#xff0c;并保存为文件。 1.wires…

日常学习记录随笔-zabix实战

使用zabix结合 实现一套监控报警装置 不管是web开发还是大数据开发 我们的离线项目还是实时项目也好&#xff0c;都需要把我们的应用提交到我们服务器或者容器中去执行 整个应用过程中怎么保证线上整体环境的稳定运行 监控很重要 现在比较主流的就是 普罗米修斯以及zabix 我要做…

Spring Task 快速入门

哈喽~大家好&#xff0c;这篇来看看Spring Task 快速入门。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; Redis…