---
# System prepended metadata

title: 利用 Python 展示 Tight-Binding 模型(1D 與 2D band structure)

---

# 利用 Python 展示 Tight-Binding 模型(1D 與 2D band structure)

1D band structure
---
### 自由粒子能量公式的物理意義

公式如下：

$$
E(k) = \frac{1}{2}k^2
$$

這是自由粒子（free particle)在量子力學中的能量與波向量（$k$）的關係式。在物理上，這個公式可以從以下幾個角度來理解：

### 1. 它從哪裡來?(公式推導)

原本的動能公式是：

$$
E = \frac{p^2}{2m}
$$

而在量子力學裡，動量 $p$ 跟波向量 $k$ 的關係是：

$$
p = \hbar k
$$

把這個代進去，就變成：

$$
E(k) = \frac{\hbar^2 k^2}{2m}
$$

如果用**自然單位**或**簡化單位制**（讓 $\hbar = 1$, $m = 1$），就變成你看到的這個：

$$
E(k) = \frac{1}{2}k^2
$$




### 2. 它代表什麼？

這個公式說明的是：
> 粒子的**能量大小與它的波向量平方成正比**。

- $k$ 越大，代表粒子「震動得越快」、「波長越短」→ 動量越大
- 所以 $E(k)$ 就越高，對應到比較「快的粒子」



### 3. 在能帶圖裡的意義

在固態物理的能帶結構圖中，這個公式畫出來是個**拋物線**。當我們在晶格中考慮電子的行為時，這就是最簡單的近似模型，用來模擬電子在不受外力情況下的能量分布。


### 4. 另外補充 $k$ 是什麼？
它描述一個波（像電子波、光波、聲波）在空間中的震動頻率和方向。

數學上定義是：

$$
\vec{k} = \frac{2\pi}{\lambda}
$$

其中：

- $\lambda$：波長  
- $\vec{k}$：波向量，是一個有方向的量，單位是 $\mathrm{m^{-1}}$（1/長度）

## 接下來簡單介紹程式與物理意義
```
import numpy as np
import matplotlib.pyplot as plt
```
#### 引入numpy 以及 matplotlib
NumPy（Numerical Python）是Python數學與科學計算的基礎工具庫在tight-binding 模型中會遇到的計算(例如:建立向量、對波向量取內積、矩陣哈密頓量運算等)
```
k_array = np.linspace(-4*np.pi, 4*np.pi, 201)
```
建立一個波向量（wave vector）陣列，從 −4𝜋到 4𝜋均勻取 201 點。這代表我們考慮多個週期的 𝑘 空間。
```
E_array = 1/2 * k_array**2
```
這就是自由粒子的能量公式，此圖將會是一個開口向上的對稱拋物線，代表在沒有晶格位能的情況下粒子的能量分佈。

```
plt.xlabel("wave vector ")
plt.ylabel("Energy")

```
設定$x$軸為波向量${k}$，$y$軸為能量$𝐸$
```
plt.xlim([-2.5*np.pi, 2.5*np.pi])
plt.ylim([0,65])

```
侷限範圍，使圖集中在第一布里淵區附近（-2.5$\pi$ ~ 2.5$\pi$），能量上限為 65，讓圖形不會太亂。

```
plt.plot(
    k_array, E_array,'black',
    k_array+2*np.pi,E_array, 'black',
    k_array-2*np.pi,E_array, 'black',
    k_array+4*np.pi,E_array, 'black',
    k_array-4*np.pi,E_array, 'black',
    k_array+6*np.pi,E_array, 'black',
    k_array-6*np.pi,E_array, 'black',
    k_array+8*np.pi,E_array, 'black',
    k_array-8*np.pi,E_array, 'black',

```
上方程式碼將自由粒子能量公式間格2$\pi$做位移，分別做到+-8$\pi$。
```
k_array, np.cos(k_array)+1, 'blue',
k_array ,4.5*np.cos(k_array)+11, 'blue',
k_array, -8*np.cos(k_array)+31, 'blue',
k_array, 11*np.cos(k_array)+60, 'blue',

```
 加入了四條藍色曲線，形狀為$cos({k})$模擬能帶的 dispersion（色散關係）。這些曲線的形狀和間距模擬了不同能帶之間的能隙與對稱性。
```
    [np.pi, np.pi],[0,65],'gray',
    [-np.pi, -np.pi],[0,65],'gray',
```
(x=$\pi$,0)到(x=$\pi$,65)畫一條灰色線，以及(x=-$\pi$,0)到(x=-$\pi$,65)也畫一條灰線，就完整標示出第一布里淵區為k=[-$\pi$ ~ $\pi$]。

![螢幕擷取畫面 2025-05-10 121033](https://hackmd.io/_uploads/H1tQhdyZgg.png)
> Dispersion 意指能量 $E$ 隨波向量 $k$ 的變化，描述電子在晶格中可擁有的能量範圍與運動特性。白話問就是:$$ 在不同波向量下，電子有哪些能量可選 $$
 注意:
 本圖中能量 $E(k)$ 是以簡化單位制表示（即 $\hbar = 1$, $m = 1$）由上方推導區得知，因此數值為無單位的規模化結果，用來強調能量與波向量的**關係**，而非實際物理量。
 

2D band structure
---

### 以石墨烯(Graphene)為例
![螢幕擷取畫面 2025-05-12 221122](https://hackmd.io/_uploads/BJDfzFJZex.png)
藍色&紅色皆為碳(Carbon)不同色只是為了方便觀察。
### 接下來模擬典型的 能帶色散關係圖（band dispersion relation）


```
a0 = 1.418  # [a0] = Å，代表碳原子之間的距離
```
定義 graphne 的晶格常數（原子間距，如上圖紅球和藍球的距離），單位是 Å

```
k_points = 301
```
決定${k}$空間中要取幾個點來掃描波向量$k_x$, $k_y$(分別為x及y方向的波向量)值越大，解析度越高，圖就越平滑。但過高可能導致電腦當機。
```
kx_list = np.linspace(-np.pi/a0, np.pi/a0, k_points)
ky_list = kx_list
```
建立一個 $k_x$,$k_y$ 皆分別為[-$\pi$ ~ $\pi$]的範圍取301個點!這樣就涵蓋第一布里淵區（對稱的波向量區域）。
```
energy_list = []
```
建立一個空的energy_list 來存所有能量本徵值。每個 k 點會有兩個能量（上下兩條能帶）

```
for kx in kx_list:
    for ky in ky_list:
```
這兩層迴圈讓每個$k_x$,$k_y$的組合都能計算到一次能量!也就是完全掃過剛建立的空間網格。
```
        ham_matrix = np.array([
            [0,np.exp(1j*np.dot([kx,ky],[0,a0]))+np.exp(1j*np.dot([kx,ky],[a0*np.sqrt(3)/2,-a0/2]))+np.exp(1j*np.dot([kx,ky],[-a0*np.sqrt(3)/2,-a0/2]))],
            [np.exp(1j*np.dot([kx,ky],[0,-a0]))+np.exp(1j*np.dot([kx,ky],[-a0*np.sqrt(3)/2,a0/2]))+np.exp(1j*np.dot([kx,ky],[a0*np.sqrt(3)/2,a0/2])),0]
        ])
```
這裡有點攏長,最主要的是建立一個2×2 的 Hamiltonian（哈密頓量矩陣)，在 tight-binding 模型裡，只有最近鄰（nearest neighbors）的原子之間有非零的跳躍機率。因此
$$
H(\vec{k}) = 
\begin{bmatrix}
0 & f(\vec{k}) \\
f^*(\vec{k}) & 0
\end{bmatrix}
$$
- 左上、右下是對角項 → 設為 0，代表 藍-藍、紅-紅 不互相跳遷（模型假設）。
- 右上$f(\vec{k})$意旨從 A → B 的跳遷
- 左下$f^*(\vec{k})$意旨是從 B → A 的跳遷，是右上的複共軛（因為 Hamiltonian 必須是 Hermitian）

### 什麼是 $f(\vec{k})$ ?
$$f(k) = e^{i \vec{k} \cdot \vec{\delta}_1} + e^{i \vec{k} \cdot \vec{\delta}_2} + e^{i \vec{k} \cdot \vec{\delta}_3}$$
　　　　　　　　　這三個 𝛿 是 graphene 中 A → B 的三個最近鄰位移向量。
其中：
```
[0,
 np.exp(1j*np.dot([kx, ky], [0, a0])) + 
 np.exp(1j*np.dot([kx, ky], [a0*np.sqrt(3)/2, -a0/2])) + 
 np.exp(1j*np.dot([kx, ky], [-a0*np.sqrt(3)/2, -a0/2]))
]

```
這三項就是 石墨烯(Graphene)中 A → B 的三個跳遷方向！
- 第一項:向上跳,[0,$a_0$]
- 第二項:往右下跳一格,$\left[ \frac{a_0 \sqrt{3}}{2}, -\frac{a_0}{2} \right]$
- 第三項:往左下跳一格,$\left[ -\frac{a_0 \sqrt{3}}{2},\ -\frac{a_0}{2} \right]$

#### 也就是:
$$
\vec{\delta}_1 = \left( 0,\ a_0 \right),\quad
\vec{\delta}_2 = \left( \frac{a_0 \sqrt{3}}{2},\ -\frac{a_0}{2} \right),\quad
\vec{\delta}_3 = \left( -\frac{a_0 \sqrt{3}}{2},\ -\frac{a_0}{2} \right)
$$
#### 接著分別套入delta位置
```
np.exp(1j * np.dot([kx, ky], delta))
```
意思是:
- 把波向量$k$ =($k_x$,$k_y$)跟空間位移向量$\vec{\delta}$做內積
- 再套入相位因子$e^{i \vec{k} \cdot \vec{\delta}}$
- 模擬晶格中波動因跳遷所帶來的干涉效應

```
[np.exp(1j*np.dot([kx, ky], [0, -a0])) + 
 np.exp(1j*np.dot([kx, ky], [-a0*np.sqrt(3)/2, a0/2])) + 
 np.exp(1j*np.dot([kx, ky], [a0*np.sqrt(3)/2, a0/2])), 0]

```
和上方雷同,但皆差一個負號為(-$\vec{\delta}$)

```
    energy_list.append(np.linalg.eigvalsh(ham_matrix))
```
 用 numpy 的 eigvalsh() 計算這個 2x2 Hermitian 矩陣的eigenvalue（也就是上下兩條能帶）。然後把它加入能量列表中。
```
kx_list, ky_list = np.meshgrid(kx_list, ky_list)
```
 將一維的 $k_x$, $k_y$ 陣列變成二維網格，對應到倒空間中的每一個 k 點座標。
```
energy_list = np.array(energy_list)
```
 把能量 list 轉成 numpy 陣列以便後續操作
 
```
energy_list = np.reshape(energy_list, (k_points, k_points, 2))
```
把能量陣列reshape 成 (301, 301, 2)，對應 (kx, ky) 格點網格，每點有兩條能帶。
```
plot3D = plt.axes(projection = '3d')
```
開啟一個 3D 繪圖座標軸！
```
plot3D.set_xlabel('kx [1/a]')
plot3D.set_ylabel('ky [1/a]')
plot3D.set_zlabel('Energy')
```
 定 x, y, z 軸的標籤名稱（$k_x$, $k_y$, $能量$）。
```
plot3D.view_init(10,15)
```
設定 3D 視角（仰角 10 度，方位角 15 度），依照個人需求改成你喜歡的角度!
 
```
plot3D.plot_surface(kx_list, ky_list, energy_list[:,:,0],
                    cmap='winter', linewidth = 1, antialiased = True, 
                    rstride = 1, cstride = 1)

```
畫出第一條能帶（最低能態），用藍色 colormap 當配色。

```
plot3D.plot_surface(kx_list, ky_list, energy_list[:,:,1],
                    cmap='autumn', linewidth = 1, antialiased = True, 
                    rstride = 1, cstride = 1)

```
畫出第二條能帶（較高能態），用紅橘色。這樣就能清楚區分兩條能帶！
然後把它加入能量列表中。

![bandstructure_graphene](https://hackmd.io/_uploads/rywVSu1Zeg.png)
利用 tight-binding 模型模擬 Graphene 的能帶結構，透過掃描倒空間的波向量 ($k_x$, $k_y$)，建立 2x2 Hamiltonian 並計算能量eigenvalue本徵值。  


程式模擬的是 Graphene 的能帶結構，利用最簡單的 tight-binding 模型，只考慮最近鄰跳遷，建立出一個 2x2 的 Hamiltonian，並計算每個 $k$ 點的能量本徵值。畫出來的上下兩條能帶展示了 石墨烯(Graphene) 的色散關係，特別是在 K 點會出現特徵性的 Dirac cone 結構。







