ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Matlab优化工具箱和模拟退火算法

2020-01-31 10:43:14  阅读:811  来源: 互联网

标签:lb 函数 fval 最小值 模拟退火 Matlab x2 工具箱 x1


Matlab优化工具箱主要有以下4种求解器:

1.最小值优化

2.多目标最小值优化

3.方程求解器

4.最小二乘(曲线拟合)求解器

 

一.最小值优化:

1.标量最小值优化:使用函数fminbnd

例:对边长为3m的正方形铁板,在4个角处剪去相等的正方形,以制成方形无盖水槽,问如何剪才能使水槽的容积最大?

方程:V=(3-2x)^2x

function f = myfun1(x)
f = -(3-2*x).^2 * x; % 由于fminbnd只能用来计算最小值,所以这里加负号

x = fminbnd(@myfun1,0,1.5)
% x = fminbnd(fun,x1,x2):返回标量函数fun在条件x1 < x < x2下取最小值时自变量x的值
y= -myfun1(x)    % 调用myfun1函数来计算水槽的最大容积

2.无约束最小值优化:使用函数fminunc和fminsearch

例:求函数f(x)=3x1^2+2x1x2+x2^2最小值

function f = myfun2(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;    %  目标函数

x0 = [1,1];   % 初始值,可以是标量,向量,矩阵,即从这个值开始找,不熟悉的话可以多试几次,取最优的
[x,fval] = fminunc(@myfun2,x0) % x为自变量,fval为函数值

例:求banana方程的最小值(banana方程:f(x)=100(x2-x1^2)^2+(a-x1)^2,在指定a的情况下求这个方程的最小值)

a=3;
banana = @(x)100*(x(2)-x(1)^2)^2+(a-x(1))^2; % 快速获得函数句柄
options = optimset('Display','iter','PlotFcns',@optimplotfval); % 设置一些参数,将Display参数设置为'iter',利用optimplotfval来进行画图,'PlotFcns'是画图参数
[x,fval,exitflag,output] = fminsearch(banana, [-1.2, 1], options) % exitflag退出标志,程序运行结束的信息,output是一些输出信息
% 也可以这样(不加TolX的话)
% [x,fval,exitflag,output] = fminsearch(banana, [-1.2, 1], ...
   optimset('TolX',1e-8,'Display','iter','PlotFcns',@optimplotfval))      
%  optimset('TolX',1e-8)用来设置算法终止误差,即设置精度,到这个精度就可以停了

3.线性规划:使用linprog函数

例:求如下函数的最小值

f = [-5; -4; -6];         %  用矩阵表示目标函数
A = [1  -1  1
      3   2  4
      3   2  0];           %  用矩阵形式表示约束条件系数,注意换行也表示;
b = [20; 42; 30];      %  约束条件
lb = zeros(3,1);       %  下界约束
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)
% "[] []"表示的是等式约束,这里没有等式,所以用空矩阵,lb后面还可以加上界约束,但没有,所以可以省略
% Lambda保存的一些约束信息,Lambda域中向量里的非零元素可以反映出求解过程中的主动约束。在本例的结果中可以看出,第2个和第3个不等式约束(lambda.ineqlin)和第1个下界约束(lambda.lower)是主动约束

二次规划:使用quadprog函数

例:求下面函数的最小值

首先将方程写成矩阵形式

(x的指数为2)

H = [1 -1; -1 2];
f = [-2; -6];
A = [1 1; -1 2; 2 1];      %  线性不等式约束
b = [2; 2; 3];               %  线性不等式约束
lb = zeros(2,1);
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb)

4.有约束最小值优化:使用函数fmincon

例:求函数f(x)=-x1x2x3的最小值,搜索的起始值为x=[10;10;10],同时目标函数中的变量要服从以下约束条件:

function f = myfun3(x)
f = -x(1) * x(2) * x(3);

约束条件改为

x0 = [10; 10; 10];    % 求解的起始点
A=[-1 -2 -2;1 2 2];
b=[0;72];
[x,fval] = fmincon(@myfun3,x0,A,b)

5.另外两种极小值优化问题:
半无限问题:fseminf
0-1规划:bintprog
请查阅帮助文档或者其他参考书

二.多目标优化:使用fgoalattain和fminimax函数

例:某工厂因生产需要欲采购一种原材料,市场上这种原材料有两个等级,甲级单价2元/千克,乙级单价1元/千克。要求所花总费用不超过200元,购得原材料总量不少于100千克,其中甲级原材料不少于50千克,问如何确定最好的采购方案。
设x1、x2分别为采购甲级和乙级原材料的数量(千克),要求总采购费用尽量少,总采购重量尽量多,采购甲级原材料尽量多

function f=myfun4(x)
f(1)=2*x(1)+ x(2); % 总花费
f(2)=-x(1)- x(2); % 总重量
f(3)=-x(1); % 甲级材料重量
%注意和下面的一一对应关系

goal=[200 -100 -50];        %  要达到的目标
weight=[2040 -100 -50];       %  各个目标的权重,自己根据经验定
x0=[55 55];                    %  搜索的初始值
%  约束条件
A=[2 1;-1 -1;-1 0];
b=[200 -100 -50]; % 它们的正负需要把方程转化为标准形式才能确定,必须是小于
lb=zeros(2,1);
%  调用fgoalattain函数进行多目标优化
[x,fval,attainfactor,exitflag] =...
fgoalattain(@myfun4,x0,goal,weight,A,b,[],[],lb,[])

fminimax函数用法查阅文档

三.方程组求解:

优化工具箱提供了3个方程求解的函数,其中,“\”算子可用于求解线性方程组Cx=d。当矩阵为n阶方阵时,采用高斯消元法进行求解;如果A不为方阵,则采用数值方法计算方程最小二乘意义上的解。fzero采用数值解法求解非线性方程,fsolve函数则采用非线性最小二乘算法求解非线性方程组

例:求解下面方程组的根,其中包含两个未知数、两个方程

方程组变换

function F = myfun5(x)
F = [2*x(1) - x(2) - exp(-x(1));
      -x(1) + 2*x(2) - exp(-x(2))];

x0 = [-5; -5];                              % 猜测的搜索初始值
options=optimset('Display','iter');       % 输出显示选项设置
[x,fval] = fsolve(@myfun5,x0,options)      % 调用fsolve命令

fzero和“\”自行查阅文档

四.最小二乘及数据拟合:常用函数有\、lsqnonneg、lsqlin、lsqnonlin、lsqcurvefit等

例(伪):

求超定系统(未知数小于方程数)C·x = d的最小二乘解,约束条件为A·x≤b,lb≤x≤ub(具体的系数矩阵、边界条件如下所示)
首先输入系数矩阵和上下边界

C = [0.9501    0.7620    0.6153    0.4057
    0.2311    0.4564    0.7919    0.9354
    0.6068    0.0185    0.9218    0.9169
    0.4859    0.8214    0.7382    0.4102
    0.8912    0.4447    0.1762    0.8936];
d = [0.0578
    0.3528
    0.8131
    0.0098
    0.1388];
A =[0.2027    0.2721    0.7467    0.4659
    0.1987    0.1988    0.4450    0.4186
    0.6037    0.0152    0.9318    0.8462];
b =[0.5251
    0.2026
    0.6721];
lb = -0.1*ones(4,1);
ub = 2*ones(4,1);

[x,resnorm,residual,exitflag,output,lambda] = ...
    lsqlin(C,d,A,b,[],[],lb,ub);
% resnorm=norm(C*x-d)^2,即2-范数
% residual=C*x-d,即残差
x,lambda.ineqlin,lambda.lower,lambda.upper   %  查看计算的结果

其它函数请自行查阅文档

模拟退火:

dejong5fcn    % 优化测试函数
fun = @dejong5fcn;    % 目标函数
[x,fval] = simulannealbnd(fun,[0 0])    % 目标函数、初始点

% 如果有绘图
options = saoptimset('PlotFcns',{@saplotbestx,@saplotbestf,@saplotx,@saplotf});
%第一个绘图函数是最优的函数值对应的x点,第二个是最优的函数值,第三个是当前的x,第四个是当前的函数值
% 如果有上下限约束
x0 = [0,0];
lb = [-64,-64];
ub = [64,64];
x = simulannealbnd(fun,x0,lb,ub,options)

例:

求min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2
写成函数形式
 

function y = simple_objective(x)
   y = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-4 + 4*x(2)^2)*x(2)^2;

ObjectiveFunction = @simple_objective;
X0 = [0.5 0.5];   % 初始点
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,X0)

% 如果有上下限约束
lb = [-64 -64];
ub = [64 64];
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,X0,lb,ub);

例:

求min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2

写成函数形式

function y = parameterized_objective(x,a,b,c)
   y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-c + c*x(2)^2)*x(2)^2;

a = 4; b = 2.1; c = 4;    % define constant values
ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);
X0 = [0.5 0.5];
[x,fval] = simulannealbnd(ObjectiveFunction,X0)

 

qq_38234381 发布了98 篇原创文章 · 获赞 15 · 访问量 1万+ 私信 关注

标签:lb,函数,fval,最小值,模拟退火,Matlab,x2,工具箱,x1
来源: https://blog.csdn.net/qq_38234381/article/details/104116537

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有