基于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,一经查实,立即删除!

相关文章

Java 串行接口调用优化

准备面试总结下 1.CompletableFuture static ThreadPoolExecutor poolExecutor new ThreadPoolExecutor(10, 20, 1000L, TimeUnit.MICROSECONDS, new ArrayBlockingQueue<>(100));public static void main(String[] args) throws ExecutionException, InterruptedExcep…

Redis哨兵机制原理

Redis哨兵机制可以保证Redis服务的高可用性。它通过启动一个或多个哨兵进程&#xff0c;监控Redis主服务器是否宕机&#xff0c;如果宕机&#xff0c;哨兵进程会自动将一个从服务器&#xff08;Slave&#xff09;升级为主服务器&#xff08;Master&#xff09;&#xff0c;并通…

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…

java try 自动关闭流

Java Try自动关闭流实现步骤 在开始之前&#xff0c;我们先来了解一下整个实现过程的流程。下面的表格展示了实现"try自动关闭流"的步骤&#xff1a; 步骤 描述 1 创建需要操作的流对象 2 在try语句块中使用流对象 3 在try语句块中自动关闭流对象 接下来…

uniapp web-view调整修改高度设置

web-view默认是占全屏&#xff0c;需求想要在头部添加一个返回导航。实现如下&#xff1a; 界面如下&#xff1a; <view class"myCardNav"><!-- 状态栏占位符 --><uni-nav-bar height"125rpx" border"false" left-icon"le…

【目录】RV1103/RV1106开发记录

【RV1103】Luckfox Pico RV1103 开发记录 【RV1103】Luckfox Pico 构建系统分析 【RV1103】RTL8723bs (SD卡形状模块)驱动开发 【RV1103】SD卡和无线WiFi同时使用

京东商品数据: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;所以近段时间系统在商品定价上做了扩展。 二、商…

Mybatis事务如何跟Spring结合到一起?

Mybatis事务如何跟Spring结合到一起&#xff1f; 在Java Web开发中&#xff0c;MyBatis和Spring是两个常用的框架&#xff0c;它们可以有效地结合在一起&#xff0c;提供强大的数据库事务管理功能。在本文中&#xff0c;我们将从数据库事务特性和Spring事务管理源码两个角度来…

2562.找出数组中的串联值

2562. 找出数组的串联值 - 力扣&#xff08;LeetCode&#xff09; 给你一个下标从 0 开始的整数数组 nums 。 现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。 例如&#xff0c;15 和 49 的串联是 1549 。 nums 的 串联值 最初等于 0 。执行下述操作直到 nums…

【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;我们通…

IX模式和其他模式

根据您提到的 "IX 模式"&#xff0c;我猜测您可能是在讨论分布式事务处理中的一种模式。通常&#xff0c;在分布式事务领域&#xff0c;存在多种模式和协议&#xff0c;用于实现不同类型的分布式事务。以下是一些常见的分布式事务模式以及一些其他常见的模式&#xf…

爬虫数据采集:探秘网络数据的捕获之道

随着互联网的发展&#xff0c;大量的数据被存储在各种网站和服务器上。为了获取这些数据&#xff0c;人们开发了一种称为爬虫的技术&#xff0c;它可以自动化地从网页上提取所需的信息。本文将介绍爬虫数据采集的原理。 网页结构分析&#xff1a;爬虫首先需要分析目标网页的结构…

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

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