我正在尝试解决一个简单的优化问题,我们希望将一个复数域的厄米矩阵作为变量(主题是量子力学)。
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
是实数。
如何解决这些问题?可能有一个简单的解决方案。最坏的情况下,我们可能需要拆分实部和虚部。
maximize(trace(convert(Array{Float64}, rho*My0)))
或者maximize(trace(real(rho*My0)))
这样的方法,但我会对其是否有效感到惊讶。 - undefinedabs(trace(rho*My0)))
呢?如果迹是实数,那就一样了。 - undefinedabs()
难道不意味着会得到最小值吗?在这种情况下,My0
和rho
都是半正定矩阵,因此它们的乘积的迹总是正的(https://math.stackexchange.com/questions/888677),所以在这种情况下这将起作用。但在这些条件下并不适用于任意两个矩阵。 - undefined