【发布时间】:2020-09-25 05:33:35
【问题描述】:
我正在使用 pythTB 研究石墨烯的紧密结合模型。我想在计算中加入自旋元素。 rashba 跳跃项的 hamiltonian 使 pauli 自旋矩阵向量与站点跳跃向量交叉。
最初我创建了一个矩阵列表并将其与向量相交,不幸的是,这并没有产生正确的结果(我认为在取向量叉积之后,再取矩阵的叉积)。
接下来,我声明了 3 个符号“s_x”、“s_y”和“s_z”,并使用它们代替了我的 pauli 自旋矩阵向量中的矩阵。服用叉积后,我收到了正确的结果。我遇到的问题是我无法将矩阵替换为我添加的变量符号。可以这样做吗?还是我需要手动取叉积?
这是我的一些代码:
from __future__ import print_function
from pythtb import * # import TB model class
from sympy import symbols
import numpy as np
import matplotlib.pyplot as plt
# create list of pauli spin matrices
sx = [[0., 1.],[1., 0.]]
sy = [[0., -1.j],[1.j, 0.]]
sz = [[1., 0.],[0., -1.]]
Id = [[1., 0.], [0., 1.]]
s_pauli = np.zeros((4, 2, 2), dtype=complex)
s_pauli = [Id, sx, sy, sz]
# create s_pauli without identity matrix
s_pau = np.zeros((3, 2, 2), dtype=complex)
s_pau = [ s_x, s_y, s_z]
ab00 = [ 0.5, 0.28867513, 0.]
sig_x_ab00 = np.cross( s_pau, ab00)
如果我打印sig_x_ab00[2](这是我目前唯一感兴趣的),那么我会得到:
0.288675134594813*s_x - 0.5*s_y
获得该信息后,我想通过执行以下命令将s_pauli[1] 替换为s_x 和s_pauli[2] 替换s_y:
sig_x_ab00_ = sig_x_ab00.subs(s_x, s_pauli[1])
我得到以下错误输出:
AttributeError: 'numpy.ndarray' object has no attribute 'subs'
我所做的一切都有效吗?还是有更好的方法来解决这个问题?
非常感谢任何输入! 谢谢!
【问题讨论】:
-
numpy不“知道”sympy。cross有效,因为np.array(s_pau)是一个对象 dtype 数组,简单的数学被委托给元素自己的数学方法。但是sig_x_ab00是一个对象数组,而不是一个 sympy 表达式。将 numpy 和 sympy 混合使用是一项成功或失败的任务。有时有效,有时无效。最好坚持使用其中一种,而不是混合使用。 -
在 Python 中,您不需要为变量定义类型。那些
np.zeros(...)行不会为您做任何事情。看s_pauli和s_pau;它们是什么?
标签: python numpy matrix sympy numpy-ndarray