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是实实在在的给定的约束rho和My0。
如何处理这些问题?可能有一个简单的解决方案。最坏的情况是我们可能不得不将实部和虚部分开。
您可以将问题写为:
$$ \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:
由于每组的投影是已知的,我们可以很容易地解决这个问题。
然而,由于要投影到的集合不是子空间,我们不能只是迭代地投影每个集合,我们必须使用求解器进行投影(请参阅凸集交集的正交投影)。
在我看来,有 3 个选择:
我在 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.jl和JuMP.jl。