注釈

このページは docs/tutorials/01_electronic_structure.ipynb から生成されました。

電子構造#

はじめに#

ある分子のハミルトニアンは、以下の数式で表されます。

\[\mathcal{H} = - \sum_I \frac{\nabla_{R_I}^2}{M_I} - \sum_i \frac{\nabla_{r_i}^2}{m_e} - \sum_I\sum_i \frac{Z_I e^2}{|R_I-r_i|} + \sum_i \sum_{j>i} \frac{e^2}{|r_i-r_j|} + \sum_I\sum_{J>I} \frac{Z_I Z_J e^2}{|R_I-R_J|}\]

原子核は電子よりも非常に重い質量を有するため、原子核は電子に比べて非常に遅い運動速度となります。したがって、原子核と電子の運動は分離しているとみなして考えることができます。 これはボルン・オッペンハイマー近似と呼ばれています。

したがって、まずは核座標を一つの入力パラメーターとして限定的に扱うことで、電子構造を明らかにする問題に取り組むことができます。 分子中の電子のエネルギー・レベルは、非相対論的かつ時間に依存しないシュレーディンガー方程式の求解による導出が可能です。

\[\mathcal{H}_{\text{el}} |\Psi_{n}\rangle = E_{n} |\Psi_{n}\rangle\]

ここで

\[\mathcal{H}_{\text{el}} = - \sum_i \frac{\nabla_{r_i}^2}{m_e} - \sum_I\sum_i \frac{Z_I e^2}{|R_I-r_i|} + \sum_i \sum_{j>i} \frac{e^2}{|r_i-r_j|}.\]

特に、電子の基底状態エネルギーは下記で与えられます。

\[E_0 = \frac{\langle \Psi_0 | H_{\text{el}} | \Psi_0 \rangle}{\langle \Psi_0 | \Psi_0 \rangle}\]

ここで \(\Psi_0\) は、系の基底状態です。

しかし、この問題の有する次元数は、分子/電子の自由度に応じて指数関数的に増大します。そのため、 こうした計算の次元数の増加を押さえるアプローチとして、 \(\Psi_0\) を量子コンピューター上に用意してハミルトニアンの期待値(または \(E_0\) )を直接測定する方法が考えられています。

では具体的にはどのようなアプローチなのでしょうか?

Hartree-Fock ソリューションからの開始#

この問題を解くアプローチの出発点として、ハー トリー・フォック法が用いられます。 この手法では、電子N体を独立したN個体の問題に近似(平均場近似)します。古典コンピューター上でハートリー・フォック方程式を解くことは効率的であり、正確な交換エネルギーにつながりますが、電子同士の相関は考慮されていません。 したがって、電子同士の相関を計算に考慮するのは良い議論の出発点とされています。

上述の電子のハミルトニアンは、ハートリー・フォック法、別名分子軌道法(MOs)を用いても数学的に表現可能です。

\[\hat{H}_{elec}=\sum_{pq} h_{pq} \hat{a}^{\dagger}_p \hat{a}_q + \frac{1}{2} \sum_{pqrs} h_{pqrs} \hat{a}^{\dagger}_p \hat{a}^{\dagger}_q \hat{a}_r \hat{a}_s\]

一体積分は次の通りです。

\[h_{pq} = \int \phi^*_p(r) \left( -\frac{1}{2} \nabla^2 - \sum_{I} \frac{Z_I}{R_I- r} \right) \phi_q(r)dr\]

二体積分は次の通りです。

\[h_{pqrs} = \int \frac{\phi^*_p(r_1) \phi^*_q(r_2) \phi_r(r_2) \phi_s(r_1)}{|r_1-r_2|}dr_1dr_2.\]

分子軌道法(\(\phi_u\))では、被占軌道もしくは空軌道の状態を取ることができます。ある一つの分子軌道には2つの電子まで入ることができます。しかし、下記では、2つのスピン軌道状態(上向き \(\alpha\) または下向き \(\beta\))のどちらかを取り扱います。したがって、あるスピン軌道は1つの電子を含むかもしくは空軌道となります。

注記: 軌道の数を参照する場合、空間 軌道の数を使用します。 これは、デカルト空間の任意の軌道を指します (ここでは、分子軌道であろうと別の基底であろうと関係ありません)。 次に、各空間軌道は通常、2 つの スピン 軌道に分割されます。

実際にQiskitにて上記の計算過程を実現する方法を紹介します。

初期 Hartree-Fock ソリューションの取得#

Qiskit はハートリー・フォック法を解く異なる古典コードとのインタフェースがあります。Qiskit と以下のコードには既にインターフェースがあります:

  • Gaussian

  • Psi4

  • PySCF

以下では、平衡結合距離 (0.735 angstrom) にある電荷なしでシングレット状態の水素分子で、PySCFドライバーを設定しました。

[1]:
from qiskit_nature.units import DistanceUnit
from qiskit_nature.second_q.drivers import PySCFDriver

driver = PySCFDriver(
    atom="H 0 0 0; H 0 0 0.735",
    basis="sto3g",
    charge=0,
    spin=0,
    unit=DistanceUnit.ANGSTROM,
)

このドライバーを実行すると、QisKit Natureの解析に興味のある電子構造問題を表現する ElectronicStructureProblem が生成されます。 ドライバーの詳細については、https://qiskit.org/documentation/nature/apidocs/qiskit_nature.second_q.drivers.html を参照してください。

[2]:
problem = driver.run()
print(problem)
<qiskit_nature.second_q.problems.electronic_structure_problem.ElectronicStructureProblem object at 0x7f3bc13406a0>

ElectronicStructureProblem とそのコンポーネント#

この問題のインスタンスとそのコンポーネントを理解するのに時間を費やしてみましょう。

ElectronicEnergy ハミルトニアン#

最も重要な側面は内部ハミルトニアンです。このケースでは、ElectronicEnergy ハミルトニアンです。 このクラスは、古典的なコードが計算した1体積分と2体積分から第2量子化演算子を生成することができます。

重要: 積分係数のコンテナクラス ( PolynomialTensor) は、 物理順序 で2体項を提供する必要があります!

[3]:
hamiltonian = problem.hamiltonian

coefficients = hamiltonian.electronic_integrals
print(coefficients.alpha)
Polynomial Tensor
 "+-":
[[-1.25633907e+00 -6.21867875e-17]
 [-7.78036432e-17 -4.71896007e-01]]
 "++--":
[[[[6.75710155e-01 1.12401641e-16]
   [1.56722377e-16 1.80931200e-01]]

  [[1.92605510e-16 1.80931200e-01]
   [6.64581730e-01 2.59298923e-16]]]


 [[[8.68926823e-17 6.64581730e-01]
   [1.80931200e-01 1.82411770e-16]]

  [[1.80931200e-01 2.57172666e-16]
   [7.20426423e-17 6.98573723e-01]]]]
[4]:
second_q_op = hamiltonian.second_q_op()
print(second_q_op)
Fermionic Operator
number spin orbitals=4, number terms=36
  -1.2563390730032498 * ( +_0 -_0 )
+ -0.47189600728114245 * ( +_1 -_1 )
+ -1.2563390730032498 * ( +_2 -_2 )
+ -0.47189600728114245 * ( +_3 -_3 )
+ 0.33785507740175813 * ( +_0 +_0 -_0 -_0 )
+ 0.09046559989211565 * ( +_0 +_0 -_1 -_1 )
+ 0.09046559989211556 * ( +_0 +_1 -_0 -_1 )
+ 0.33229086512764827 * ( +_0 +_1 -_1 -_0 )
+ 0.33785507740175813 * ( +_0 +_2 -_2 -_0 )
+ 0.09046559989211565 * ( +_0 +_2 -_3 -_1 )
+ 0.09046559989211556 * ( +_0 +_3 -_2 -_1 )
+ 0.33229086512764827 * ( +_0 +_3 -_3 -_0 )
+ 0.33229086512764816 * ( +_1 +_0 -_0 -_1 )
+ 0.09046559989211574 * ( +_1 +_0 -_1 -_0 )
+ 0.09046559989211564 * ( +_1 +_1 -_0 -_0 )
+ 0.34928686136600906 * ( +_1 +_1 -_1 -_1 )
+ 0.33229086512764816 * ( +_1 +_2 -_2 -_1 )
+ 0.09046559989211574 * ( +_1 +_2 -_3 -_0 )
+ 0.09046559989211564 * ( +_1 +_3 -_2 -_0 )
+ 0.34928686136600906 * ( +_1 +_3 -_3 -_1 )
+ 0.33785507740175813 * ( +_2 +_0 -_0 -_2 )
+ 0.09046559989211565 * ( +_2 +_0 -_1 -_3 )
+ 0.09046559989211556 * ( +_2 +_1 -_0 -_3 )
+ 0.33229086512764827 * ( +_2 +_1 -_1 -_2 )
+ 0.33785507740175813 * ( +_2 +_2 -_2 -_2 )
+ 0.09046559989211565 * ( +_2 +_2 -_3 -_3 )
+ 0.09046559989211556 * ( +_2 +_3 -_2 -_3 )
+ 0.33229086512764827 * ( +_2 +_3 -_3 -_2 )
+ 0.33229086512764816 * ( +_3 +_0 -_0 -_3 )
+ 0.09046559989211574 * ( +_3 +_0 -_1 -_2 )
+ 0.09046559989211564 * ( +_3 +_1 -_0 -_2 )
+ 0.34928686136600906 * ( +_3 +_1 -_1 -_3 )
+ 0.33229086512764816 * ( +_3 +_2 -_2 -_3 )
+ 0.09046559989211574 * ( +_3 +_2 -_3 -_2 )
+ 0.09046559989211564 * ( +_3 +_3 -_2 -_2 )
+ 0.34928686136600906 * ( +_3 +_3 -_3 -_3 )

これは純粋にシステムの 電子 ハミルトニアンであることに注意してください。つまり、 核反発エネルギー は含まれていません。 代わりに、Qiskit Nature はシステムの総エネルギーを計算するために、後処理ステップでこの一定のエネルギーオフセットを追加します。 この演算子に核反発エネルギーを含める方法については、ElectronicEnergy クラスの こちら のドキュメントを参照してください。

[5]:
hamiltonian.nuclear_repulsion_energy  # NOT included in the second_q_op above
[5]:
0.7199689944489797

ElectronicStructureProblem の他の属性#

以下に、problem インスタンスの追加属性を示します。

[6]:
problem.molecule
[6]:
MoleculeInfo(symbols=['H', 'H'], coords=[(0.0, 0.0, 0.0), (0.0, 0.0, 1.3889487015553204)], multiplicity=1, charge=0, units=<DistanceUnit.BOHR: 'Bohr'>, masses=[1, 1])
[7]:
problem.reference_energy
[7]:
-1.1169989967540035
[8]:
problem.num_particles
[8]:
(1, 1)
[9]:
problem.num_spatial_orbitals
[9]:
2
[10]:
problem.basis
[10]:
<ElectronicBasis.MO: 'molecular'>

問題の基礎について詳しくは、`BasisTransformer <05_problem_transformers.ipynb>`__ のチュートリアルを参照してください。

追加の観測量#

ElectronicStructureProblem には追加の演算子ファクトリーも含まれており、計算の最後に基底および励起状態で評価される観測データが生成されます。

[11]:
problem.properties
[11]:
<qiskit_nature.second_q.problems.electronic_properties_container.ElectronicPropertiesContainer at 0x7f3bc1340790>
[12]:
problem.properties.particle_number
[12]:
<qiskit_nature.second_q.properties.particle_number.ParticleNumber at 0x7f3bc1340820>
[13]:
problem.properties.angular_momentum
[13]:
<qiskit_nature.second_q.properties.angular_momentum.AngularMomentum at 0x7f3bc1340700>
[14]:
problem.properties.magnetization
[14]:
<qiskit_nature.second_q.properties.magnetization.Magnetization at 0x7f3bc1340760>
[15]:
problem.properties.electronic_dipole_moment
[15]:
<qiskit_nature.second_q.properties.dipole_moment.ElectronicDipoleMoment at 0x7f3bc1340880>

これらのプロパティの詳細については、 こちらのチュートリアル を参照してください。

ElectronicStructureProblem の解決#

以下では、我々の問題インスタンスの基底状態を計算します。 GroundStateSolver に入る個々のコンポーネントの詳細については、 基底状態チュートリアル を参照してください。

[16]:
from qiskit_algorithms import NumPyMinimumEigensolver
from qiskit_nature.second_q.algorithms import GroundStateEigensolver
from qiskit_nature.second_q.mappers import JordanWignerMapper

solver = GroundStateEigensolver(
    JordanWignerMapper(),
    NumPyMinimumEigensolver(),
)
[17]:
result = solver.solve(problem)
print(result)
=== GROUND STATE ENERGY ===

* Electronic ground state energy (Hartree): -1.857275030202
  - computed part:      -1.857275030202
~ Nuclear repulsion energy (Hartree): 0.719968994449
> Total ground state energy (Hartree): -1.137306035753

=== MEASURED OBSERVABLES ===

  0:  # Particles: 2.000 S: 0.000 S^2: 0.000 M: 0.000

=== DIPOLE MOMENTS ===

~ Nuclear dipole moment (a.u.): [0.0  0.0  1.3889487]

  0:
  * Electronic dipole moment (a.u.): [0.0  0.0  1.3889487]
    - computed part:      [0.0  0.0  1.3889487]
  > Dipole moment (a.u.): [0.0  0.0  0.0]  Total: 0.0
                 (debye): [0.0  0.0  0.0]  Total: 0.0

[18]:
import qiskit.tools.jupyter

%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.24.0.dev0+2b3686f
qiskit-aer0.11.2
qiskit-ibmq-provider0.19.2
qiskit-nature0.6.0
System information
Python version3.9.16
Python compilerGCC 12.2.1 20221121 (Red Hat 12.2.1-4)
Python buildmain, Dec 7 2022 00:00:00
OSLinux
CPUs8
Memory (Gb)62.50002670288086
Thu Apr 06 08:53:41 2023 CEST

This code is a part of Qiskit

© Copyright IBM 2017, 2023.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.