我正在尝试解决一个简单的优化问题,我们想要一个复值厄米特矩阵作为其变量(主题是量子力学)。
using Convex #load the optimization solvers
using SCS
# define pauli-y+ projector
# by construction a positive operator valued hermitian matrix
y_plus = [1,im]/sqrt(2)
My0 = y_plus*y_plus'
# define the variable; a 2x2 density matrix
rho = Variable(2, 2)
problem.constraints += [rho == rho'] # hermitian
problem.constraints += [trace(rho) == 1] # unit trace
problem.constraints += [rho in :SDP] # positive definite
# define the objective
problem = maximize(trace(rho*My0))
# solve
solve!(problem,SCSSolver(verbose=false))
problem.optval
问题是,Julia/JuMP/Convex.jl 在涉及
时都会给出错误maximize(trace(rho*My0))
由于
rho*My0
的轨迹原则上可能很复杂,但是考虑到 rho*My0
和 rho
的约束,我们应该确信 My0
是真实的。
如何处理这些问题?可能有一个简单的解决方案。最坏的情况我们可能必须将实部和虚部分开。
您可以将问题写成:
$$ 开始{对齐*} rg \min_{ oldsymbol{A}} \quad & \operatorname{Tr} \left( oldsymbol{A} oldsymbol{B} 右),;旧符号{B} \in \mathcal{S} \ ext{服从} \quad & egin{对齐} oldsymbol{A} & \in \mathcal{S}_{+} \ \operatorname{Tr} \left( oldsymbol{A} 右) & = 1 nd{对齐} nd{对齐*} $$
其中集合是对称正半定矩阵的集合。
这些问题是等效的,因为您可能总是使用上面问题中的 $ oldsymbol{B} = - oldsymbol{M}$ 。
投影步骤为3:
由于每组的投影是已知的,我们可以很容易地解决这个问题。
然而,由于要投影到的集合不是子空间,我们不能只是迭代地投影每个集合,我们必须使用求解器进行投影(请参阅凸集交集的正交投影)。
在我看来,有两个选择:
备注:这个答案的动机是一个独立于一般凸求解器的求解器,如
Convex.jl
和JuMP.jl
。