四种最优化方法总结

本文总字数:1947,阅读预计需要:5分钟

最优化方法
当我们准备好了一个函数表达式之后,如何求解该函数的最优值就会成为一个巨大的挑战。以下是常用的四种优化方法。

无约束优化问题
所谓无约束优化问题,就是指对一个函数求最优值,最优值可以出现在函数上任意一点,而我们不去限定查找最优值的范围。

有约束优化问题
有约束优化问题就是指给自变量的取值范围做限制,缩小优化范围,经典的约束优化算法有:

  • 内点法(interior-point)
  • 有效集法(active-set)
  • SQP算法(sqp)
  • 信赖域反射法(trust-region-reflective)

约束,又分线性约束与非线性约束,所谓线性约束,就是指约束条件中的自变量都是1次幂的,非线性约束即有高次幂的自变量出现。

假设如下约束优化函数和约束:


首先把这个函数的图像在Matlab中给大家画出来:

复制代码
%%目标函数图像绘制
x1=-1:0.05:1;
x2=-1:0.05:1;
[x1,x2]=meshgrid(x1,x2);
y=-x1.*x2;
figure(1)
%使用mesh函数画图
mesh(x1,x2,y);
figure(2)
%使用surfl画图
% surfl(x1,x2,y);
% figure(3)
%使用surf函数画图
surf(x1,x2,y);
hold on;
%约束区域部分位置
[x1,x2]=meshgrid(-1:0.05:1);
z=1-x1.^2-x2.^2;
ind=(z>=0);
h=scatter(x1(ind),x2(ind),'r');
hold on;

%% 绘制圆柱 % 上半部分 R=1;%半径 h=-1;%圆柱高度 m=1000;%分割线的条数 [x1,y1,z1]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱 z1=h*z1;%高度放大h倍 mesh(x1,y1,z1)%重新绘图 % 下半部分 hold on R=1;%半径 h=1;%圆柱高度 m=1000;%分割线的条数 [x1,y1,z1]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱 z1=h*z1;%高度放大h倍 mesh(x1,y1,z1)%重新绘图
复制代码

从上面第三张图中可知红色圆圈位置处有最优值,对应的最优质的大约时-0.5,下面通过优化计算查看最优值结果。

使用Matlab实现一下四种优化算法:

复制代码
function [xsol, fval] = runfmincon
% 初始点
x0 = [-0.1 -0.1];
 
% 四种优化算法,大家选一种用,这里用的是内点法
% 'active-set', 'interior-point', 'sqp', or 'trust-region-reflective'.
% 在优化器中选择优化算法
options = optimset('Display', 'iter-detailed', 'Algorithm', 'interior-point', 'MaxIter', 8); % 优化器参数
% fmincon参数解释
% fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
% fun:要优化的函数
% x0:自变量的初始值
% A:非等式(<)线性约束的约束矩阵A
% b:非等式(<)线性约束的约束条件矩阵b
% Aeq:等式约束的线性约束的约束矩阵Aeq
% beq:等式线性约束的约束条件矩阵beq
% lb,ub:自变量的下限和上限
% nonlcon:非线性约束
[xsol, fval] = fmincon(@objfun, x0, [], [], [], [], [], [], @confun, options);
 
% 目标函数
 function f = objfun(x)
     f = - x(1) * x(2);
 end
 
% 非线性约束
 function [c, ceq] = confun(x)
     % Nonlinear inequality constraints
     c = [x(1)^2 + x(2)^2 - 1];
     % Nonlinear equality constraints
     ceq = [];
 end
end
复制代码

 

复制代码
%在Matlab命令行窗口输入
[xsol,fval] = runfmincon;
% xsol中是最优点  fval为最优点对应的最优值
% 迭代优化结果
[x1,x2]=[-0.7071,-0.7071]
f=-0.5
复制代码

 

posted @   北极星!  阅读(2138)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2020-12-27 知网上的硕士和博士论文怎么下载pdf格式
>>博客统计:随笔 -615  文章 -0  评论 -50 
点击右上角即可分享
微信分享提示