优化问题,详解静态优化

优化问题,尤其静态优化问题,在控制系统设计中随处可见,例如基于燃油经济性和驾驶体验的多目标优化的汽车发动机 MAP 标定,基于性能指标优化的飞行器结构设计参数优化,以实验数据与模型输出匹配为目标的电池 RC 等效电路模型标定等等,他们都是通过构建目标函数(某个值的性能最大,或者某两个值之间的差距最小),然后调用优化算法实现设计变量寻优。

当设计变量变成一个函数,而这个函数对系统指标的影响又在时间先后上取决于一个动力学约束,这时候我们可能依然可以通过离散的方式将问题变成静态优化问题,当然这类问题也可以通过最优控制理论来实现,利用庞特里亚金极小值原理,动态规划来求解。例如混动车辆的 ECMS 算法,输出电池和发动机的能量分配序列满足电池 SOC 平衡的基础上油耗最低。

随着 AI 的引入,即使我们对于系统或模型一无所知,我们又可以通过试错的方式来获得一个长期奖励较优的控制器,用于处理序列决策问题,例如自动驾驶车辆或智能机器人的控制器控制序列,也就是强化学习的思路。本文接下来通过MATLAB示例来简单介绍这些概念的思想。

优化问题

对于一个普通的静态优化问题,可以描述为求解最优变量 x 使得 f(x) 最小[1],

同时满足约束条件:

图片

其中 x 是 n 维的设计变量向量,f(x) 是目标函数(通常是标量),和 m 维的函数向量 G(x),用于计算 x 处的等式和非等式约束。例如,求解这个示例:

目标函数

约束

图片

这个示例是典型的包含非线性约束的平滑问题,为了迭代高效,可以在目标函数和约束函数计算时中同时给出梯度。

function [f,gf] = onehump(x)

% ONEHUMP Helper function for Tutorial for the Optimization Toolbox demo

%   Copyright 2008-2009 The MathWorks, Inc.

r = x(1)^2 + x(2)^2;

s = exp(-r);

f = x(1)*s+r/20;

gf = [(1-2*x(1)^2)*s+x(1)/10;

       -2*x(1)*x(2)*s+x(2)/10];

end

function [c,ceq,gc,gceq] = tiltellipse(x)

% TILTELLIPSE Helper function for Tutorial for the Optimization Toolbox demo

%   Copyright 2008-2009 The MathWorks, Inc.

c = x(1)*x(2)/2 + (x(1)+2)^2 + (x(2)-2)^2/2 - 2;

ceq = [];

gc = [x(2)/2+2*(x(1)+2);

       x(1)/2+x(2)-2];

gceq = [];

end

构建完目标函数和约束函数,这样就可以调用 fmincon 求解器求解这个非线性平滑约束的优化问题,

options = optimoptions(options,...

'SpecifyObjectiveGradient',true,...

 'SpecifyConstraintGradient',true);

[x,fval,exitflag,output] = fmincon(@onehump,x0,[],[],[],[],[],[], ...

                                   @tiltellipse,options);

xold = x

xold = 2x1

      - 0.9727

        0.4686

于是得到约束条件下的最优解(红色的点):

图片

这类有约束的问题中,我们的优化变量是数值向量,我们可以通过 MATLAB 内置的求解器来求解极值点(算法参考[2]),也可以使用符号数学工具箱,利用函数的极值条件, 手动构建 Lagrange multiplier(将等式约束问题转换为无约束问题)或者KKT条件进行求解,例如,针对 Lagrange multiplier 方法,在 g(x)=0 的等式约束条件下求解 f(x) 最小,可以先构造 Lagrangian 函数:

图片

需要满足极值条件:

图片

我们可以用这种方法求解优化问题(1-1)(因为有不等式约束,下面的脚本添加了 s1 项变成等式约束,读者也可以尝试使用 KKT 条件进行含不等式约束问题的求解),可以得到和数值求解相同的结果。

syms x y s1 lambda

f = x.*exp(-x.^2-y.^2)+(x.^2+y.^2)/20;

g = x.*y/2+(x+2).^2+(y-2).^2/2-2+s1^2==0;

L = f + lambda*lhs(g);

dL_dx = diff(L,x)==0;

dL_dy = diff(L,y)==0;

% derivative of L with respect to lambda

dL_dlambda = diff(L,lambda) == 0;

dL_ds1=diff(L,s1) == 0;

% build the system of equations

system = [dL_dx; dL_dy; dL_dlambda;dL_ds1];

% solve the system of equations

[x_val, y_val, lambda_val, s1_val] = ...

solve(system, [x y lambda s1], 'Real', true);

% show results in a vector of data type double

results_numeric = double([x_val; y_val]) 

results_numeric = 2x1

      - 0.9727

        0.4686

 

   免费分享一些我整理的人工智能学习资料给大家,整理了很久,非常全面。包括一些人工智能基础入门视频+AI常用框架实战视频、图像识别、OpenCV、NLP、YOLO、机器学习、pytorch、计算机视觉、深度学习与神经网络等视频、课件源码、国内外知名精华资源、AI热门论文等。

下面是部分截图,加我免费领取

目录

一、人工智能免费视频课程和项目

二、人工智能必读书籍

三、人工智能论文合集

四、机器学习+计算机视觉基础算法教程

最后,我想说的是,自学人工智能并不是一件难事。只要我们有一个正确的学习方法和学习态度,并且坚持不懈地学习下去,就一定能够掌握这个领域的知识和技术。让我们一起抓住机遇,迎接未来!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以点击链接领取 

二维码详情

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

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

相关文章

Hdoop学习笔记(HDP)-Part.13 安装Ranger

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

实现简单的Http服务器+SpringMvc,集成到Spring

实现简单的Http服务器SpringMvc,集成到Spring 1、Http协议 1.1、HTTP 协议请求格式 方法 空格 URL 空格 版本 回车符 换行符头部域名称:头部域值 回车符 换行符...头部域名称:头部域值 回车符 …

VMware下载安装教程

目录 一.下载二.安装 一.下载 官网地址:官网 下载的时候选择Workstation Player,这个是免费的,当然你也可以选择下载Workstation Pro。 二.安装 下载完成之后点击安装包按照需要安装即可。 安装之后启动,可以看到这个能够免费使…

26. 深度学习进阶 - 深度学习的优化方法

Hi, 你好。我是茶桁。 上一节课中我们预告了,本节课是一个难点,同时也是一个重点,大家要理解清楚。 我们在做机器学习的时候,会用不同的优化方法。 SGD 上图中左边就是Batch Gradient Descent,中间是Mini-Batch Gra…

Linux系统的常见命令十三,显示系统进程状态、文件权限、修改文件或目录所有者和所属组命令(ps、chmod和chown)

本文主要介绍Linux系统的显示系统进程状态、文件权限、修改文件或目录所有者和所属组命令,(ps、chmod和chown) 目录 显示系统进程状态文件权限设置(chmod)修改文件或目录所有者和所属组(chown) …

进制转化总结

来源,做个笔记,讲的还蛮清楚通信原理-2.5 数据封装与传输05_哔哩哔哩_bilibili ip地址范围 ​​​​​​​

39.从0到上线三天搭建个人网站(第三天)

点赞收藏加关注,你也能住大别墅! 一、第三天主要工作 1.完成detail页面的开发 2.将所有数据以及部分静态资源存在uniCloud,为以后做管理后台做准备 3.创建云对象getData,在beforecreate()中获取数据 4.…

C++ list容器

文章目录 C++ list容器list基本概念list构造函数list 赋值和交换list 大小操作list 插入和删除list 数据存取list 反转和排序排序案例C++ list容器 list基本概念 功能:将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中…

8通道16位数据采集卡方案

硬件方案--采集板 下载链接!https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247558420&idx1&sn3b1d6a99a69e68c32f425e489c21b6d5&chksmfcfaf6c3cb8d7fd52961827dedf30a79e65ed96e5b507bc5027d80f9285aa9bdcf790b940b51&token1650944467…

python之pyqt专栏10-键盘事件

需求 通过按键盘的上下左右,移动button的位置。 UI界面设计 代码 # 导入sys模块 import sysfrom PyQt6.QtCore import Qt # PyQt6.QtWidgets模块中导入QApplication, QWidget from PyQt6.QtWidgets import QApplication, QWidget# untitled模块中导入Ui_Form类 f…

跳表的基础

跳表的作用 无需数组查找目标元素-----从头遍历---O(n); 有序数组查找目标元素-----二分查找---O(logn); 链表查找目标元素----------只能从头遍历---O(n); 那么链表要如何实现O(logn)的查找时间复杂度呢-----跳表。 跳表的定义 有序链表多级索引跳表 就是一个多级链表 …

css小技巧 linear-gradient

设计图&#xff1a; 现在的要求是不准用图片&#xff0c;好吧&#xff0c;那就用代码简单实现下。 方式1&#xff1a;svg <svg xmlns"http://www.w3.org/2000/svg" version"1.1"><rect x"-30" y"1" rx"8" ry&quo…