Ejemplo n.º 1
0
def OptT(Mpo, HL, HR, T):  # 所有T
    Ns = len(T)
    Eng0 = np.zeros(Ns)
    Eng1 = np.zeros(Ns)

    for r in range(100):
        #print (r)

        for i in range(Ns - 1):
            T[i], Eng1[i] = OptTSite(Mpo, HL[i], HR[i], T[i], Method=1)
            # print i,Eng1[i]
            T[i], U = Sub.Mps_QR0P(T[i])
            HL[i + 1] = Sub.NCon(
                [HL[i], np.conj(T[i]), Mpo, T[i]],
                [[1, 3, 5], [1, 2, -1], [3, 4, -2, 2], [5, 4, -3]])
            T[i + 1] = np.tensordot(U, T[i + 1], (1, 0))

        for i in range(Ns - 1, 0, -1):
            T[i], Eng1[i] = OptTSite(Mpo, HL[i], HR[i], T[i], Method=1)
            # print i,Eng1[i]
            U, T[i] = Sub.Mps_LQ0P(T[i])
            HR[i - 1] = Sub.NCon(
                [HR[i], T[i], Mpo, np.conj(T[i])],
                [[1, 3, 5], [-1, 2, 1], [-2, 2, 3, 4], [-3, 4, 5]])
            T[i - 1] = np.tensordot(T[i - 1], U, (2, 0))

        #print (Eng1)
        if abs(Eng1[1] - Eng0[1]) < 1.0e-7:  # Eng1[1]是第一个非边界点
            break
        Eng0 = copy.copy(Eng1)  # Eng0 = Eng1会导致0随1一起改变

    print(Eng1 / float(Ns))

    return T, Eng1[0] / float(Ns)
Ejemplo n.º 2
0
def OptT(Mpo, HL, HR, T):
    Ns = len(T)
    Eng0 = np.zeros(Ns)
    Eng1 = np.zeros(Ns)

    File_Entopy = open('Entropy.txt', 'w')

    for r in range(100):
        Entropy = [None] * Ns
        for i in range(Ns - 1):
            T[i], T[i + 1], s, Eng1[i] = OptT_TwoSite(Mpo, HL[i], HR[i + 1],
                                                      T[i], T[i + 1])
            T[i], U = Sub.Mps_QR0P(T[i])
            HL[i + 1] = Sub.NCon(
                [HL[i], np.conj(T[i]), Mpo, T[i]],
                [[1, 3, 5], [1, 2, -1], [3, 4, -2, 2], [5, 4, -3]])
            T[i + 1] = Sub.NCon([U, np.diag(s), T[i + 1]],
                                [[-1, 1], [1, 2], [2, -2, -3]])
            Entropy[i] = Get_Entropy(s)
        File_Entopy.write(str(Entropy)[1:-1] + '\n')
        Entropy = [None] * Ns
        for i in range(Ns - 1, 0, -1):
            T[i - 1], T[i], s, Eng1[i] = OptT_TwoSite(Mpo, HL[i - 1], HR[i],
                                                      T[i - 1], T[i])
            U, T[i] = Sub.Mps_LQ0P(T[i])
            HR[i - 1] = Sub.NCon(
                [HR[i], T[i], Mpo, np.conj(T[i])],
                [[1, 3, 5], [-1, 2, 1], [-2, 2, 3, 4], [-3, 4, 5]])
            T[i - 1] = Sub.NCon([U, np.diag(s), T[i - 1]],
                                [[2, -3], [1, 2], [-1, -2, 1]])
            Entropy[i] = Get_Entropy(s)
        File_Entopy.write(str(Entropy)[1:-1] + '\n')

        if abs(Eng1[1] - Eng0[1]) < 1.0e-7:
            break
        Eng0 = copy.copy(Eng1)

    File_Entopy.close()
    print(Eng1 / float(Ns))

    return T, Eng1[0] / float(Ns)