Qiskit Nature를 통한 양자화학 맛보기
Qiskit Nature에서 아주 중요한 특징 중 하나인 양자화학에 대해 알아봅시다.
양자화학이 하는 일
화학 반응에서 반응물(reactant)을 이용해 특정 생성물(product)을 만들어내는데, 일부 반응은 너무 빨리 일어나서 그 사이에 발생하는 과정을 관찰하기가 어렵습니다. 그래서 이 과정을 보통 시뮬레이터를 통해 예측합니다. 이를 통해 화학 반응을 더 잘 이해할 수 있고, 이러한 이해를 바탕으로 어떤 촉매가 적절한지 등을 고민할 수 있어 더 나은 생성물을 설계하는 데에 큰 기여를 할 수 있습니다.
양자화학에서는 전자 슈뢰딩거 방정식(electronic Schrödinger equation)을 풀어 미시세계의 화학 현상을 예측합니다. 이 방정식의 근사해는 분자 오비탈(molecular orbitals, MO)입니다. 하지만 이 분자 오비탈을 해당 방정식에서 직접적으로 계산하기는 어렵기 때문에, 원자 오비탈(atomic orbitals, AO)과 함께 하트리-폭 방법을 이용해 분자 오비탈을 구합니다.
하트리-폭(Hartree–Fock, HF) 방법
하트리-폭 방법은 다체 시스템(multibody system)에서 바닥 상태의 파동 함수와 에너지를 구하는 근사 방법입니다. (자세한 계산 식은 여기를 참고: Electronic structure) Qiskit에서는 하트리-폭 방법으로 해를 구하는 고전 프로그램을 지원하고 있기 때문에, 바닥 상태의 파동 함수와 에너지를 쉽게 구할 수 있습니다. 지원하고 있는 프로그램은 Gaussian, Psi4, PyQuante, PySCF로, 총 4개가 있습니다. 다음은 PySCF를 사용한 예시입니다.
from qiskit_nature.drivers import UnitsType, Molecule
from qiskit_nature.drivers.second_quantization import (
ElectronicStructureDriverType,
ElectronicStructureMoleculeDriver,
)
molecule = Molecule(
# after "H" it is for showing the position in coordinate system
geometry=[["H", [0.0, 0.0, 0.0]], ["H", [0.0, 0.0, 0.735]]], charge=0, multiplicity=1
)
driver = ElectronicStructureMoleculeDriver(
molecule, basis="sto3g", driver_type=ElectronicStructureDriverType.PYSCF
)
이렇게 하트리-폭 방법을 이용한 계산까지만 Qiskit이 아닌 외부의 프로그램으로 진행이 됩니다.
페르미온을 Qubit에 매핑하기
위의 코드에서 주어진 값은 페르미온 연산자로 표현되어 있습니다. 이를 양자 컴퓨터에서 사용하는 상태로 인코딩하기 위해서, 해당 연산자를 스핀 연산자로 매핑을 해주어야 합니다. Qiskit에서는 총 3개의 방법을 지원하고 있고, 그 중 하나인 Jordan-Wigner 매핑을 아래 코드에서 사용하였습니다.
from qiskit_nature.problems.second_quantization import ElectronicStructureProblem
from qiskit_nature.converters.second_quantization import QubitConverter
from qiskit_nature.mappers.second_quantization import JordanWignerMapper
es_problem = ElectronicStructureProblem(driver)
qubit_converter = QubitConverter(mapper=JordanWignerMapper())
이제 qubit_converter
를 통해 Jordan-Wigner 매핑이 가능합니다.
VQE (Variational Quantum Eigensolver)
VQE는 단기적(near-term) 양자 컴퓨터를 사용하는 양자화학의 핵심 알고리즘입니다. VQE는 양자 컴퓨터와 고전 컴퓨터 사이를 계속 오가면서 최적의 바닥 상태를 구합니다. VQE가 반복해서 실행되는 과정은 다음과 같습니다.
- 매개변수인 ansatz를 이용해 양자 상태 준비
- 측정
- 고전 최적화
- 1에서 3까지 수렴 기준에 맞을 때까지 반복
아래 코드는 VQE를 만드는 코드입니다.
from qiskit.providers.aer import StatevectorSimulator
from qiskit import Aer
from qiskit.utils import QuantumInstance
from qiskit_nature.algorithms import VQEUCCFactory
quantum_instance = QuantumInstance(backend=Aer.get_backend("aer_simulator_statevector"))
vqe_solver = VQEUCCFactory(quantum_instance)
여기서 ansatz는 기본으로 제공되는 걸 사용했는데, 본인 스스로 정의한 ansatz도 사용 가능합니다. (해당 예제는 여기를 참고: Ground state solvers: The Solver)
끝으로 정의한 VQE로 결과를 도출해봅시다.
from qiskit_nature.algorithms import GroundStateEigensolver
calc = GroundStateEigensolver(qubit_converter, vqe_solver)
res = calc.solve(es_problem)
print(res)
결과가 제대로 출력된다면 성공한 것입니다!
Quantum Challenge에서 만나요!
지금 진행하고 있는 IBM Quantum Spring Challenge 2022에서 마지막 챌린지까지 오픈되었습니다.
어제 막 오픈된 마지막 챌린지는 이번 포스팅에서 설명한 양자화학과 관련된 문제입니다.
궁금하신 분들은 이번 챌린지에 등록 후 Qiskit 슬랙의 #spring-challenge-2022
채널로 오세요!
References
- Yukio Kawashima’s lecture at second Qiskit Hackathon Korea
- Qiskit Nature Documentation
- 양자역학 정리 - 제2 양자화(Second Quantization)
💬 Any comments and suggestions will be appreciated.
Leave a comment