- 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/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!