0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita全国学生対抗戦Advent Calendar 2024

Day 20

「Pythonによる化学シミュレーション入門」をやってみたよ8~直鎖pi共役系炭化水素の分子軌道を見てみよう~

Last updated at Posted at 2024-12-25

この記事は現代化学(東京化学同人)の2022年4月号から2024年3月号まで連載された安藤耕司先生の「Pythonによる化学シミュレーション入門」を読んでやってみた記事です。詳しい内容は上記の「Pythonによる化学シミュレーション入門」をご参照ください。今回は、2024年1月号の分子軌道法(4)と2024年2月号の分子軌道法(5)の内容です。

直鎖pi共役系炭化水素の分子軌道の簡易表示

Hückel法は、$\pi$電子のみを考慮した分子軌道法です。以前の記事の通り、Hückel法ではSchrödinger方程式を近似的に解くことで、分子軌道のエネルギーやその電子密度や位相を求めることができました。直鎖の$\pi$共役系炭化水素では、炭素の$2p$軌道の電子が$\pi$電子となります。炭素の位置に大きさが電子密度に依存し、色が位相に対応した$2p_z$軌道を図示することで、Hückel法で求められる分子軌道の形を見てみましょう。

プログラムと結果

先にプログラムの全体と結果を示します。このプログラムを動かすと「Enter N:」と聞いてくるので直鎖の$\pi$共役系炭化水素の炭素数を入力してください。以下に4を入力して1,3-ブタジエンの結果を示します。

import numpy as np
import matplotlib.pyplot as plt

N = int(input("Enter N: "))

def mollinear(N):
  dx = np.cos(np.pi/6)
  dy = np.sin(np.pi/6)
  mol = []

  for i in range(N):
    mol.append([i*dx, (i%2)*dy, 0])
  
  mol = np.array(mol)
  mol -= np.mean(mol, axis=0)
  return mol

def mollinear_huckel_hamiltonian(N):
  H = np.zeros((N,N))
  for i in range(N):
    if i + 1 < N:
      H[i, i + 1] = 1
      H[i + 1, i] = 1

    if i - 1 >= 0:
      H[i, i - 1] = 1
      H[i - 1, i] = 1

  return H

ngrid = 32
theta = np.linspace(0, np.pi, ngrid)
phi = np.linspace(0, 2*np.pi, ngrid)
theta, phi = np.meshgrid(theta, phi)

xyz = np.array([np.sin(theta)*np.cos(phi),
                np.sin(theta)*np.sin(phi),
                np.cos(theta)])

Y = np.cos(theta)
Yx, Yy, Yz = np.abs(Y)*xyz

cmap = plt.cm.ScalarMappable(cmap=plt.get_cmap("bwr"))
fasecols = cmap.to_rgba(Y)

def surf2pz(coef, atomcen):
  x = coef*Yx + atomcen[0]
  y = coef*Yy + atomcen[1]
  z = coef*Yz + atomcen[2]
  return x,y,z

def plotorb3d(c, mol):
  fig = plt.figure()
  ax = fig.add_subplot(projection="3d")
  ax.grid('False')
  N = len(mol)

  for i in range(N-1):
    for j in range(i+1, N):
      if np.linalg.norm(mol[i] - mol[j]) < 1.1:
        x,y,z = np.array([mol[i], mol[j]]).T
        ax.plot(x, y, z, 'o-', color="gray",linewidth=5)
  
  resale, limscale = 2.5, 1.8
  for i in range(N):
    x, y, z = surf2pz(resale*c[i], mol[i])
    surf = ax.plot_surface(x, y, z, facecolors=fasecols) 
    surf.set_facecolor((0,0,0,0))
  
  xylim = np.max(np.abs(mol))*limscale
  ax.set_xlim(-xylim, xylim)
  ax.set_ylim(-xylim, xylim)
  ax.set_zlim(-xylim, xylim)

  plt.show()

mol = mollinear(N)

H = mollinear_huckel_hamiltonian(N)

if N%2 == 0:
  nocc = int(N/2)
  nvac = N - nocc
  occ = [2]*nocc + [0]*nvac
elif N%2 == 1:
  nocc = int((N-1)/2)
  nvac = N - nocc
  occ = [2]*nocc + [1] + [0]*nvac

ee, cc = np.linalg.eigh(H)

for i in range(len(mol)):
  c = cc.T[:,i]
  plotorb3d(c, mol)

ここから出図の結果です。

download1.png

download2.png

download3.png

download4.png

最初から順番に見ていくと、節の数がどんどん増えていくのがわかります。なので一枚目の分子軌道が安定な軌道$\psi_1$で、最後の分子軌道が一番エネルギーの高い軌道$\psi_4$になります。

プログラムの概要

mollinear

直鎖の共役炭化水素の原子位置を生成しています。共役炭化水素の炭素は全て同一平面状にいて、全ての炭素で120$^{\circ}$折れ曲がっていると仮定して、xy平面上に原子位置を生成しています。

mollinear_huckel_hamiltonian

直鎖の共役炭化水素のハミルトニアン行列を生成しています。これの固有値問題をnp.linalg.eighで解くことで分子軌道の情報が得られます。

plotorb3d

大きさが電子密度に依存し、色が位相に対応した$2p_z$軌道をぞれぞれの炭素の位置に図示しています。

連載記事目次

「Pythonによる化学シミュレーション入門」をやってみたよ~単分子一次反応の反応速度論~

「Pythonによる化学シミュレーション入門」をやってみたよ2~色々な反応の反応速度~

「Pythonによる化学シミュレーション入門」をやってみたよ3~振動反応~

「Pythonによる化学シミュレーション入門」をやってみたよ4~ランダムウォークと拡散現象~

「Pythonによる化学シミュレーション入門」をやってみたよ5~ブラウン運動とランジュバン方程式~

「Pythonによる化学シミュレーション入門」をやってみたよ6~分子軌道法(1)~

「Pythonによる化学シミュレーション入門」をやってみたよ7~Hückel法とフロンティア軌道理論~

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?