CVX用户指南之求解器
支持的求解器
此版本的 CVX 支持四个求解器,每个求解器具有不同的功能:
求解器 | LP | QP | SOCP | SDP | GP | 整数 |
---|---|---|---|---|---|---|
SeDuMi | Y | Y | Y | Y | E | N |
SDPT3 | Y | Y | Y | Y | E | N |
Gurobi | Y | Y | Y | N | N | Y |
MOSEK | Y | Y | Y | Y | Y | Y |
GLPK | Y | N | N | N | N | Y |
(Y = 是,N = 否,E = 实验)
每个求解器具有不同的功能和不同的性能级别。例如,SeDuMi ,SDPT3 和MOSEK支持CVX本身支持的所有连续(非整数)模型,而Gurobi更受限制,因为它不支持半定约束;GLPK进一步受到限制。另一方面,Gurobi,GLPK和MOSEK支持整数约束,而SeDuMi和SDPT3不支持。
SeDuMi 和 SDPT3 包含在标准 CVX 发行版中,因此您无需下载额外的求解器即可开始使用 CVX。我们还与Gurobi和MOSEK的开发人员签订了合同安排,允许我们将其二进制文件与CVX一起发布,但使用这些求解器需要CVX 专业许可证。由于许可证差异,我们无法为CVX提供GLPK 。然而
如果您在使用一个求解器时遇到困难,请尝试另一个求解器。在 CVX 可以生成的每个模型上,没有一个求解器的性能比其他求解器更好,包括商业求解器。也就是说,如果您遇到一个求解器可以很好地处理而另一个求解器无法处理的问题,请向我们发送错误报告(请参阅支持),我们将结果转发给求解器的作者。
我们在本用户指南中创建了将Gurobi和MOSEK与CVX一起使用的特殊部分:
- Gurobi: Using Gurobi with CVX
- Mosek: Using MOSEK with CVX
对 GLPK 的支持应被视为实验性的。
选择求解器
当前默认求解器为 SDPT3。我们发现SeDuMi对于大多数问题来说都更快,但不幸的是不那么可靠。但是,没有一个求解器是完美的,您可能会发现对于您的应用程序另一个求解器更受欢迎。
要查看当前选择的求解器,只需键入
cvx_solver
要更改当前求解器,只需在cvx_solver后面加上您所选择的求解器的名称。例如,要选择 SeDuMi,请键入
cvx_solver sedumi
cvx_solver命令不区分大小写,因此cvx_solver SeDuMi也可以正常工作。
如果在模型内部发出此命令(即,在cvx_begin和cvx_end之间,它将仅更改该模型的求解器;下一个模型将使用之前的选项。如果您在模型外部发出cvx_solver命令,它将更改用于后续Matlab部分的求解器(或直到您再次更改它)。
如果要永久更改默认求解器(即,即使您退出并重新启动 Matlab,它仍保持默认值),请确保设置正确,然后发出命令
cvx_save_prefs
此命令不仅保存您的求解器选择,还保存cvx_expert、cvx_power_warning和cvx_precision设置。
控制屏幕输出
一旦您对使用CVX充满信心并开始将其合并到更大的算法和程序中,您可能希望将其传递到屏幕上的消息静音。为此,只需将 quiet 关键字添加到cvx_begin命令中即可;
cvx_begin quiet...
cvx_end
以前版本的 CVX 使用单独的cvx_quiet命令,如果您愿意,该命令在此版本中仍然可用。输入cvx_quiet true 会抑制求解器的屏幕输出,而输入cvx_quiet false 会恢复屏幕输出。如果在模型中输入这些命令(即,在cvx_begin和cvx_end之间),则只会影响该模型。如果在模型外部输入它,它将影响所有后续模型。输入不带参数的cvx_quiet将返回当前设置。
解释结果
输入完整的 CVX 规范并发出cvx_end命令后,将调用求解器以生成数值结果。它将模型中的变量替换为计算的数值,并创建包含目标函数值的变量cvx_optval。它还以名为 cvx_status 的字符串的形式总结了其工作的结果。cvx_status的可能值如下所示:
Solved
找到解。原变量和双变量被替换为它们的计算值,并且cvx_optval放置了问题的最优值(按照惯例,对于可行性问题为0)。
Unbounded
求解器确定问题无界。cvx_optval的值设为 -Inf 表示最小化,+Inf 表示最大化。(可行性问题永远不会产生无界状态。)任何双变量的值都替换为NaN,因为双问题实际上是不可行的。
Infeasible
通过发现一个无界方向,可以证明问题不可行。变量的值用 NaN 填充,cvx_optval的值设为 +Inf 表示最小化和可行性问题,-Inf 表示最大化。
Inaccurate/Solved, Inaccurate/Unbounded, Inaccurate/Infeasible
这三个状态值表示求解器无法在默认数值容差范围内确定。然而,它确定获得的结果满足"松弛"的误差范围,因此可能仍然适合进一步使用。如果发生这种情况,则应在进一步使用前先测试计算结果的有效性。有关求解器误差以及如何进行调整的更高级讨论,请参阅控制精度。
Suboptimal
此状态仅适用于混合整数问题。当分支算法发现至少一个可行的整数解,但无法继续搜索过程到全局最优时返回。如果由于时间限制或强制中断(例如,如果用户键入 Ctrl-C)而需要求解器终止,则会发生这种情况。
Failed
求解器未能在求解方面取得足够的进展,即使在"松弛"误差范围内也是如此。cvx_optval的值以及原变量和双变量都用 NaN 填充。由于SeDuMi的数值问题,可能会出现这种结果,通常是因为问题在某些方面特别"讨厌"(例如,非零对偶间隙)。
Overdetermined
预求解器已确定问题具有比变量更多的等式约束,这意味着等式约束的系数矩阵是奇异的。在实践中,这些问题往往是,但并非总是不可行的。不幸的是,求解器通常无法处理此类问题,因此无法得出精确的结论。最常产生超定结果的情况在超定问题中讨论。
控制精度
注意: 我们认为对求解器精度的修改是一项高级功能,应谨慎使用,并且只有在您习惯于在 CVX 中构建模型之后。
凸优化的数值方法并不准确;他们将结果计算到预先定义的数值精度或误差范围内。求解模型后,求解器已达到的误差水平将返回到cvx_slvtol变量中。不建议尝试在任何绝对意义上解释此误差水平。首先,每个求解器的计算方式不同。另一方面,它在很大程度上取决于 CVX 在将其交给求解器之前应用于模型的大量变换。因此,虽然您可能会发现它的值很有意思,但我们强烈建议您不要在您的应用中依赖它。
CVX 默认选择的 误差水平继承自正在使用的求解器,但稍作修改。CVX实际上考虑了三种不同的误差水平当求解模型时:
- 求解器误差 是求解器要求的水平。一旦达到此水平,求解器将立即停止,或者直到无法进一步取得进展。
- 标准误差 是 CVX 考虑以全精度求解模型的水平。
- 降低的误差是 CVX 认为模型"不精确"求解的水平,返回带有Inaccurate/ 前缀的状态。如果无法实现此误差,CVX 将返回"Failed"状态,并且变量的值不应被视为可靠。
(有关状态消息的详细信息,请参阅解释结果。)通常,但设置有一个有用的解释:它允许求解器搜索更准确的解,而不会在不能这样做的情况下导致Inaccurate/ 或 Failed的情况。默认值设置为其中是机器精度。对于大多数应用来说,这应该已经足够了。
如果要修改误差,可以使用cvx_precision命令进行修改。有三种方法可以调用此命令。调用时不带参数,它将当前误差水平打印到屏幕上;或者,如果作为函数调用,它将在 3 元行向量中返回这些值。
使用字符串参数调用cvx_precision允许您从一组预定义的精度模式中进行选择:
- cvx_precision low:
- cvx_precision medium:
- cvx_precision default:
- cvx_precision high:
- cvx_precision best:
在函数模式下,调用像cvx_precision('low')等。请注意,best精度设置会将求解器目标设置为零,这意味着只要求解器能够取得进展,求解器就会继续。它通常比default慢,但它同样可靠,有时会产生更准确的解。
最后,可以使用标量、长度为 2 的向量或长度为 3 的向量调用cvx_precision命令。如果为其传递标量,则会将求解器和标准误差设置为该值,并为您计算默认的降低的精度值。粗略地说,降低的精度将是标准精度的平方根,并施加一些界限以确保其保持合理。如果提供两个值,则求解器和标准误差将使用较小的值,较大的值将用于降低的误差。如果提供三个值,则将对其值进行排序,并分别设置每个误差。
cvx_precision命令可以在 CVX 模型内使用,也可以在 CVX 模型外使用。并且其行为在每种情况下都不同。如果您从模型中调用它,例如,
cvx_begincvx_precision high...
cvx_end
然后,您选择的设置将仅应用,直到达到cvx_end。如果您在模型外部调用它,例如,
cvx_precision high
cvx_begin...
cvx_end
然后,您选择的设置将全局应用;也就是说,对于任何后续创建和求解的模型。在以不同精度级别构建和求解多个模型的应用中,应首选局部方法。
如果在函数模式下使用字符串或数值调用 cvx_precision,它将返回上一个精度向量作为其输出 - 与在没有参数的情况下调用它时将获得的结果相同。乍一看这似乎令人困惑,但这样做是为了将以前的值保存在变量中,并在计算结束时将其还原;例如,
cvxp = cvx_precision( 'high' );
cvx_begin...
cvx_end
cvx_precision( cvxp );
在可以使用多个精度级别的多个CVX模型的较大应用中,这被认为是良好的编码礼仪。当然,如上所述,一种更简单但同样礼貌的方法是在CVX模型中调用cvx_precision,以便其效果仅对该模型持续。
高级求解器设置
警告:对于对所使用的求解器有深刻理解的用户,或者已从求解器的开发人员那里获得有关提高性能的具体建议的用户,这是一个高级主题。不正确地使用cvx_solver_settings命令可能会导致不可预知的结果。
可以通过多种方式调整求解器。求解器供应商尝试选择默认设置,从而这些设置将在广泛的问题中提供良好的性能。但是,没有求解器,也没有设置选择,对于每个可能的模型都会表现良好。有时,可能值得给出特定的特殊说明,以提高其针对特定应用的性能。遗憾的是,此类设置因求解器而异,因此 CVX 无法以可验证、可靠的全局方式提供此功能。
但是,使用新的cvx_solver_settings命令,您可以在特定模型需要时自定义求解器的设置。我们再怎么强调也不过分,这是一个专家功能,只能由有经验的建模人员使用。事实上,如果您是专家,您就会明白这些警告是必不可少的:
- CVX 不会检查您提供的设置的正确性。如果求解器拒绝这些设置,CVX 将失败,直到您更改或删除这些设置。
- 不能保证更改设置会提高性能;实际上,它可能会使性能变差。
- CVX Research没有提供有关每个求解器可用特定设置的文档;为此,您必须查阅求解器自己的文档。
- 此处的设置将覆盖 CVX 可能为每个求解器选择的默认值。因此,在某些情况下,使用此功能实际上可能会使 CVX 混淆并导致其错误解释结果。因此,我们无法支持自定义设置的所有可能组合。
- 除非您完全关闭了求解器输出,否则 CVX 将在每次求解模型时警告您是否自定义设置有效。
有了这个警告,让我们介绍一下cvx_solver_settings:
cvx_solver_settings
提供活动求解器提供的自定义设置的列表。自定义设置特定于每个求解器。
cvx_solver_settings -all
将提供为所有求解器提供的自定义设置的完整列表。
要为当前求解器创建新的自定义设置,请使用以下语法:
cvx_solver_settings( '{name}', {value} )
{name} 必须是有效的 MATLAB 变量/字段名称。{value} 可以是任何有效的 Matlab 对象;CVX不会以检查其值。
要清除活动求解器的所有自定义设置,请键入
cvx_solver_settings -clear
要仅清除单个设置,请键入
cvx_solver_settings -clear {<name>}
要清除所有求解器的所有设置,请键入
cvx_solver_settings -clearall
cvx_solver_settings 命令创建的设置与cvx_solver、cvx_precision等具有相同的作用域。例如,如果在模型中(在cvx_begin和cvx_end之间)使用此命令,则更改将仅应用于该特定模型。如果在特定模型外部发出命令,则更改将持续到 MATLAB 会话结束(或直到您再次更改它)。最后,如果您使用cvx_save_prefs命令,则在下次启动 Matlab 时,将保存并还原您添加的任何自定义设置。
CVX用户指南之求解器相关推荐
- 利用CVX和gurobi这个求解器复现一篇混合整数线性规划问题时遇到的问题
利用CVX和gurobi这个求解器复现一篇混合整数线性规划问题时遇到的问题 1.当出现从cvx 转换为double 时出现错误: ![](https://img-blog.csdnimg.cn/202 ...
- CVX用户指南之基础
cvx_begin和cvx_end 所有 CVX 模型前面必须有命令cvx_begin,并以命令cvx_end终止.所有变量声明.目标函数和约束都应介于两者之间.cvx_begin命令可能还包括一个以 ...
- CVX用户指南之简介
什么是 CVX? CVX 是一个建模系统,用于构建和求解规范凸程序 (DCP).CVX 支持多种标准问题类型,包括线性和二次型程序(LP/QPs).二阶锥形程序 (SOCP) 和半 ...
- CVX用户指南之快速入门
安装 CVX(请参阅安装)后,可以通过在 Matlab 脚本或函数中输入 CVX 规范,或直接从命令提示符开始使用它.为了将 CVX 规范与周围的 Matlab 代码区分开来,在它们前面加上语句 cv ...
- CVX用户指南之DCP规则集
CVX 强制执行规范凸编程规则集(简称 DCP 规则集)规定的约定.CVX 每当遇到违反任何规则的行为时,都会发出一条错误消息,因此在开始构建模型之前了解这些规则非常重要.这些规则来自凸分析的基本原理 ...
- CVX用户指南之半定编程模式
熟悉半定编程 (SDP) 的人都知道,在上面关于集合成员的讨论中,使用集合semidefinite(n)的约束在实践中通常使用线性矩阵不等式(LMI)表示.例如,给定.约束表示;也就是说,即X为正半定 ...
- CVX介绍——求解器
这个版本的CVX支持四个解算器,每个解算器都有不同的功能: 每个求解器都有不同的功能和不同的性能级别. 例如,SeDuMi [Stu99],SDPT3 [TTT03]和MOSEK 7支持CVX本身支持 ...
- mplab x ide 中文使用手册_中文文档:MPLAB ICD 4在线调试器用户指南
MPLAB® ICD 4在线调试器 用户指南 MPLAB® ICD 4在线调试器(DV164045)是Microchip最快且最经济高效的调试和编程工具,适用于Microchip PIC®.dsPIC ...
- CVX 工具箱(安装及用户指南)
目录 Introducition 下载地址 User Guide 安装CVX步骤 Quick Start 一个实例 CVX工具箱学习教程 Introducition CVX是一个基于matlab的凸优 ...
- MPLAB® ICD 2/3/4在线调试器用户指南 中文文档
1,微芯官网 手册下载 http://www.microchip.com.cn/newcommunity/index.php?m=Download&a=index&id=24& ...
最新文章
- TitanDB 中使用Compaction Filter ,产生了预期之外几十倍的读I/O
- mysql57 修改root密码,MySQL 5.7.x修改root默认密码(CentOS下)
- 【Vegas原创】更改域用户的IE默认首页
- golang 定义一个空切片_Golang简单入门教程——函数进阶使用
- 再见2G网络!中国联通开始全面退网
- 开源网格划分软件_网格划分:PointWise 18.3R1
- 古希腊的五大数学巨匠
- 面试官的几句话,差点让我挂在HTTPS上
- 装箱拆箱的意义 java_Java中的装箱和拆箱深入理解
- 计算机软件怎么装,电脑拷贝的软件怎么安装
- 平衡二叉树(C++实现)
- python饼图 立体_【Python基础】惊叹,Pyecharts绘制饼图原来可以如此漂亮!
- 关于尾注的一些问题-上
- 戴尔服务器r720矩阵卡无响应,戴尔r720阵列卡驱动
- 崩坏3服务器维护2月8号,崩坏3V3.4版本8月29日版本更新维护通知
- 这四款Windows上的高质量软件,装机必备,使用起来极度舒适
- Project *** is already imported into workspace 处理
- 利用个人U盘制作简易加密狗
- ShowType=0,● 交换机命令show interfaces type 0/port_# switchport|trunk用于显示中继连接的配置情况,下面 - 赏学吧...
- 电脑蓝屏终止代码及其解决方法