- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 CVXPY 包(使用 ECOS 求解器)解决 Python 中的优化问题。该问题涉及最小化受多个约束的线性变量。问题本身是拟凸的,所以我实现了二分算法来找到最优解。
问题在于,当二分越来越接近最优值时,求解器总是失败。这就像当解决方案接近最优时,求解器不知道该怎么做。我相信这个问题与容差问题有关,但我不确定要更改哪个容差变量。
我尝试在 Python 3.6 中编写这个问题。我也尝试过使用不同的求解器,但求解器在接近最优时总是失败。代码如下所示。请注意,“gamma”是我在这里最小化的变量。
import cvxpy as cp
import numpy as np
Ts = 500e-6;
w = np.logspace(-1, np.log10(np.pi/Ts), 400);
R = 0.1; L = 4e-2; a = R/L;
G = 0.0125/(np.exp(1j*w*Ts) - np.exp(-a*Ts))
bw = 200; zeta = 0.8;
wn = (2*np.pi*bw)/np.sqrt(1 - 2*np.power(zeta,2) + np.sqrt(2 - 4*np.power(zeta,2) + 4*np.power(zeta,4)))
Td = np.power(wn,2)/(-np.power(w,2) + 2*zeta*wn*1j*w + np.power(wn,2)); Wd = 1/(1-Td);
n = 5
rho_r = cp.Variable(n); rho_s = cp.Variable(n-1); rho_t = cp.Variable(n);
Ro = 0;
for i in range(n):
Ri = rho_r[i]*np.exp(-i*1j*w*Ts);
Ro = Ro + Ri;
So = 0
for i in range(n-1):
Si = rho_s[i]*np.exp(-(i+1)*1j*w*Ts);
So = So + Si;
So_no_int = 1+So
So = cp.multiply((1-np.exp(-1j*w*Ts)),(1+So));
To = 0;
for i in range(n):
Ti = rho_t[i]*np.exp(-i*1j*w*Ts);
To = To + Ti;
g_max = 2; g_min = 1e-8; g_tol = 1e-5; gamma = (g_max + g_min)/2;
mm = 0.5;
while g_max - g_min > g_tol:
PSI = So + cp.multiply(G,Ro)
F1 = cp.multiply(cp.inv_pos(gamma),cp.abs(cp.multiply(Wd,PSI - cp.multiply(G,To)))) - cp.real(PSI)
F2 = cp.abs(cp.multiply(mm,So)) - cp.real(PSI)
constraints = [F1 <= -1e-6, F2 <= -1e-6, cp.real(So_no_int) >= 5e-3]
prob = cp.Problem(cp.Minimize(0),constraints)
prob.solve(solver = cp.ECOS,feastol_inacc = 1e-7)
stat = prob.status
if stat == "optimal":
print("Feasible (gamma = ", gamma ,")")
gamma_opt = gamma;
rho_r_OPT = rho_r.value;
rho_s_OPT = rho_s.value;
rho_t_OPT = rho_t.value;
g_max = gamma;
gamma = np.average([gamma,g_min]);
GAIN = np.sum(rho_t_OPT)/np.sum(rho_r_OPT);
else:
print("Infeasible (gamma = ", gamma ,")")
g_min = gamma;
gamma = np.average([gamma,g_max]);
print("\nThe optimal solution gamma = %f" % gamma_opt)
这是输出。您可以看到解收敛到接近 1.059...但随后解算器遇到错误。
Infeasible (gamma = 1.000000005 )
Feasible (gamma = 1.5000000025 )
Feasible (gamma = 1.2500000037499999 )
Feasible (gamma = 1.125000004375 )
Feasible (gamma = 1.0625000046875 )
Infeasible (gamma = 1.0312500048437498 )
Infeasible (gamma = 1.0468750047656248 )
Infeasible (gamma = 1.0546875047265623 )
Infeasible (gamma = 1.0585937547070312 )
Feasible (gamma = 1.0605468796972657 )
Feasible (gamma = 1.0595703172021484 )
Infeasible (gamma = 1.0590820359545898 )
Traceback (most recent call last):
File "X:\Google Drive\...
Stuff\...\Python_Controller_optimization\main_no_LMIs.py", line 60, in <module>
prob.solve(solver = cp.ECOS,feastol_inacc = 1e-7)
File "C:\Users\...\AppData\Local\Programs\Python\Python37-32\lib\site-packages\cvxpy\problems\problem.py", line 289, in solve
return solve_func(self, *args, **kwargs)
File "C:\Users\...\AppData\Local\Programs\Python\Python37-32\lib\site-packages\cvxpy\problems\problem.py", line 574, in _solve
self.unpack_results(solution, full_chain, inverse_data)
File "C:\Users\...\AppData\Local\Programs\Python\Python37-32\lib\site-packages\cvxpy\problems\problem.py", line 717, in unpack_results
"Try another solver, or solve with verbose=True for more "
cvxpy.error.SolverError: Solver 'ECOS' failed. Try another solver, or solve with verbose=True for more information.
[Finished in 4.8s]
这是最后一次二分迭代的结果 verbose = True
:
ECOS 2.0.7 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web:
www.embotech.com/ECOS
It pcost dcost gap pres dres k/t mu step sigma IR | BT
0 +0.000e+00 -6.380e+02 +3e+03 1e-02 1e+01 1e+00 2e+00 --- --- 1 0 - | - -
1 +0.000e+00 -1.145e+02 +8e+02 4e-04 4e+00 1e+00 4e-01 0.8673 1e-01 1 1 1 | 0 0
2 +0.000e+00 -7.961e+01 +4e+02 3e-04 2e+00 6e-01 2e-01 0.7724 4e-01 2 1 2 | 0 0
3 +0.000e+00 -3.442e+01 +2e+02 1e-04 8e-01 2e-01 9e-02 0.6591 2e-01 2 1 2 | 0 0
4 +0.000e+00 -1.446e+01 +1e+02 6e-05 2e-01 5e-02 5e-02 0.7673 4e-01 2 2 2 | 0 0
5 +0.000e+00 -1.551e+00 +1e+01 6e-06 2e-02 4e-03 5e-03 0.8955 2e-02 2 1 1 | 0 0
6 +0.000e+00 -7.516e-01 +5e+00 3e-06 1e-02 1e-03 3e-03 0.7389 3e-01 2 2 2 | 0 0
7 +0.000e+00 -2.738e-01 +2e+00 1e-06 3e-03 5e-04 1e-03 0.7857 2e-01 3 3 3 | 0 0
8 +0.000e+00 -1.707e-01 +1e+00 7e-07 1e-03 3e-04 6e-04 0.7419 5e-01 3 3 3 | 0 0
9 +0.000e+00 -3.000e-02 +2e-01 1e-07 2e-04 4e-05 1e-04 0.8592 4e-02 2 3 3 | 0 0
10 +0.000e+00 -2.762e-02 +2e-01 1e-07 1e-04 4e-05 1e-04 0.1937 6e-01 3 3 4 | 0 0
11 +0.000e+00 -1.464e-02 +1e-01 6e-08 4e-05 2e-05 6e-05 0.6035 2e-01 3 4 4 | 0 0
12 +0.000e+00 -1.150e-02 +1e-01 5e-08 1e-05 2e-05 5e-05 0.5393 6e-01 3 4 4 | 0 0
13 +0.000e+00 -8.110e-03 +1e-01 3e-08 5e-06 1e-05 5e-05 0.4090 3e-01 4 5 5 | 0 0
14 +0.000e+00 -4.994e-03 +9e-02 2e-08 2e-06 8e-06 5e-05 0.5449 3e-01 5 6 6 | 0 0
15 +0.000e+00 -4.390e-03 +1e-01 2e-08 2e-06 8e-06 5e-05 0.2976 6e-01 5 6 6 | 0 0
16 +0.000e+00 -1.789e-03 +6e-02 8e-09 5e-07 4e-06 3e-05 0.6651 1e-01 4 5 5 | 0 0
17 +0.000e+00 -9.008e-04 +4e-02 5e-09 2e-07 2e-06 2e-05 0.5673 1e-01 5 6 6 | 0 0
18 +0.000e+00 -6.047e-05 +9e-03 3e-09 1e-08 4e-07 4e-06 0.9890 6e-02 5 5 6 | 0 0
19 +0.000e+00 -1.067e-05 +3e-03 3e-09 4e-09 3e-07 1e-06 0.9708 2e-01 5 6 6 | 0 0
20 +0.000e+00 -8.619e-07 +3e-04 3e-09 4e-09 3e-08 2e-07 0.9503 3e-02 6 6 6 | 0 0
21 +0.000e+00 -1.358e-07 +6e-05 3e-09 4e-09 6e-09 3e-08 0.8718 3e-02 6 5 6 | 0 0
22 +0.000e+00 -1.090e-07 +5e-05 3e-09 4e-09 7e-09 3e-08 0.4582 6e-01 5 5 5 | 0 0
23 +0.000e+00 -3.494e-08 +2e-05 3e-09 4e-09 4e-09 1e-08 0.8998 2e-01 7 5 5 | 0 0
24 +0.000e+00 -2.603e-08 +2e-05 3e-09 4e-09 3e-09 9e-09 0.5242 5e-01 7 5 5 | 0 0
25 +0.000e+00 -2.509e-08 +2e-05 3e-09 4e-09 3e-09 9e-09 0.1730 8e-01 7 5 5 | 0 0
26 +0.000e+00 -1.781e-08 +1e-05 3e-09 4e-09 3e-09 7e-09 0.4828 4e-01 5 5 5 | 0 0
27 +0.000e+00 -1.782e-08 +1e-05 3e-09 4e-09 3e-09 7e-09 0.0071 1e+00 6 5 5 | 0 0
28 +0.000e+00 -7.540e-09 +6e-06 3e-09 4e-09 2e-09 3e-09 0.9672 4e-01 5 5 6 | 0 0
29 +0.000e+00 -7.547e-09 +6e-06 3e-09 4e-09 2e-09 3e-09 0.0134 9e-01 5 5 5 | 0 0
30 +0.000e+00 -7.557e-09 +8e-06 1e-05 4e-09 2e-09 4e-09 0.1284 1e+00 0 4 6 | 0 0
Unreliable search direction detected, recovering best iterate (18) and stopping.
NUMERICAL PROBLEMS (reached feastol=1.1e-08, reltol=-nan(ind), abstol=8.9e-03).
Runtime: 0.182235 seconds.```
最佳答案
问题可能出在这里:
cp.multiply(cp.inv_pos(gamma),cp.abs(cp.multiply(Wd,PSI - cp.multiply(G,To)))) - cp.real(PSI)
cp.inv_pos(gamma)
是凸非负函数,cp.abs(...)
也是如此。
当参数非负时,标量积是拟凹的,就像这里的情况一样。但为了满足拟凹性,两个输入都必须是凹的。由于输入是凸的,因此曲率未知。因此,问题本身是非凸的。 (参见here。)
关于python - 使用 CVXPY 求解拟凸问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458573/
我有一个目标函数,它取决于外积的总和。如果我可以使用 Numpy 函数,我会这样写: A = np.ones(m, n) U = Variable(m, n) objective = np.trace
目的:我试图在 python 中使用 cvxpy 来最大化 dual_func,但是我得到下面的 SolverError,我相信它可能是 Variable 具有不同的维度,但似乎无法弄清楚这个问题。我
可能有某个地方漂浮的答案,但我找不到。 我想最小化具有变量 X >= 0 和一阶导数矩阵 D,因此 X 在列方向上是平滑的并且具有相对大的数据。 过去我使用过各种方法来解决这个问题(例如使用 scip
背景:我是 PyPortfolioOpt 的开发者,一个 python 投资组合优化库,我试图允许用户向最大夏普比率问题添加约束。 目前,用户可以将他们的约束作为 lambda 函数传递,例如使所有权
我正在使用以下代码: import sys, numpy as np import cvxpy as cvx if __name__ == '__main__': sims = np.rand
我正在尝试编写一个搜索时钟频率和除数的程序来生成目标频率。然而,一个限制是除数必须是偶数(由于硬件限制),我找不到一种方法来对此进行建模。 我没有得到模运算符支持 "TypeError: unsupp
我正在尝试在 CVXPY 中实现此 LP: 但我正在努力寻找一种有效的方法来实现这里的第一个约束。我发现有效的唯一方法是将每个总和作为其自己的约束添加,但随着问题的规模变大,其规模会迅速扩大。有没有更
我正在使用 CVXPY(1.0 版)。我不明白是什么导致了 ZERO 表达式和 NONNEGATIVE 表达式之间的差异,如以下代码所示: >>> import cvxpy as cv >>> a =
我试图在 Python 中使用 cvxpy 强制变量为整数(整数约束),但结果仍然是 float : from cvxpy import * Fi = Int() Or = Int() constr
我在 CVXPY modelling language 中定义了一个大问题.我想解决一系列这样的问题 - 仍然是相同的格式但具有不同的参数(常量)。 我发现在调用 problem.solve() 之后
我正在尝试在目标函数的 CVXPY 中进行逐元素乘法。这是否允许作为凸问题的一部分? X 是一个 n x 1 变量。V 是一个 n x n 常数。 我想执行与 np.multiply(X, V*X)
这个问题在这里已经有了答案: How to convert quadratic to linear program? (1 个回答) 关闭 7 年前。 我需要一个可以将两个非常数相乘的 LP。这是我
这是一个边界 super 用户问题。我一直在使用 pip install 从 Windows 10 上的 powershell 将软件包添加到我的 3.6.2 安装中。我正在努力安装 CVXPY。具体
我正在尝试使用 CVXPY 解决 Python 中的投资组合优化问题,但收到错误 sum_entries 未定义。我正在使用 Anaconda 2.7 和 Jupyter 笔记本。我已经使用 cond
我正在尝试使用 cvxpy 进行优化。 w=cvxpy.Variable((10,1)) cvxpy.kron(w,w) 这不起作用说第一个参数应该是常量, 然后我尝试使用 numpy numpy.k
我正在尝试使用 CVXPY 包(使用 ECOS 求解器)解决 Python 中的优化问题。该问题涉及最小化受多个约束的线性变量。问题本身是拟凸的,所以我实现了二分算法来找到最优解。 问题在于,当二分越
在解决 cvxpy 中的优化问题时,是否有一种很好的方法可以通过将优化变量替换为实际值来检查约束是否有效? 我有一个复杂的优化问题(100 多个约束),但我知道最优解应该是什么。但是,cvxpy 失败
假设我的约束条件是矩阵变量的第一列和第三列的乘积大于 1。我如何在 CVXPY 中实现?示例: w = Variable(4,3) 在 Matlab 中,我的约束是: w(:,1)'*w(:,3)>1
使用 CVXPY 时,我经常遇到“SolverError”。他们的doc只是说这是由数值问题引起的,但没有提供有关如何避免这些问题的更多信息。 下面的代码片段是一个例子,问题很简单,但是 'CVXOP
如何在 cvxpy 中反转变量矩阵? 我有一个问题变量矩阵,定义如下: import cvxpy as cp A = cp.Variable(2,2) 我想求解一个目标函数涉及该矩阵的逆的程序。我几乎
我是一名优秀的程序员,十分优秀!