Julia - 复值变量的优化

Wil*_*man 5 mathematical-optimization convex-optimization julia

我正在尝试解决一个简单的优化问题,我们想要一个复数值的 Hermitan 矩阵,因为它是可变的(主题是量子力学)

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
Run Code Online (Sandbox Code Playgroud)

问题是,Julia/JuMP/Convex.jl 都会报错

maximize(trace(rho*My0))
Run Code Online (Sandbox Code Playgroud)

由于跟踪rho*My0可在princple是复杂的,但我们应和放心,rho*My0是实实在在的给定的约束rhoMy0

如何处理这些问题?可能有一个简单的解决方案。最坏的情况是我们可能不得不将实部和虚部分开。

Roy*_*oyi 0

您可以将问题写为:

$$ \begin{align*} \arg \min_{\boldsymbol{A}} \quad & \operatorname{Tr} \left( \boldsymbol{A} \boldsymbol{B} \right), ; \boldsymbol{B} \in \mathcal{S} \ \text{服从} \quad & \begin{aligned} \boldsymbol{A} & \in \mathcal{S}_{+} \ \operatorname{Tr} \left( \boldsymbol{A} \right ) & = 1 \end{对齐} \end{对齐*} $$

在此输入图像描述

其中该集合是对称正半定矩阵的集合。

这些问题是等效的,因为您可能总是使用上面问题中的 $\boldsymbol{B} = -\boldsymbol{M}$ 。

投影步骤为3:

  1. 对称矩阵集的投影。
  2. 投影到PSD 矩阵集
  3. 使用单位迹投影到矩阵

由于每组的投影是已知的,我们可以很容易地解决这个问题。
然而,由于要投影到的集合不是子空间,我们不能只是迭代地投影每个集合,我们必须使用求解器进行投影(请参阅凸集交集的正交投影)。

在我看来,有 3 个选择:

  1. 投影梯度下降目标函数的梯度步骤,然后通过凸集交集的正交投影中
    的方法求解投影。
  2. 3 术语 ADMM
    将 SPSD 的投影合并为一个函数。然后你有 3 项 ADMM(其中的预测需要内部迭代)。您可以使用PD3O或仅使用经典的 3 运算符 ADMM(请参阅三运算符拆分方案及其优化应用程序)。具体来说,对于这种情况,凸二次半定规划和扩展的三块 ADMM 的三算子分裂视角
  3. 4 术语 ADMM
    我还没有找到一篇论文来说明这种情况下收敛的保证。但值得一试。

我在 Julia 中针对这个问题实现了投影梯度下降 (1) 和 PD3O:

在此输入图像描述

参考是解决方案Convex.jl. 在@WillemHekman
的情况下,矩阵 $ \boldsymbol{B} $ 是 PSD 矩阵。因此,迹 $ \opertaorname{Tr}\left( \boldsymbol{A} \boldsymbol{B} \right) $ 保证为非负(参见2 PSD 矩阵的矩阵乘法的非负)。 这意味着我可以最小化目标函数的 ,而不仅仅是实际值。这意味着它将适用于复杂的矩阵。
abs()

这些实现不依赖于此,并且可以解决任意矩阵 $ \boldsymbol{B} $ 只要它是正方形的问题。

Julia 代码可在我的StackOverflow Q35813091 GitHub 存储库中找到(查看StackOverflow\Q35813091文件夹)。

备注:这个答案的动机是一个独立于一般凸求解器的求解器,如Convex.jlJuMP.jl