【重新定义matlab强大系列十四】基于问题求解有/无约束非线性优化

news2024/9/28 5:22:40

🔗 运行环境:Matlab

🚩 撰写作者:左手の明天

🥇 精选专栏:《python》

🔥  推荐专栏:《算法研究》

#### 防伪水印——左手の明天 ####

💗 大家好🤗🤗🤗,我是左手の明天!好久不见💗

💗今天开启新的系列——重新定义matlab强大系列💗

📆  最近更新:2023 年 09 月 23 日,左手の明天的第 291 篇原创博客

📚 更新于专栏:matlab

#### 防伪水印——左手の明天 ####


约束优化定义

约束最小化问题求向量 x,在满足 x 取值约束的前提下,使得标量函数 f(x) 取得局部最小值:

使得以下一项或多项成立:c(x) ≤ 0, ceq(x) = 0, A·x ≤ b, Aeq·x = beq, l ≤ x ≤ u。 

基于问题求解非线性优化

通过使用基于问题的方法寻找具有非线性约束的非线性目标函数的最小值。要使用基于问题的方法找到非线性目标函数的最小值,首先将目标函数编写为文件或匿名函数。目标函数是

type objfunx


function f = objfunx(x,y)
f = exp(x).*(4*x.^2 + 2*y.^2 + 4*x.*y + 2*y - 1);
end

创建优化问题变量 x 和 y

x = optimvar('x');
y = optimvar('y');

使用优化变量的表达式创建目标函数。

obj = objfunx(x,y);

创建一个以 obj 为目标函数的优化问题。

prob = optimproblem('Objective',obj);

创建一个使解位于倾斜椭圆中的非线性约束,指定为

使用优化变量的不等式表达式创建约束。

TiltEllipse = x.*y/2 + (x+2).^2 + (y-2).^2/2 <= 2;

在问题中包含该约束。

prob.Constraints.constr = TiltEllipse;

创建一个结构体,将初始点表示为 x = –3y = 3

x0.x = -3;
x0.y = 3;

检查此问题。

show(prob)


  OptimizationProblem : 

	Solve for:
       x, y

	minimize :
       (exp(x) .* (((((4 .* x.^2) + (2 .* y.^2)) + ((4 .* x) .* y)) + (2 .* y)) - 1))


	subject to constr:
       ((((x .* y) ./ 2) + (x + 2).^2) + ((y - 2).^2 ./ 2)) <= 2
     

求解。

[sol,fval] = solve(prob,x0)

Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
    x: -5.2813
    y: 4.6815

fval = 0.3299

尝试不同起点。


x0.x = -1;
x0.y = 1;
[sol2,fval2] = solve(prob,x0)


Solving problem using fmincon.

Feasible point with lower objective function value found.


Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

sol2 = struct with fields:
    x: -0.8210
    y: 0.6696

fval2 = 0.7626

绘制椭圆、目标函数等高线和两个解。

f = @objfunx;
g = @(x,y) x.*y/2+(x+2).^2+(y-2).^2/2-2;
rnge = [-5.5 -0.25 -0.25 7];
fimplicit(g,'k-')
axis(rnge);
hold on
fcontour(f,rnge,'LevelList',logspace(-1,1))
plot(sol.x,sol.y,'ro','LineWidth',2)
plot(sol2.x,sol2.y,'ko','LineWidth',2)
legend('Constraint','f Contours','Global Solution','Local Solution','Location','northeast');
hold off

Figure contains an axes object. The axes object contains 4 objects of type implicitfunctionline, functioncontour, line. One or more of the lines displays its values using only markers These objects represent Constraint, f Contours, Global Solution, Local Solution.

解位于非线性约束边界上。等高线图显示这些是仅有的局部最小值。该图还显示在 [–2,3/2] 附近存在一个平稳点,在 [–2,0] 和 [–1,4] 附近存在局部最大值。

Matlab求解函数

求解无约束极小值 

基于求解器求解

在matlab工具箱中,用于求解无约束极小值问题的函数有 fminunc 和 fminsearch (局部最优化算法):

fminunc(采用拟牛顿法(QN),是一种使用导数的算法)
[x, fval, exitflag, output, grad, hessian] = fminunc(fun, x0, options)

输入参数:

  • fun 为要计算最小值的函数;
  • x0 为初始点;
  • options 为优化选项。

输出参数:

  • x 为解,
  • fval 为解处的目标函数值;
  • exitflag 为fminunc 停止的原因,
  • output 为有关优化过程的信息,
  • grad 为解处的梯度,
  • hessian 为逼近 Hessian 矩阵。

最小化函数:

fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);

调用 fminunc 以在 [1,1] 附近处求 fun 的最小值。

x0 = [1,1];
[x,fval] = fminunc(fun,x0)

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.

x = 1×2

    2.2500   -4.7500

fval = -16.3750
fminsearch(采用Nelder-Mead单纯形法,是一种直接搜索法)
[x, fval, exitflag, output, grad, hessian] = fminunc(fun, x0, options)

输入参数:

  • fun 为要计算最小值的函数;
  • x0 为初始点;
  • options 为优化选项。

输出参数:

  • x 为解,
  • fval 为解处的目标函数值;
  • exitflag 为fminunc 停止的原因,
  • output 为有关优化过程的信息。

监视优化过程

options = optimset('PlotFcns',@optimplotfval);

将目标函数设置为 Rosenbrock 函数,

该函数的最小值在 x = [1,1] 处,最小值为 0

将起始点设置为 x0 = [-1.2,1] 并使用 fminsearch 计算 Rosenbrock 函数的最小值。

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0,options)

Figure Optimization Plot Function contains an axes object. The axes object with title Current Function Value: 8.17766e-10, xlabel Iteration, ylabel Function value contains a line object which displays its values using only markers.

x = 1×2

    1.0000    1.0000

检查优化过程

在优化进行期间和优化结束后检查优化结果。

将选项设置为提供迭代输出,从而在求解器运行时提供有关优化的信息。此外,将绘图函数设置为在求解器运行时显示目标函数值。

options = optimset('Display','iter','PlotFcns',@optimplotfval);

设置目标函数和起始点。

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

将 objectivefcn1 的代码作为文件包含在路径中。

x0 = [0.25,-0.25];
fun = @objectivefcn1;

获取所有求解器输出。在求解器运行完毕后,使用这些输出检查结果。

[x,fval,exitflag,output] = fminsearch(fun,x0,options)
 
 Iteration   Func-count         f(x)         Procedure
     0            1         -6.70447         
     1            3         -6.89837         initial simplex
     2            5         -7.34101         expand
     3            7         -7.91894         expand
     4            9         -9.07939         expand
     5           11         -10.5047         expand
     6           13         -12.4957         expand
     7           15         -12.6957         reflect
     8           17         -12.8052         contract outside
     9           19         -12.8052         contract inside
    10           21         -13.0189         expand
    11           23         -13.0189         contract inside
    12           25         -13.0374         reflect
    13           27          -13.122         reflect
    14           28          -13.122         reflect
    15           29          -13.122         reflect
    16           31          -13.122         contract outside
    17           33         -13.1279         contract inside
    18           35         -13.1279         contract inside
    19           37         -13.1296         contract inside
    20           39         -13.1301         contract inside
    21           41         -13.1305         reflect
    22           43         -13.1306         contract inside
    23           45         -13.1309         contract inside
    24           47         -13.1309         contract inside
    25           49          -13.131         reflect
    26           51          -13.131         contract inside
    27           53          -13.131         contract inside
    28           55          -13.131         contract inside
    29           57          -13.131         contract outside
    30           59          -13.131         contract inside
    31           61          -13.131         contract inside
    32           63          -13.131         contract inside
    33           65          -13.131         contract outside
    34           67          -13.131         contract inside
    35           69          -13.131         contract inside
 
Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 
 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04 
x =

   -0.1696   -0.5086


fval =

  -13.1310


exitflag =

     1


output = 

  struct with fields:

    iterations: 35
     funcCount: 69
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Optimization terminated:...'

exitflag 的值为 1,这意味着 fminsearch 很可能收敛于局部最小值。

output 结构体显示迭代数。迭代输出中和绘图中也显示此信息。output 结构体还显示函数求值的次数,迭代输出方式会显示该次数,但所选的绘图函数不显示该次数。

基于问题求解

(1)基于求解器求解

clc, clear
f=@(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1); 
g=@(x) -f(x);
[xy1,z1]=fminunc(f, rand(2,1))  %求极小值点
[xy2,z2]=fminsearch(g,rand(2,1)); %求极大值点
xy2, z2=-z2  %显示极大点及对应的极大值

(2)基于问题求解

clc, clear, prob1=optimproblem;  %最小值问题
x=optimvar('x','LowerBound',-3,'UpperBound',3);
y=optimvar('y','LowerBound',-4,'UpperBound',4);
prob1.Objective=x^3-y^3+3*x^2+3*y^2-9*x;
x0.x=1; x0.y=1;
[sol1,fval1,flag1,out1]=solve(prob1,x0)
prob2=optimproblem('ObjectiveSense','max')
prob2.Objective=x^3-y^3+3*x^2+3*y^2-9*x;
op=optimoptions(@fmincon,'Algorithm','active-set')
[sol2,fval2,flag2,out2]=solve(prob2,x0,'Options',op)

求得的极小值点为 (1,0),极小值为 -5;极大值点为 (-3,2),极大值为 31。

求解有约束极小值

基于求解器求解

非线性规划模型的一般形式为

b 和 beq 是向量,A 和 Aeq 是矩阵,c(x) 和 ceq(x) 是返回向量的函数,f(x) 是返回标量的函数。f(x)、c(x) 和 ceq(x) 可以是非线性函数。

x、lb 和 ub 可以作为向量或矩阵传递。

fmincon(寻找约束非线性多变量函数的最小值)
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

输入参数:

  • fun 为要计算最小值的函数
  • x0 为初始点,指定为实数向量或实数数组。求解器使用 x0 的大小以及其中的元素数量确定 fun 接受的变量数量和大小。
  • A 为线性不等式约束矩阵,A 表示约束中的线性系数;
  • b 为线性不等式约束向量,b 表示约束中的常向量;
  • Aeq 为线性等式约束矩阵,beq 为线性等式约束向量;
  • lb 为下界,ub 为上界;
  • nonlcon 为非线性约束;
  • options 为 intlinprog 的选项,
  • problem 为封装输入和选项的结构体,
  • lambda 为解处的拉格朗日乘数,
  • grad 为解处的梯度,
  • hessian 为逼近 Hessian 矩阵

输出参数:

  • x 为解
  • fval 为目标函数最优值;
  • exitflag 为算法停止条件,
  • output 为求解过程摘要。

 在非线性约束下求函数的最小值

在边界约束下求 Rosenbrock 函数在圆内最小的点。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

在区域 

$0 \le x(1) \le 0.5$

$0.2 \le x(2) \le 0.8$

 内寻找。

lb = [0,0.2];
ub = [0.5,0.8];

同时在以 [1/3,1/3] 为圆心、半径为 1/3 的圆内寻找。

function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];

没有线性约束,因此将这些参数设置为 []

A = [];
b = [];
Aeq = [];
beq = [];

选择一个满足所有约束的初始点。

x0 = [1/4,1/4];

求解。

nonlcon = @circlecon;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.


x =

    0.5000    0.2500
基于问题求解

(1)基于求解器求解

clc, clear
fun1 = @(x) sum(x.^2)+8;
[x,y]=fmincon(fun1,rand(3,1),[],[],[],[],zeros(3,1),[],@fun2)

function [c,ceq]=fun2(x)
c=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20];  %非线性不等式约束
ceq=[-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3]; %非线性等式约束
end

(2)基于问题求解

clc, clear, prob = optimproblem;
x = optimvar('x',3,'LowerBound',0);
prob.Objective = sum(x.^2)+8;
con1 = [-x(1)^2+x(2)-x(3)^2 <= 0
x(1)+x(2)^2+x(3)^3 <= 20];  %非线性不等式约束
con2 = [-x(1)-x(2)^2+2 == 0
         x(2)+2*x(3)^2 == 3]; %非线性等式约束
prob.Constraints.con1 = con1;
prob.Constraints.con2 = con2;
x0.x=rand(3,1);  %非线性规划必须赋初值
[sol,fval,flag,out]= solve(prob,x0), sol.x

求得当 x1 = 0.5522, x2 = 1.2033, x3 = 0.9478 时,最小值 y = 10.6511。

 

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

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

相关文章

玩转Mysql系列 - 第22篇:mysql索引原理详解

这是Mysql系列第22篇。 背景 使用mysql最多的就是查询&#xff0c;我们迫切的希望mysql能查询的更快一些&#xff0c;我们经常用到的查询有&#xff1a; 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录&#xff08;between and&#xff09; …

如何解决python安装Crypto失败的问题

文章目录 准备安装相关链接准备 Python Crypto模块是一个第三方库,它提供了常见的加密算法和协议,比如AES、RSA、DES等。 PyCrypto 是加密工具包 Crypto 的 python 版,该模块实现了各种算法和协议的加密,提供了各种加密方式对应的算法的实现,包括单向加密、对称加密及公钥…

Linux(ubuntu)系统更新后不能进入图形界面

最近需要跑一个深度学习的程序&#xff0c;把许久没用的ubuntu系统调了出来&#xff0c;手欠的我更新了一下系统&#xff0c;结果再启动&#xff0c;系统就只停留在光标闪动那里&#xff0c;不能看到图形界面了。网上查了一下&#xff0c;说是因为更新后&#xff0c;显卡驱动没…

MySQL 8.0数据库主从搭建和问题处理

错误处理&#xff1a; 在从库通过start slave启动主从复制时出现报错 Last_IO_Error: error connecting to master slaveuser10.115.30.212:3306 - retry-time: 60 retries: 1 message: Authentication plugin caching_sha2_password reported error: Authentication require…

【draw】draw.io怎么设置默认字体大小

默认情况下draw里面的字体大小是12pt&#xff0c;我们可以将字体改成我们想要的大小&#xff0c;例如18pt。 然后点击样式&#xff0c;设置为默认样式。 下一次当我们使用文字大小时就是18pt了。

html和css相关操作

html第一个网页 <!DOCTYPE html> <!--html文档声明&#xff0c;声明此文档是一个html5的文档--> <html> <!--html文档开头标签--><head><!--html文档的设置标签&#xff0c;文档的设置及资源的引用都写在这个标签中--><meta charset&q…

[论文笔记]Prefix Tuning

引言 今天带来微调LLM的第二篇论文笔记Prefix-Tuning。 作者提出了用于自然语言生成任务的prefix-tuning(前缀微调)的方法,固定语言模型的参数而优化一些连续的任务相关的向量,称为prefix。受到了语言模型提示词的启发,允许后续的token序列注意到这些prefix,当成虚拟toke…

1793_树莓派杂志第一期MagPi01阅读

全部学习汇总&#xff1a; GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. (github.com) 给自己的产品起一个好听的名称&#xff0c;我觉得这个是国外的企业中很好的一种文化。这里提到的苹果、黑莓等全都是一系列的水果。树莓派也有这样的风格&…

命令行程序测试自动化

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 这几天有一个小工具需要做测试&#xff0c;是一个命令行工具&#xff0c;这个命令行工具有点类似mdbg等命…

【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决

目录 一、实现登陆注册界面 1、前期准备 2、登录静态页实现 2.1、创建Vue组件 2.2、静态页面实现 2.3、配置路由 2.4、更改App.vue样式 2.5、效果 3、注册静态页实现 3.1、静态页面实现 3.2、配置路由 3.3、效果 二、axios 1、前期准备 1.1、准备项目 1.2、安装…

pytorch学习------数据集的使用方式

一、前言 在深度学习中&#xff0c;数据量通常是都非常多&#xff0c;非常大的&#xff0c;如此大量的数据&#xff0c;不可能一次性的在模型中进行向前的计算和反向传播&#xff0c;经常我们会对整个数据进行随机的打乱顺序&#xff0c;把数据处理成一个个的batch&#xff0c…

【力扣1464】数组中两元素的最大乘积

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、排序2、最值模拟 一、题目描述 题目链接&#xff1a;数组中两元素的最大乘积 给你一个整数数…

针对 SAP 的增强现实技术

增强现实技术是对现实世界的一种交互式模拟。这种功能受到各种企业和制造商的欢迎&#xff0c;因为它可以减少生产停机时间、快速发现问题并维护流程&#xff0c;从而提高运营效率。许多安卓应用都在探索增强现实技术。 使用增强现实技术&#xff08;AR&#xff09;的Liquid U…

【Vue入门】语法 —— 事件处理器、自定义组件、组件通信

目录 一、事件处理器 1.1 样式绑定 1.2 事件修饰符 1.3 按键修饰符 1.4 常用控制符 1.4.1 常用字符综合案例 1.4.2 修饰符 二、自定义组件 2.1 组件介绍及定义 2.2 组件通信 2.2.1 组件传参&#xff08;父 -> 子&#xff09; 2.2.1 组件传参&#xff08;子 ->…

【Leuanghing】ANSA入门——GUI界面介绍

【Leuanghing】ANSA入门——软件介绍 大家好&#xff01;今天为大家推荐一款软件 —— ANSA。ANSA是目前公认的全球最快捷的CAE前处理软件之一&#xff0c;也是一个功能强大的通用CAE前处理软件。 一、相关介绍 BETA CAE Systems S.A公司总部位地希腊的赛萨罗尼奇市(Thessalon…

水平基准和垂直基准

水平基准 针对不同的地理空间测量&#xff0c;水平基准可以是一个参考点或一个参考点集。在地球上&#xff0c;相同的位置上的点可能有不同的坐标&#xff0c;取决于使用了哪种基准。 水平基准用于测量地球上的位置&#xff08;position&#xff09;。因为地球不是一个完美的球…

linux————zabbix搭建

目录 一、zabbix的概述 二、构成 一、server 二、web页面 三、数据库 四、proxy 五、agent 三、zabbix监控对象 四、zabbix的常用术语 五、zabbix监控框架 一、zabbix——client架构 二、zabbix_proxy_client架构 六、zabbix部署 安装zabbix5.0存储库 ​编辑​编…

flume安装及实战

flume官方下载地址&#xff1a;Welcome to Apache Flume — Apache Flume 一、flume安装 &#xff08;1&#xff09;解压至安装目录 tar -zxf ./apache-flume-1.9.0-bin.tar.gz -C /opt/soft/ &#xff08;2&#xff09;配置文件flume-env.sh cd /opt/soft/flume190/conf …

Visual Studio 功能增强:CMake 目标视图

Visual Studio 中的 CMake 目标视图&#xff0c;允许你按 CMake 目标可视化 CMake 项目结构&#xff0c;并生成指定的目标库和可执行文件。 为了使此视图更易于使用&#xff0c;我们实施了一些新的改进&#xff0c;使导航 CMake 目标比以往任何时候都更容易。这包括改进了到 C…

网络安全——黑客(自学)

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01;&#xff01;&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队…