在解算器失败时
太多的迭代或功能评估
解算器停止,因为它达到了限制的迭代次数或函数评估之前,最小化的目标要求公差。继续,试试以下的一个或多个。
1。使迭代显示 |
2。放宽公差 |
3所示。从不同的点开始解决 |
4所示。检查目标和约束函数定义 |
5。你的问题中心和规模 |
6。提供梯度或雅可比矩阵 |
7所示。提供黑森 |
1。使迭代显示
设置显示
选项“通路”
。这个设置显示了迭代求解的结果。
使迭代在MATLAB®命令行输入
选择= optimoptions ('solvername”、“显示”、“iter”);
解算器使用选项
结构。
迭代显示的一个例子,看到解释结果。
寻找在迭代显示
看看目标函数(
Fval
或f (x)
或Resnorm
)减少。减少显示进展。检查约束违反(
马克斯约束
),以确保它降低0
。减少显示进展。看看一阶最优性降低
0
。减少显示进展。看看
信赖域半径
降低到一个很小的值。这种减少表明客观可能不会一帆风顺。
要做什么
如果解决似乎进展:
集
MaxIterations
和/或MaxFunctionEvaluations
比默认值较大。你可以看到选项表中的默认值解算器的函数引用页面。从去年开始解决计算点。
如果解决不进步,尝试列出的其他建议。
2。放宽公差
如果StepTolerance
或OptimalityTolerance
例如,太小,解算器可能不承认当它达到一个最低;它可以使徒劳的迭代下去。
改变公差在命令行中,使用optimoptions
中描述的设置和改变优化选项。
的FiniteDifferenceStepSize
选择(或DiffMaxChange
和DiffMinChange
选项)会影响解算器的进展。这些选项控制步长有限差分微分估计。
3所示。从不同的点开始解决
看到改变初始点。
4所示。检查目标和约束函数定义
例如,检查你的目标和非线性约束函数返回正确的值在某个点。看到检查你的目标和约束函数。检查一个不可行点并不会导致一个错误在你的函数;看到迭代可以违反约束。
5。你的问题中心和规模
当每个协调解决运行更稳定,有相同的目标和约束函数。乘你的坐标方向适当标量均衡每个坐标的影响。适当的值添加到某些坐标平衡自己的大小。
例如:定心和可伸缩性。考虑最小化1 e6 * x (1) ^ 2 + 1 e-6 * x (2) ^ 2
:
f = @ (x) 10 ^ 6 * x (1) ^ 2 + 10 ^ 6 * x (2) ^ 2;
最小化f
使用fminunc
“拟牛顿”
算法:
选择= optimoptions (“fminunc”,“显示”,“没有”,“算法”,“拟牛顿”);x = fminunc (f[0.5, 0.5],选择)x 0.5000 = 0
结果是不正确的;可怜的扩展干扰获得一个好的解决方案。
问题的严重程度。集
D =诊断接头([1 e - 3, 1 e3]);fr = @ (y) f (D * y);y = fminunc (fr,[0.5, 0.5],选择)y = 0 0%正确的答案
类似地,可怜的定心可以干扰解决方案。
fc = @ (z) fr ([z z (1) 1 e6; (2) + 1 e6));%不定心z = fminunc (fc,。5。5),选择)z = 1.0 e + 005 * 10.0000 - -10.0000%看起来不错,但是……z - [1 e6 e6] %检查距离z是1 e6 ans = -0.0071 - 0.0078%显示距离fcc = @ (w) fc ([w (1) + 1 e6; w (2) 1 e6]);%集中w = fminunc (fcc,。5。5],选择)w = 0 0%正确的答案
6。提供梯度或雅可比矩阵
如果你不提供梯度或雅克比,解决估计梯度和雅克比有限的差异。因此,提供这些衍生品可以节省计算时间,可能导致增加准确性。具体问题具体分析的方法可以提供自动渐变;看到自动微分优化工具箱。
受限的问题,提供一个梯度还有另一个优势。解算器可以达到一个点x
这样x
是可行的,但有限的差异x
总是会导致一个不可行点。在这种情况下,解算器可以失败或过早地停止。提供一个梯度允许解算器。
提供梯度或雅克比的文件为你的目标函数和非线性约束函数。语法的详细信息,请参阅写作标量目标函数,写作目标函数向量和矩阵,非线性约束。
检查你的梯度或雅可比矩阵函数是正确的,使用CheckGradients
选项,如检查梯度或雅克比时的有效性。
如果你有一个符号数学工具箱™的许可证,您可以通过编程方式计算梯度和麻布。例如,看到的计算梯度和麻布使用符号数学工具箱。
对于使用梯度和雅克比示例,请参阅最小化梯度和黑森,非线性约束和梯度,计算梯度和麻布使用符号数学工具箱,解决非线性系统不包括雅可比矩阵,大型稀疏系统非线性方程的雅可比矩阵。自动分化的具体问题具体分析的方法,明白了自动微分运用优化的效果。
7所示。提供黑森
解决者往往更可靠和更少的迭代运行时提供一个麻绳。
下面的解决方案和算法接受麻布:
fmincon
内点
。写黑森作为一个单独的功能。例如,看到的与分析黑森fmincon内点算法。fmincon
trust-region-reflective
。给黑森作为第三个目标函数的输出。例如,看到的最小化茂密的结构化的麻绳,线性等式。fminunc
信赖域
。给黑森作为第三个目标函数的输出。例如,看到的最小化梯度和黑森。
如果你有一个符号数学工具箱的许可证,您可以通过编程方式计算梯度和麻布。例如,看到的计算梯度和麻布使用符号数学工具箱。提供一个黑森的具体问题具体分析的方法,明白了提供衍生品运用工作流。
聚集到一个不可行点
通常,你得到这个结果,因为解算器无法找到满足所有约束的ConstraintTolerance
宽容。然而,解算器可能位于或开始一个可行的时候,和聚合到一个不可行点。如果解决者失去了可行性,明白了解决了可行性。如果quadprog
返回这个结果,明白了quadprog收敛于一个不可行点
进行解算器没有发现可行点,尝试下列一个或多个。
1。检查线性约束 |
2。检查非线性约束 |
1。检查线性约束
试着找到一个满足的点范围和线性约束通过求解一个线性规划问题。
定义一个线性规划问题的目标函数总是零:
f = 0(大小(x0));%假定x0是初始点
解决线性规划问题是否有一个可行的观点:
xnew = linprog (f, A、b Aeq,说真的,磅,乌兰巴托);
如果有一个可行点
xnew
,使用xnew
作为初始点和重新运行原来的问题。如果没有可行的时候,你的问题是没有编制。检查你的定义范围和线性约束。在线性约束检查的详细信息,请参见研究线性不可行性。
2。检查非线性约束
后,确保你的范围和线性约束是可行的(包含一个点满足所有约束),检查你的非线性约束。
设定你的目标函数为零:
@ (x) 0
运行优化与所有约束和零的目标。如果你找到一个可行的点
xnew
,设置x0 = xnew
最初的问题并重新运行。如果你不能找到一个可行的点使用零目标函数,使用零目标函数与多个初始点。
如果你找到一个可行的点
xnew
,设置x0 = xnew
最初的问题并重新运行。如果你不能找到一个可行的时候,试着用
fmincon
与EnableFeasibilityMode
选项设置为真正的
和SubproblemAlgorithm
选项设置为“重心”
,如获得解决方案使用的可行性模式。试着多个初始点这些选项。如果你还没有找到一个可行点,试着放松限制,讨论下。
试着放松你的非线性不等式约束,然后收紧。
变化的非线性约束函数
c
返回c -
Δ,Δ是一个正数。这种变化使你的非线性约束条件容易满足。寻找一个可行的新的约束函数,使用您的原始目标函数或零目标函数。
如果你找到一个可行的点,
减少Δ
寻找一个可行的新的约束函数,从先前发现的点。
如果你不能找到一个可行的观点,尝试增加Δ再看。
如果你觉得不可行点,你的问题可能是真正的不可行,也就是说,不存在解决方案。再次检查你所有的约束定义。
解决了可行性
如果可行点解算器开始,但聚合到一个不可行点,尝试以下技术。
尝试不同的算法。的
fmincon
“sqp”
和“内点”
算法通常是最健壮的,所以先试着其中的一个或两个。收紧。给最高的
磅
和最低乌兰巴托
向量,可以。这可以帮助保持可行性的解决者。的fmincon
“sqp”
和“内点”
在每次迭代算法服从界限,所以严格界限帮助整个优化。
quadprog
收敛于一个不可行点
通常,你得到这消息,因为线性约束是不一致的,或几乎是单数。检查是否存在可行点,建立一个线性规划问题与相同的约束和目标函数为零向量f
。解决使用linprog
对偶单纯形的
算法:
选择= optimoptions (“linprog”,“算法”,对偶单纯形的);x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)
如果linprog
发现不可行点,那么你的问题确实是不可行的。
如果linprog
找到一个可行的点,然后尝试不同的quadprog
算法。另外,改变等公差StepTolerance
或ConstraintTolerance
再解决这个问题。
问题的
目标函数的解算器达到一个点还不到客观限制宽容。
fsolve无法解决的方程
fsolve
可以为各种原因未能解决一个方程。这里有一些建议如何进行:
试一试改变初始点。
fsolve
依赖于初始点。用不同的初始点,增加成功的机会。检查方程的定义,以确保它是光滑的。
fsolve
可能无法收敛与不连续梯度方程,如绝对值。fsolve
可以失败与不连续函数的收敛。检查方程是“广场”,含义相同尺寸的输入和输出(有相同数量的未知数的值方程)。
改变公差,特别是
OptimalityTolerance
和StepTolerance
。如果你试图得到高精度通过设置公差很小的值,fsolve
能不能收敛。如果你设置公差过高,fsolve
能不能解决一个方程准确。检查这个问题的定义。一些问题没有真正解决,如
x ^ 2 + 1 = 0
。如果您可以接受一个复杂的解决方案,尽量设置初始点复杂的价值。fsolve
不会尝试找到一个复杂的解决方案时,初始点是真实的。