一、安装

1.下载后的文件压缩包解压后如下:
YALMIP-master

我下的 download.csdn.net/download/mushuiliu/14127974
2.将其剪切至matlab常用工具包的根目录途径,(我的matlabR2020a):C:\Program Files\Polyspace\R2020a\toolbox\YALMIP-master

3.在matlab软件中添加路径:–主页\设置路径

直接选择添加并包含子文件夹

直接粘贴安装的路径

C:\Program Files\Polyspace\R2020a\toolbox\YALMIP-master

 

4.点击保存!!!

ps:如果matlab安装位置不同记得选择好自己安装matlab的正确位置哟!

5.测试安装是否成功.

在matlab运行窗口输入‘yalmiptest’命令或者‘which sdpvar’

也可以采用官网所说的安装方式。但是也得注意解压的位置!

二、Yalmip使用

1. 创建决策变量:

  >> x = sdpvar(m, n [, option]):创建m*n的连续型决策变量矩阵,option是对矩阵的一些参数指定。

  相应的,如果要创建整型或二值型决策变量,matlab语句分别为:  

  >> x = intvar(m, n, [option])

  >> x = binvar(m, n, [option])

2. 添加约束:

  >> F = set(constraint [, tag]):创建一个以constraint指定的约束,可选参数tag可以给该约束指定一个字符串标记。重要的是constraint的表达也非常简单,例如如果有 x1 + x2 + x3 <= 3 的约束,直接写:

  >> x = sdpvar(3, 1);

  >> F = set(x(1) + x(2) + x(3) <= 3, 'cost bound1');

  如果要继续添加约束也非常简单,支持用+直接相连:

  >> F = F + set(constraint1 [, tag1]);

  >> F = F + set(constraint2 [, tag2]);……

  例如,如果继续限制 x 只能取[0, 1]之间的值,则:

  >> F = F + set(0 <= x <= 1, ‘upper and lower bound’);

  一句话就搞定了,是不是非常简单。!

3. 参数配置

  这个比较简单,语句如下:

  >> ops = sdpsettings(option1, value1, option2, value2, ……)

  例如语句

  >> ops = sdpsettings('solver', 'lpsolve', 'verbose', 2);

  'solver' 参数指定程序用lpsolve求解器(如果已经安装,否则会报错),如果不指定 ‘solver’ 参数,他会根据决策变量类型自动挑选已安装的、最适合的求解器;'verbose' 指定显示冗余度(冗余度越大,你就可以看到越详细的求解过程信息)。

4. 求解

  这个也只有一句话:

  >> result = solvesdp(F, f, ops) 求解一个数学规划(最小化)问题,该问题的目标函数由 f 指定,约束由 F 指定,ops指定求解参数,最后的结果存储在result结构体中。

还是以前面那个问题作为例子,如果用yalmip的话,只需要如下简单几句:

  >> x = sdpvar(3, 1);
  >> f = [4 2 1] * x;
  >> F = set(2*x(1) + x(2) <= 1);
  >> F = F + set(x(1) + 2 * x(3) <= 2);
  >> F = F + set(x(1) + x(2) + x(3) == 1);
  >> F = F + set(0 <= x(1) <= 1) + set(0 <= x(2) <= 1) + set(0 <= x(3) <= 2);
  >> ops = sdpsettings('solver', 'lpsolve', 'verbose', 2);
  >> result = solvesdp(F, -f, ops);

  如果你想用 cplex 求解器求解,只需要将以上的‘solver’参数的‘lpsolve’改成‘cplex’,其他任何地方都不需要做改动。

  除此以外,yalmip还支持几乎所有其他的求解算法,在matlab下输入yalmiptest命令可以得到所有支持的算法以及它们的安装状态。

 

三、求解器安装

1. Mosek

下载Mosek,安装(推荐默认),点击Matlab设置路径--添加并包含子文件夹

校园用户可下载license试用一年。

 

最后测试一下,在命令行输入

>> mosekdiag

Matlab version   : 9.8.0.1323502 (R2020a)
Architecture     : PCWIN64
mosekopt path    : C:\Program Files\Mosek\9.2\toolbox\R2015a\mosekopt.mexw64
MOSEK version    : 9.2.29
Test linear solve: Success
mosekopt works OK. You can use MOSEK in MATLAB.

2. SEDUMI和SDPT3

下载地址:

https://github.com/SQLP/SDPT3

https://github.com/SQLP/SeDuMi

 

四、补充笔记

关于Yalmip的严格不等式约束

注意到关于Yalmip的约束写法都是非严格的不等式约束,如果要严格不等式约束的话,官网提示可以增加边际。详见tutorial中的半定规划部分内容 https://yalmip.github.io/tutorial/semidefiniteprogramming/ 

set函数的处理

比较早期的YALMIP程序中会看到set函数,比如《机器人控制系统的设计与基本设计方法》书中4.5节的LMI程序,
 

L1=Q*A1'+A1*Q+V1'*B1'+B1*V1;
L2=Q*A2'+A2*Q+V2'*B2'+B2*V2;
L3=Q*A1'+A1*Q+Q*A2'+A2*Q+V2'*B1'+B1*V2+V1'*B2'+B2*V1;

F=set(L1<0)+set(L2<0)+set(L3<0)+set(Q>0);

需要进行修改后才能在现在的版本运行。

F = [Q>=0];
F = [F, L1<=0];
F = [F, L2<=0];
F = [F, L3<=0];

网上的例程

\begin{array}{c} z=\max \left(\frac{x_{1}+2 x_{2}}{2 x_{1}+x_{2}}\right) \\ \left\{\begin{array}{l} x_{1}+x_{2} \geq 2 \\ x_{2}-x_{1} \leq 1 \\ x_{1} \leq 1 \end{array}\right. \end{array}

% 清除工作区
clear;clc;close all;
% 创建决策变量
x = sdpvar(1,2);
% 添加约束条件
C = [
    x(1) + x(2)  >= 2
    x(2)-x(1) <=1
    x(1)<=1
    ];
% 配置
ops = sdpsettings('verbose',0,'solver','lpsolve');
% 目标函数
z = -(x(1)+2*x(2))/(2*x(1)+x(2)); % 注意这是求解最大值
% 求解
reuslt = optimize(C,z);
if reuslt.problem == 0 % problem =0 代表求解成功
    value(x)
    -value(z)   % 反转
else
    disp('求解出错');
end

 

 

更多参考

https://blog.csdn.net/yanerhao/article/details/44983153

https://yalmip.github.io/solver/sdpt3/

https://github.com/SQLP/SDPT3

https://blog.csdn.net/wudisunyanzi/article/details/12983831?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242

yalmip求解鲁棒优化:blog.csdn.net/wdl1992/article/details/105716806/

 

https://www.jianshu.com/p/e1c45b3d8d8a

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐