Julia 中部分跟踪的问题

问题描述 投票:0回答:1

我的问题取决于给定密度算子的约化密度矩阵的计算。为此,我使用了 Julia 包“QuantumInformation”中的函数“ptrace”。您可以轻松检查文档是否说它接收三个参数:要追踪的密度运算符、每个子系统的维度以及要追踪的子系统的索引。我成功地完成了涉及此功能的任务,但随后另一个类似任务出现了一些问题。

我尝试用一个玩具示例来看看会发生什么:我通过三个 2x2 任意选择的矩阵的张量积创建了一个 8x8 矩阵,并尝试设计它们中的每一个,以及子系统 AB、AC 和 BC,利用ptrace 函数。然而,我只正确获得了少数子系统,而不是全部。这个小例子为基于方法的新方法铺平了道路...但首先,让我向您展示我的意思:

    using LinearAlgebra     
    using QuantumInformation     
    ρ1 = [0.4 0.2; 0.2 0.6]; ρ2 = [0.5 0; 0 0.5]; ρ3 = [0.1 0; 0.3 0]     
    ρ_tot = kron(ρ1,ρ2,ρ3)     
    ρ_12 = ptrace(ρ_tot,[2,2,2],[3])     
    ρ_13 = ptrace(ρ_tot,[2,2,2],[2])     
    ρ_23 = ptrace(ρ_tot,[2,2,2],[1])     
    ρ_1 = ptrace(ρ_tot,[2,2,2],[2,3])
    ρ_2 = ptrace(ρ_tot,[2,2,2],[1,3])  
    ρ_3 = ptrace(ρ_tot,[2,2,2],[1,2])                                               
    kron(ρ1,ρ2)                             
    kron(ρ1,ρ3)                             
    kron(ρ2,ρ3)      

ρ_12、ρ_1 和 ρ_2 效果不佳,因为 ρ_1 != ρ1,ρ_12 != kron(ρ1,ρ2) 和 ρ_13 != kron(ρ1,ρ3),正如我打算展示的那样...... 因此,我尝试设计一个函数来自己实现相同的任务,但我没有成功:事实上,尽管我使用了一个 Python 到 Julia 转换器,将一个看似有效的 Python 函数翻译成 Julia 语法,以进行部分跟踪,我遇到错误,并且无法稍微修改代码以使其正常工作。这是我正在谈论的片段,为了清晰起见,我展示了它:

    using LinearAlgebra

    function partial_trace(rho::Matrix, dims::Vector{Int}, sys::Int=1)
    
         dims_ = dims
        
        reshaped_rho = reshape(rho, dims_..., dims_...)

       
        reshaped_rho = permutedims(reshaped_rho, [1:sys-1; sys+1:length(dims); sys; length(dims)+sys])

        traced_out_rho = tr(reshaped_rho, length(dims)+1, length(dims)+2)

        
        dims_untraced = dims_[setdiff(1:length(dims), sys)]
        rho_dim = prod(dims_untraced)
        return reshape(traced_out_rho, rho_dim, rho_dim)
    end
    rho_A = (rand(Float64, 4,4 ))
    ρ_A = rho_A/tr(rho_A)
    rho_B = (rand(Float64, 3, 3))
    ρ_B = rho_B/tr(rho_B)
    rho_C = (rand(Float64, 2, 2)) 
    ρ_C = rho_C/tr(rho_C)
    
    ρ_AB = kron(ρ_A,ρ_B)
    ρ_AC = kron(ρ_A,ρ_C)
    ρ_ABC= kron(ρ_AB,ρ_C) 

    
    ρ_AB_test = partial_trace(ρ_ABC, [4, 3, 2], 3)
    ρ_AC_test = partial_trace(ρ_ABC, [4, 3, 2], 2)
    ρ_A_test = partial_trace(ρ_AB_test, [4, 3], 2)
    ρ_B_test = partial_trace(ρ_AB_test, [4, 3], 1)
    ρ_C_test = partial_trace(ρ_AC_test, [4, 2], 1)

如何解决这个问题?如果不值得这样做,有没有人能够给我一个函数来在某处正确执行部分跟踪?

julia
1个回答
0
投票

我认为问题是你的 ρ3 不是正确的密度矩阵。正确的密度矩阵必须是迹等于 1 的 Hermitian 矩阵。

© www.soinside.com 2019 - 2024. All rights reserved.