Langkau ke kandungan utama

Variational Quantum Eigensolver (VQE)

Untuk modul ini, pelajar perlu mempunyai persekitaran Python yang berfungsi, serta versi terkini pakej-pakej berikut dipasang:

  • qiskit
  • qiskit_ibm_runtime
  • qiskit-aer
  • qiskit.visualization
  • numpy
  • pylatexenc

Untuk menyediakan dan memasang pakej-pakej ini, rujuk panduan Pasang Qiskit. Untuk menjalankan kerja pada komputer kuantum sebenar, pelajar perlu menyediakan akaun IBM Cloud, mengikuti langkah-langkah dalam panduan Sediakan akaun IBM Cloud anda.

Modul ini telah diuji dan menggunakan lebih kurang 8 minit masa QPU. Ini adalah anggaran, dan penggunaan sebenar anda mungkin berbeza.

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-aer qiskit-ibm-runtime scipy
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'

Pengenalan

Sejak pembangunan model mekanik kuantum pada awal abad ke-20, saintis telah memahami bahawa elektron tidak mengikuti laluan tetap mengelilingi nukleus atom, sebaliknya wujud dalam kawasan kebarangkalian yang dipanggil orbital. Orbital-orbital ini sepadan dengan aras tenaga diskrit tertentu yang boleh diduduki oleh elektron. Elektron secara semula jadi berada pada aras tenaga terendah yang tersedia, yang dikenali sebagai keadaan asas. Walau bagaimanapun, jika elektron menyerap tenaga yang mencukupi, ia boleh melompat ke aras tenaga yang lebih tinggi, memasuki keadaan teruja. Keadaan teruja ini bersifat sementara, dan elektron akhirnya akan kembali ke aras tenaga yang lebih rendah, melepaskan tenaga yang diserap, selalunya dalam bentuk cahaya. Proses asas penyerapan dan pelepasan tenaga ini penting untuk memahami cara atom berinteraksi dan membentuk ikatan.

Apabila atom-atom bergabung membentuk molekul, orbital atom mereka bergabung membentuk orbital molekul. Susunan dan aras tenaga elektron dalam orbital molekul ini menentukan sifat molekul yang terhasil dan kekuatan ikatan kimia. Contohnya, dalam pembentukan molekul hidrogen (H2H_2) daripada dua atom hidrogen individu, elektron daripada setiap atom menduduki orbital atom. Apabila atom-atom saling menghampiri, orbital atom ini bertindih dan bergabung membentuk orbital molekul baru — satu dengan tenaga lebih rendah (orbital ikatan) dan satu dengan tenaga lebih tinggi (orbital anti-ikatan). Kedua-dua elektron, satu dari setiap atom hidrogen, akan lebih suka menduduki orbital ikatan bertenaga rendah, yang membawa kepada pembentukan ikatan kovalen stabil yang menyatukan molekul H2H_2. Perbezaan tenaga antara atom-atom yang terpisah dan molekul yang terbentuk, khususnya tenaga elektron dalam orbital molekul, menentukan kestabilan dan sifat-sifat ikatan.

Dalam bahagian-bahagian berikut, kita akan meneroka proses pembentukan molekul ini, dengan menumpukan perhatian pada molekul H2H_2. Kita akan menggunakan komputer kuantum sebenar, digabungkan dengan teknik pengoptimuman klasik, untuk mencari tenaga proses asas namun penting ini. Eksperimen ini akan memberikan demonstrasi praktikal tentang bagaimana pengiraan kuantum boleh digunakan untuk menyelesaikan masalah dalam kimia komputasi, memberikan gambaran tentang peranan tenaga elektron.

VQE - Algoritma kuantum variatif untuk masalah nilai eigen

Teknik penghampiran untuk kimia - prinsip variatif dan set asas

Sumbangan Erwin Schrödinger kepada mekanik kuantum tidak terhad kepada memperkenalkan model elektronik baru; secara asasnya, beliau menetapkan mekanik gelombang dengan membangunkan persamaan Schrödinger bersandar masa yang terkenal:

iddtψ=H^ψi\hbar \frac{d}{dt}|\psi\rangle = \hat{H}|\psi\rangle

Di sini, H^\hat{H} ialah operator Hamiltonian, yang mewakili jumlah tenaga sistem, dan ψ|\psi\rangle ialah fungsi gelombang yang mengandungi semua maklumat tentang keadaan kuantum sistem. (Nota: ddt\frac{d}{dt} ialah terbitan masa penuh, dan kita tidak menyertakan nilai eigen tenaga EE secara eksplisit di sini.)

Walau bagaimanapun, dalam banyak aplikasi praktikal — seperti menentukan aras tenaga yang dibenarkan bagi atom dan molekul — kita sebaliknya menggunakan persamaan Schrödinger tak bersandar masa (persamaan nilai eigen tenaga), yang diterbitkan daripada bentuk bersandar masa dengan menganggap keadaan pegun. Keadaan pegun ialah keadaan kuantum di mana ketumpatan kebarangkalian mencari zarah pada titik tertentu dalam ruang tidak berubah mengikut masa.

H^ψ=Eψ\hat{H}|\psi\rangle = E|\psi\rangle

Dalam bentuk ini, EE mewakili nilai eigen tenaga yang sepadan dengan keadaan kuantum ψ|\psi\rangle. Hamiltonian merangkumi pelbagai sumbangan tenaga, seperti tenaga kinetik elektron dan nukleus, daya tarikan antara elektron dan nukleus, dan daya tolakan antara elektron.

Menyelesaikan persamaan nilai eigen tenaga membolehkan kita mengira aras tenaga terkuantum bagi sistem atom dan molekul. Walau bagaimanapun, untuk molekul, menyelesaikannya secara tepat adalah sukar kerana fungsi gelombang Ψ\Psi, yang menggambarkan taburan spatial elektron, adalah kompleks dan berdimensi tinggi.

Akibatnya, saintis menggunakan teknik penghampiran untuk mendapatkan penyelesaian yang praktikal dan tepat. Dalam kerja ini, kita akan menumpukan pada dua kaedah utama:

  1. Prinsip variatif

    Kaedah ini menghampiri fungsi gelombang dan menyesuaikannya untuk mendapatkan nilai sedekat mungkin dengan tenaga sasaran, biasanya tenaga keadaan asas sistem. Idea utama di sebalik prinsip variatif adalah mudah:

    • Jika kita meneka fungsi gelombang Ψtrial\Psi_\text{trial} (sebuah "fungsi percubaan"), tenaga yang dikira daripadanya akan sentiasa sama dengan atau lebih tinggi daripada tenaga keadaan asas (E0E_0) sistem. Eapprox=ΨtrialH^ΨtrialΨtrialΨtrialE0E_\text{approx} = \frac{\langle \Psi_\text{trial}|\hat{H}|\Psi_\text{trial}\rangle}{\langle \Psi_\text{trial}|\Psi_\text{trial}\rangle} \geq E_0
    • Dengan menyesuaikan parameter θ\theta dalam fungsi percubaan, Ψtrial(θ)|\Psi_\text{trial}(\theta)\rangle, kita boleh mendapatkan penghampiran tenaga keadaan asas yang semakin baik.
    • Ketepatannya sangat bergantung pada pilihan fungsi gelombang percubaan Ψtrial\Psi_\text{trial}. Fungsi percubaan yang dipilih dengan buruk mungkin menghasilkan anggaran tenaga yang jauh dari tepat.
  2. Penghampiran set asas

    Kaedah penghampiran kedua hadir pada peringkat pembinaan fungsi gelombang — pendekatan set asas. Dalam kimia kuantum, menyelesaikan persamaan Schrödinger secara tepat untuk molekul adalah hampir mustahil. Sebaliknya, kita menghampiri fungsi gelombang berbilang elektron yang kompleks dengan membinanya daripada fungsi matematik yang lebih mudah dan telah ditetapkan. Set asas pada asasnya ialah koleksi fungsi matematik yang diketahui ini, biasanya berpusat pada atom-atom dalam molekul, yang digunakan sebagai blok binaan untuk mewakili bentuk dan tingkah laku elektron dalam sistem. Bayangkan seperti cuba mencipta semula arca yang terperinci menggunakan hanya koleksi bata LEGO piawai — semakin banyak jenis dan saiz bata yang anda ada (semakin besar set asas), semakin tepat anda boleh menghampiri bentuk asal.

    Fungsi asas ini sering terinspirasi daripada penyelesaian analitik untuk sistem mudah seperti atom hidrogen, mengambil bentuk seperti fungsi Gaussian atau jenis Slater, walaupun ia masih merupakan penghampiran. Daripada bekerja dengan orbital molekul penuh yang secara teori "tepat" tetapi tidak boleh dikendalikan, kita menyatakannya sebagai gabungan linear (jumlah dengan pekali) fungsi-fungsi asas ini. Kaedah ini dikenali sebagai pendekatan Gabungan Linear Orbital Atom (LCAO) apabila fungsi asas menyerupai orbital atom. Dengan mengoptimumkan pekali dalam gabungan linear ini, kita boleh mencari fungsi gelombang anggaran terbaik dan tenaga dalam had set asas yang dipilih.

    • Semakin banyak fungsi yang dimasukkan dalam set asas, semakin baik penghampiran, tetapi ini datang dengan kos usaha pengiraan yang lebih tinggi.
    • Set asas yang kecil memberikan anggaran kasar, manakala set asas yang besar memberikan keputusan yang lebih tepat dengan kos keperluan sumber pengiraan yang lebih banyak.

Ringkasnya, untuk menjadikan pengiraan boleh dilaksanakan dan mengurangkan kos pengiraan, kita menggunakan prinsip variatif dengan menghampiri fungsi gelombang, yang mengurangkan kerumitan pengiraan dan membolehkan pengoptimuman berulang untuk meminimumkan tenaga. Sementara itu, pendekatan set asas memudahkan pengiraan dengan mewakili orbital atom sebagai gabungan fungsi yang telah ditetapkan, bukannya menyelesaikan fungsi gelombang berterusan secara langsung.

Semak kefahaman anda

Pertimbangkan fungsi gelombang percubaan Ψtrial(α,x)=Aeαx2\Psi_\text{trial}(\alpha,x) = Ae^{- \alpha x^2} di mana AA ialah pemalar normalisasi dan α\alpha ialah parameter boleh laras.

(a) Normalkan fungsi gelombang percubaan dengan menentukan AA supaya

Ψtrial2dx=1\int_{-\infty}^{\infty} |\Psi_\text{trial}|^2 dx = 1.

(b) Kira nilai jangkaan Hamiltonian H^\hat{H} yang diberikan oleh:

H^=22md2dx2+V(x) \hat{H} = -\frac{\hbar^2}{2m} \frac{d^2}{dx^2} + V(x) di mana V(x)=12mω2x2V(x) = \frac{1}{2}m\omega^2x^2, yang sepadan dengan potensi pengayun harmonik mudah.

(c) Gunakan prinsip variatif untuk mencari α\alpha optimum dengan meminimumkan Eapprox(α)E_\text{approx}(\alpha)

Jawapan:

(a) Untuk menormalkan fungsi gelombang percubaan yang diberikan:

Ψtrial2dx=A2e2αx2dx=1\int_{-\infty}^{\infty} |\Psi_\text{trial}|^2 dx = \int_{-\infty}^{\infty} A^2 e^{-2 \alpha x^2} dx = 1

Gunakan kamiran Gaussian:

eax2dx=πa, untuk a>0 \int_{-\infty}^{\infty} e^{-a x^2} dx = \sqrt{\frac{\pi}{a}} \text{, untuk } a>0

tetapkan a=2αa = 2\alpha kemudian dapatkan: A2πa=1A^2\sqrt{\frac{\pi}{a}} = 1 A=(2απ)1/4\therefore A = (\frac{2\alpha}{\pi})^{1/4}

(b) Hamiltonian untuk pengayun harmonik ialah:

H^=22md2dx2+12mω2x2\hat{H} = -\frac{\hbar^2}{2m} \frac{d^2}{dx^2} + \frac{1}{2} m \omega^2 x^2

  • Nilai jangkaan tenaga kinetik

T=22mΨtriald2dx2Ψtrialdx\langle T \rangle = -\frac{\hbar^2}{2m} \int_{-\infty}^{\infty} \Psi_\text{trial}^* \frac{d^2}{dx^2} \Psi_\text{trial} dx

Mengambil terbitan kedua:

ddxΨtrial=2αxAeαx2\frac{d}{dx} \Psi_\text{trial} = -2\alpha x A e^{-\alpha x^2}d2dx2Ψtrial=Aeαx2(4α2x22α)\frac{d^2}{dx^2} \Psi_\text{trial} = A e^{-\alpha x^2} (4\alpha^2 x^2 - 2\alpha)

Maka:

T=22mA2e2αx2(4α2x22α)dxT = -\frac{\hbar^2}{2m} \int_{-\infty}^{\infty} A^2 e^{-2\alpha x^2} (4\alpha^2 x^2 - 2\alpha) dx

Menggunakan keputusan kamiran Gaussian piawai:

T=2α2m\langle T \rangle = \frac{\hbar^2 \alpha}{2m}
  • Nilai jangkaan tenaga keupayaan
V=12mω2x2Ψtrial2dx\langle V \rangle = \frac{1}{2} m \omega^2 \int_{-\infty}^{\infty} x^2 |\Psi_\text{trial}|^2 dx

Menggunakan:

x2eax2dx=π2a3/2\int_{-\infty}^{\infty} x^2 e^{-a x^2} dx = \frac{\sqrt{\pi}}{2a^{3/2}}

kita dapatkan:

V=mω24α\langle V \rangle = \frac{m \omega^2}{4\alpha}
  • Nilai jangkaan jumlah tenaga
Eapprox(α)=2α2m+mω24α\therefore E_\text{approx}(\alpha) = \frac{\hbar^2 \alpha}{2m} + \frac{m \omega^2}{4\alpha}

(c) Optimumkan α\alpha untuk tenaga minimum

Bezakan:

ddα(2α2m+mω24α)=0\frac{d}{d\alpha} \left( \frac{\hbar^2 \alpha}{2m} + \frac{m \omega^2}{4\alpha} \right) = 0

Menyelesaikan:

22mmω24α2=0\frac{\hbar^2}{2m} - \frac{m \omega^2}{4\alpha^2} = 0αopt=mω2\alpha_\text{opt} = \frac{m\omega}{2\hbar}

Menggantikan αopt\alpha_\text{opt} ke dalam EapproxE_\text{approx}:

Eapprox=ω2\therefore E_\text{approx} = \frac{\hbar \omega}{2}

yang sepadan dengan tenaga keadaan asas pengayun harmonik kuantum tepat.

VQE (Variational Quantum Eigensolver)

Variational quantum eigensolver (VQE) ialah kaedah utama yang akan kita gunakan untuk meneroka proses H+H=H2H+H = H_2, dan di sini, kita akan melihat apa itu VQE dan bagaimana ia berfungsi. Tetapi mari kita berhenti sejenak dan lihat satu perkara yang sangat penting melalui soalan daftar masuk.

Semak kefahaman anda

Jika kita sudah mempunyai begitu banyak strategi untuk masalah kimia, kenapa kita perlukan komputer kuantum? Dan apakah tujuan menggunakan komputer kuantum dan klasik bersama-sama?

Jawapan:

Pengkomputeran kuantum berpotensi merevolusikan kimia dengan menangani masalah yang sukar diselesaikan oleh komputer klasik akibat penskalaan eksponen keadaan kuantum. Richard Feynman terkenal mencatatkan bahawa untuk mensimulasikan alam semula jadi, pengiraan juga mesti bersifat kuantum [ref 1].

Contohnya, mensimulasikan kafein dengan set asas paling mudah (STO-3G) memerlukan 104810^{48} bit, jauh lebih besar daripada jumlah keseluruhan bintang dalam alam semesta yang boleh diperhatikan (102410^{24}) [ref 2]. Komputer kuantum boleh menggambarkan orbital elektronik kafein dengan 160 Qubit.

Komputer kuantum secara semula jadi memproses interaksi kuantum menggunakan superposisi dan jalinan, yang menyediakan cara menjanjikan untuk membolehkan simulasi molekul yang tepat. Selanjutnya, kita boleh menggabungkan kelebihan komputer kuantum (simulasi elektron) dan komputer klasik (pra/pasca-pemprosesan data, pengurusan proses algoritma, pengoptimuman, dan sebagainya). Ini dijangka dapat meningkatkan penemuan bahan, reka bentuk ubat, dan ramalan tindak balas, mengurangkan eksperimen cuba jaya yang mahal. [ref 3][ref 4]

Jika anda ingin tahu mengapa komputer kuantum diperlukan untuk masalah kimia dan mengapa menggunakan sumber pengkomputeran kuantum dan klasik bersama, semak artikel-artikel berikut:

Sekarang mari kita kembali kepada VQE.

VQE menggabungkan kuasa komputer kuantum dengan komputer klasik, pada asasnya menggunakan prinsip variatif untuk mendapatkan tenaga keadaan asas sistem. Untuk memahami VQE, bahagikannya dahulu kepada tiga bahagian:

Aliran kerja VQE

(Kuantum) Observable: Hamiltonian molekul (tenaga molekul)

Dalam VQE, Hamiltonian molekul/atom ialah satu observable, bermakna kita boleh mengukur nilainya melalui eksperimen. Matlamat kita adalah untuk mencari tenaga terendah yang mungkin (tenaga keadaan asas) bagi molekul. Untuk melakukan ini, kita menggunakan keadaan kuantum percubaan, yang dijana oleh Circuit kuantum berparameter (ansatz). Kita mengukur observable dan mengoptimumkan keadaan kuantum sehingga mencapai tenaga terendah yang mungkin.

Set asas yang digunakan untuk Hamiltonian molekul menentukan bilangan Qubit yang diperlukan dan secara langsung mempengaruhi ketepatan VQE. Memilih set asas yang betul adalah kritikal untuk mengimbangi kecekapan dan ketepatan. Untuk memudahkan pengiraan tanpa mengubah set asas, kita boleh menggunakan strategi seperti pengenaan simetri dan pengurangan ruang aktif. Banyak molekul mempunyai bentuk simetri (seperti rama-rama atau kepingan salji), bermakna beberapa bahagian berkelakuan sama. Daripada mengira semuanya secara berasingan, kita boleh menumpukan hanya pada bahagian unik, menjimatkan sumber kuantum, dengan itu memanfaatkan simetri. Dalam pengurangan ruang aktif, kita hanya mempertimbangkan orbital yang penting, kerana tidak semua elektron memberi kesan ketara kepada tenaga molekul. Elektron yang dekat dengan nukleus kekal hampir tidak berubah, manakala yang lain mempengaruhi ikatan. Dengan menggunakan kaedah-kaedah ini, kita boleh menjadikan VQE lebih cekap sambil mengekalkan ketepatan.

Setelah kita mendapatkan Hamiltonian molekul menggunakan set asas dan strategi yang betul di atas, kita perlu mengubah Hamiltonian ini menjadi satu yang sesuai untuk komputer kuantum. Memetakan masalah kepada operator Pauli boleh menjadi cukup rumit. Ini terutamanya benar dalam kimia kuantum, yang bekerja dengan zarah yang tidak dapat dibezakan (elektron), kerana Qubit adalah boleh dibezakan. Kita tidak akan masuk ke dalam butiran pemetaan di sini, tetapi kami merujuk anda kepada sumber-sumber berikut. Perbincangan umum tentang memetakan masalah kepada operator kuantum boleh didapati dalam Pengkomputeran kuantum dalam amalan. Perbincangan lebih terperinci tentang memetakan masalah kimia kepada operator kuantum boleh didapati dalam Kimia kuantum dengan VQE.

Untuk modul ini, kami akan menyediakan Hamiltonian (satu-Qubit) yang sesuai untuk HH dan H2H_2 supaya kita boleh menumpukan pada penggunaan komputer kuantum. Hamiltonian satu-Qubit ini disediakan dengan menggunakan set asas STO-6G dan pemetaan Jordan-Wigner, yang merupakan pemetaan paling mudah dengan interpretasi fizikal yang paling ringkas, kerana ia memetakan penghunian satu spin-orbital kepada penghunian satu Qubit. Juga, kami menggunakan teknik pengurangan Qubit dengan menggunakan simetri Hamiltonian, yang menggunakan corak dalam cara penghunian spin berkelakuan untuk mengurangkan bilangan Qubit. Untuk molekul H2H_2, kami menganggap jarak antara dua atom hidrogen ialah 0.735 A˚\mathring A.

(Kuantum) Ansatz: Fungsi gelombang percubaan (Cara membina keadaan kuantum percubaan dengan Circuit kuantum)

Untuk VQE, ansatz (jamak: ansätze) terdiri daripada dua komponen utama. Yang pertama ialah penyediaan keadaan awal, yang menetapkan keadaan Qubit dengan menggunakan Gate kuantum tanpa parameter variatif. Komponen kedua ialah Circuit kuantum berparameter, sebuah Circuit kuantum khas dengan parameter boleh laras, sama seperti tombol pada radio. Parameter-parameter ini akan digunakan untuk bahagian terakhir — pengoptimum klasik — untuk membantu kita mencapai keadaan asas terbaik yang mungkin.

Dalam bahagian prinsip variatif, kita telah belajar bahawa kualiti keadaan percubaan mempengaruhi kualiti keputusan algoritma variatif. Ini bermakna memilih ansatz yang baik adalah penting dalam VQE. Sekali lagi, ini adalah topik yang kaya dan kompleks. Kita tidak akan membincangkan jenis-jenis ansatz yang berbeza atau asal-usulnya di sini. Jika anda berminat untuk mengetahui lebih lanjut tentang Circuit kuantum berparameter dan ansatz, anda boleh meneroka pelajaran Ansatz dan bentuk variatif daripada kursus Reka bentuk algoritma variatif, yang memberikan penjelasan dan contoh terperinci tentang ansätze.

Oleh kerana kita akan menggunakan Hamiltonian satu-Qubit dalam modul ini, kita perlukan Circuit kuantum berparameter satu-Qubit sebagai ansatz. Kita akan melihat tiga jenis ansätze satu-Qubit dalam bahagian berikut. Kita akan membandingkannya dan membincangkan pertimbangan utama dalam memilih ansatz.

(Klasik) Pengoptimum: menala halus Circuit kuantum

Setelah komputer kuantum mengukur tenaga observable daripada ansatz, parameter ansatz dan nilai tenaga dihantar kepada pengoptimum klasik untuk penalaan. Proses pengoptimuman ini dilakukan pada komputer klasik, biasanya menggunakan pakej saintifik tujuan umum seperti SciPy.

Pengoptimum klasik memperlakukan tenaga yang diukur sebagai fungsi kos. Dalam masalah pengoptimuman, fungsi kos (kadangkala dipanggil fungsi objektif) ialah fungsi matematik yang mengukur seberapa "baik" penyelesaian tertentu. Matlamat pengoptimum adalah untuk mencari set parameter yang meminimumkan fungsi kos ini. Dalam konteks mencari tenaga keadaan asas molekul, tenaga itu sendiri berfungsi sebagai fungsi kos — kita ingin mencari parameter untuk Circuit kuantum kita ("penyelesaian" kita) yang menghasilkan tenaga serendah mungkin. Pengoptimum klasik menggunakan nilai tenaga yang diukur ini (kos) dan menentukan set parameter yang dioptimumkan seterusnya untuk ansatz kuantum. Parameter-parameter yang dikemas kini ini kemudian dihantar kembali ke Circuit kuantum, dan proses diulang. Dengan setiap lelaran, pengoptimum klasik menyesuaikan parameter untuk cuba mengurangkan tenaga (meminimumkan fungsi kos) sehingga kriteria penumpuan yang ditetapkan dipenuhi, secara ideal memastikan bahawa tenaga terendah yang mungkin (sepadan dengan keadaan asas molekul bagi jarak ikatan dan set asas tersebut) ditemui.

Terdapat banyak strategi pengoptimuman yang disediakan oleh pakej saintifik seperti SciPy. Anda boleh mendapatkan lebih lanjut dalam pelajaran Gelung pengoptimuman bagi kursus Reka bentuk algoritma variatif. Di sini kita akan menggunakan COBYLA (Constrained Optimization BY Linear Approximations), algoritma pengoptimuman yang sesuai untuk landskap tenaga yang rumit. Khususnya, COBYLA tidak cuba mengira kecerunan fungsi yang dikaji; ini dipanggil pengoptimum bebas kecerunan. Bayangkan anda cuba mencari puncak tertinggi dalam banjaran gunung dengan mata tertutup. Oleh kerana anda tidak dapat melihat keseluruhan landskap, anda mengambil langkah kecil ke pelbagai arah, sambil memeriksa sama ada anda naik atau turun. COBYLA berfungsi dengan cara yang serupa — ia bergerak melalui ruang parameter, menguji nilai yang berbeza, secara beransur-ansur memperbaiki keputusan sehingga menemui yang terbaik.

Kini anda bersedia untuk menjalankan pengiraan VQE. Untuk itu, cuba soalan daftar masuk di bawah, yang merumuskan keseluruhan proses.

Semak kefahaman anda

Isikan tempat kosong dengan istilah yang betul untuk melengkapkan ringkasan proses VQE.

VQE ialah algoritma kuantum variatif, yang menggabungkan kuasa (1) ________ dan pengkomputeran klasik, digunakan untuk mencari (2) __________ molekul. Proses bermula dengan mendefinisikan (3) __________, yang mewakili jumlah tenaga sistem dan bertindak sebagai observable dalam pengukuran kuantum. Seterusnya, kita menyediakan (4) __________, sebuah Circuit kuantum dengan parameter boleh laras yang mewakili fungsi gelombang percubaan molekul. Parameter-parameter ini dioptimumkan menggunakan (5) __________, algoritma klasik yang menyesuaikan parameter secara berulang untuk meminimumkan tenaga yang diukur. Dalam perbincangan di atas kita menggunakan pengoptimum (6) __________, yang memperhalusi parameter ansatz tanpa memerlukan pengiraan terbitan. Proses berterusan sehingga kita mencapai (7) __________, bermakna kita telah menemui tenaga terendah yang mungkin bagi molekul.

Bank Kata:

  • pengoptimum klasik
  • tenaga keadaan asas
  • cekap perkakasan
  • ansatz
  • Hamiltonian molekul
  • COBYLA
  • pengkomputeran kuantum
  • penumpuan

Jawapan:

1 → pengkomputeran kuantum

2 → tenaga keadaan asas

3 → Hamiltonian molekul

4 → ansatz

5 → pengoptimum klasik

6 → COBYLA

7 → penumpuan

Kira tenaga keadaan asas atom hidrogen dengan VQE

Sekarang, mari gunakan apa yang telah kita pelajari untuk mengira tenaga keadaan asas atom hidrogen. Sepanjang modul ini, kita akan menggunakan rangka kerja untuk pengkomputeran kuantum yang dikenali sebagai "corak Qiskit", yang membahagikan aliran kerja kepada langkah-langkah berikut:

  • Langkah 1: Petakan input klasik kepada masalah kuantum
  • Langkah 2: Optimumkan masalah untuk pelaksanaan kuantum
  • Langkah 3: Jalankan menggunakan primitif Qiskit Runtime
  • Langkah 4: Pasca-pemprosesan dan analisis klasik

Corak Qiskit

Kita akan mengikuti langkah-langkah ini secara umum.

Mari mulakan dengan memuatkan beberapa pakej yang diperlukan, termasuk primitif Qiskit Runtime. Kita juga akan memilih komputer kuantum yang paling tidak sibuk yang tersedia untuk kita.

Terdapat kod di bawah untuk menyimpan kelayakan anda pada penggunaan pertama. Pastikan anda memadam maklumat ini daripada notebook selepas menyimpannya ke persekitaran anda, supaya kelayakan anda tidak dikongsi secara tidak sengaja apabila anda berkongsi notebook. Lihat Sediakan akaun IBM Cloud anda dan Mulakan perkhidmatan dalam persekitaran tidak dipercayai untuk panduan lanjut.

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load the Runtime primitive and session
from qiskit_ibm_runtime import EstimatorV2 as Estimator

# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')

# Load saved credentials
service = QiskitRuntimeService()

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_brisbane

Sel di bawah akan membolehkan anda bertukar antara menggunakan simulator atau perkakasan sebenar sepanjang notebook. Kami mengesyorkan menjalankannya sekarang:

# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

# Alternatively, load a fake backend with generic properties and define a simulator.

noise_model = NoiseModel.from_backend(backend)

# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)

Langkah 1: Petakan masalah kepada Circuit dan operator kuantum

Kita memulakan pengiraan VQE dengan mendefinisikan Hamiltonian untuk molekul hidrogen (H2H_2) pada jarak ikatan tertentu. Hamiltonian ini mewakili jumlah tenaga sistem dalam sebutan operator Qubit, telah dihasilkan dan dipetakan daripada sistem molekul menggunakan prosedur standard: 1) menggunakan set asas STO-6G (koleksi fungsi matematik tertentu yang digunakan untuk menghampiri orbital elektron), 2) menggunakan pemetaan Jordan-Wigner (teknik untuk menterjemahkan operator fermionik yang menggambarkan elektron kepada operator Qubit), dan 3) melakukan pengurangan Qubit menggunakan simetri Hamiltonian untuk memudahkan masalah.

Seperti yang telah kita terangkan sebelumnya, tenaga keadaan asas yang dikira sangat bergantung pada pemilihan set asas dan geometri molekul (seperti jarak ikatan). Untuk konfigurasi khusus ini dan selepas transformasi-transformasi ini, Hamiltonian Qubit yang terhasil adalah mudah:

H^=0.2355I+0.2355Z\hat{H} = -0.2355 I + 0.2355 Z

Di sini, II mewakili operator identiti dan ZZ mewakili operator Pauli-Z, bertindak pada satu Qubit. Pekali-pekali diterbitkan daripada kamiran yang dikira menggunakan set asas STO-6G pada jarak ikatan tertentu ini dengan transformasi yang betul.

Dengan Hamiltonian ini ditakrifkan, kita kini boleh menggunakan VQE untuk mengira tenaga keadaan asasnya. Adalah berguna untuk membandingkan tenaga keadaan asas yang dikira dengan nilai yang dijangkakan. Untuk satu atom hidrogen (H) yang terpencil, tenaga keadaan asas adalah tepat -0.5 Hartree (tanpa kesan relativistik). Mari kita kira tenaga keadaan asas tepat bagi Hamiltonian Qubit khusus kita seperti yang ditakrifkan di atas dan bandingkan dengan nilai yang diketahui yang relevan.

from qiskit.quantum_info import SparsePauliOp
import numpy as np

# Qubit Hamiltonian of the hydrogen atom generated by using STO-3G basis set and parity mapping
Hamiltonian = SparsePauliOp.from_list([("I", -0.2355), ("Z", 0.2355)])

# exact ground state energy of Hamiltonian

A = np.array(Hamiltonian)
eigenvalues, eigenvectors = np.linalg.eig(A)
print(
"The exact ground state energy of the Hamiltonian is ",
min(eigenvalues).real,
"hartree",
)
h = min(eigenvalues.real)
The exact ground state energy of the Hamiltonian is  -0.471 hartree

Seterusnya, kita perlukan Circuit kuantum berparameter, sebuah ansatz, untuk menyediakan fungsi gelombang percubaan Ψtrial\Psi_\text{trial} bagi keadaan asas. Matlamatnya adalah untuk mencari parameter θ\theta yang meminimumkan nilai jangkaan tenaga ψ(θ)H^ψ(θ)\langle\psi(\theta)|\hat{H}|\psi(\theta)\rangle. Pilihan ansatz adalah sangat penting kerana ia menentukan set keadaan kuantum yang mungkin boleh disediakan oleh Circuit kita. Ansatz yang "baik" ialah yang cukup fleksibel untuk mewakili keadaan yang sangat hampir dengan keadaan asas sebenar Hamiltonian yang kita kaji, tetapi tidak terlalu kompleks sehingga memerlukan terlalu banyak parameter atau Circuit yang terlalu dalam untuk komputer kuantum semasa.

Di sini, kita akan mencuba tiga ansätze satu-Qubit yang berbeza untuk melihat mana yang memberikan "liputan" yang lebih baik terhadap keadaan kuantum yang mungkin boleh dimiliki oleh satu Qubit. "Liputan" merujuk kepada julat keadaan kuantum yang boleh dihasilkan oleh Circuit ansatz dengan mengubah parameternya.

Kita akan menggunakan tiga ansätze berdasarkan kombinasi Gate putaran satu-Qubit yang berbeza:

  • Ansatz Gate putaran 1-paksi: Ansatz ini menggunakan putaran hanya sekitar satu paksi tunggal (Rx(θ)R_x(\theta)). Pada sfera Bloch, ini sepadan dengan bergerak hanya di sepanjang bulatan tertentu. Ini adalah yang paling kurang fleksibel dan merangkumi set keadaan yang terhad.
  • Dua ansätze Gate putaran 2-paksi: Ansätze ini menggabungkan putaran sekitar dua paksi berbeza (Rx(θ1)Rz(θ2)R_x(\theta_1) R_z(\theta_2) dan Rx(θ1)Rz(θ2)Rx(θ3)R_x(\theta_1) R_z(\theta_2) R_x(\theta_3)). Ini membolehkan kita mencapai bahagian sfera Bloch yang lebih besar, berbanding dengan putaran satu paksi.

Dengan membandingkan keputusan VQE yang diperoleh dengan tiga ansätze ini, kita dapat melihat bagaimana fleksibiliti dan liputan ruang keadaan ansatz mempengaruhi keupayaan kita untuk mencari tenaga keadaan asas sebenar Hamiltonian yang dipermudahkan. Ansatz yang lebih fleksibel berpotensi untuk mencari penghampiran yang lebih baik, tetapi ia mungkin juga lebih sukar untuk pengoptimum klasik.

from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.quantum_info import Statevector, DensityMatrix, Pauli

theta = Parameter("θ")
phi = Parameter("φ")
lam = Parameter("λ")

ansatz1 = QuantumCircuit(1)
ansatz1.rx(theta, 0)

ansatz2 = QuantumCircuit(1)
ansatz2.rx(theta, 0)
ansatz2.rz(phi, 0)

ansatz3 = QuantumCircuit(1)
ansatz3.rx(theta, 0)
ansatz3.rz(phi, 0)
ansatz3.rx(lam, 0)
<qiskit.circuit.instructionset.InstructionSet at 0x1059def80>

Sekarang, mari jana 5000 nombor rawak untuk setiap parameter dan plot taburan keadaan kuantum rawak, yang dijana oleh tiga ansätze dengan parameter rawak ini. Anda boleh fikirkan parameter-parameter ini seperti putaran sekitar paksi berbeza pada permukaan sfera. Untuk melihat taburan keadaan kuantum, kita akan menggunakan Sfera Bloch, sfera tiga dimensi yang menunjukkan keadaan satu Qubit. Mana-mana titik pada sfera mewakili keadaan Qubit yang mungkin, di mana kutub utara dan selatan adalah seperti "0" dan "1" klasik, tetapi Qubit juga boleh berada di mana-mana antaranya, menunjukkan sifat kuantum khas seperti superposisi. Mula-mula, sediakan fungsi yang diperlukan untuk memplot sfera Bloch 3D dan sediakan 5000 parameter rawak.

import matplotlib.pyplot as plt

def plot_bloch(bloch_vectors):
# Extract X, Y, Z coordinates for 3D projection
X_coords = bloch_vectors[:, 0]
Z_coords = bloch_vectors[:, 2]

# Compute Y coordinates from X and Z to approximate the full Bloch sphere projection
Y_coords = bloch_vectors[:, 1]

# Create 3D plot
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection="3d")
ax.scatter(X_coords, Y_coords, Z_coords, color="blue", alpha=0.6)

# Labels and title
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
ax.set_title("Parameterized 1-Qubit Circuit on 3D Bloch Sphere")

# Set axis limits and make them equal
ax.set_xlim([-1, 1])
ax.set_ylim([-1, 1])
ax.set_zlim([-1, 1])

# Ensure equal aspect ratio for all axes
ax.set_box_aspect([1, 1, 1]) # Equal scaling for x, y, z axes

# Show grid
ax.grid(True)

plt.show()

num_samples = 5000 # Number of random states
theta_vals = np.random.uniform(0, 2 * np.pi, num_samples)
phi_vals = np.random.uniform(0, 2 * np.pi, num_samples)
lam_vals = np.random.uniform(0, 2 * np.pi, num_samples)

Mari lihat bagaimana ansatz pertama kita berfungsi.

# List to store Bloch Sphere XZ coordinates
bloch_vectors = []

# Generate quantum states and extract Bloch vectors
for i in range(num_samples):
# Create a circuit and bind parameters
qc = ansatz1
bound_qc = qc.assign_parameters({theta: theta_vals[i]}) # , lam: lam_vals[i]})
state = Statevector.from_instruction(bound_qc)
rho = DensityMatrix(state)

X = rho.expectation_value(Pauli("X")).real
Y = rho.expectation_value(Pauli("Y")).real
Z = rho.expectation_value(Pauli("Z")).real
bloch_vectors.append([X, Y, Z]) # Store X, Z components

# Convert to a numpy array for plotting
bloch_vectors = np.array(bloch_vectors)

plot_bloch(bloch_vectors)

Output of the previous code cell

Kita dapat melihat ansatz pertama kita mengembalikan keadaan kuantum yang bertaburan dalam bentuk cincin pada sfera Bloch. Ini masuk akal, kerana kita hanya memberikan ansatz satu parameter putaran. Ia oleh itu hanya boleh menghasilkan keadaan yang diputarkan sekitar satu paksi. Bermula dari titik (0,0,1)(0,0,1) dan memutar sekitar satu paksi akan sentiasa menghasilkan sebuah cincin. Kemudian mari kita semak ansatz kedua kita, yang mempunyai dua Gate putaran ortogon - Rx dan Rz.

bloch_vectors = []

# Generate quantum states and extract Bloch vectors
for i in range(num_samples):
# Create circuit and bind parameters
qc = ansatz2
bound_qc = qc.assign_parameters(
{theta: theta_vals[i], phi: phi_vals[i]}
) # , lam: lam_vals[i]})
state = Statevector.from_instruction(bound_qc)
rho = DensityMatrix(state)

X = rho.expectation_value(Pauli("X")).real
Y = rho.expectation_value(Pauli("Y")).real
Z = rho.expectation_value(Pauli("Z")).real
bloch_vectors.append([X, Y, Z]) # Store X, Z components

# Convert to numpy array for plotting
bloch_vectors = np.array(bloch_vectors)

plot_bloch(bloch_vectors)

Output of the previous code cell

Di sini, kita dapat melihat bahawa ansatz kedua kita merangkumi bahagian yang lebih besar daripada sfera Bloch - tetapi perhatikan bahawa titik-titik lebih tertumpu sekitar kutub dan lebih tersebar sekitar khatulistiwa. Sekarang tiba masanya untuk menyemak ansatz terakhir kita.

bloch_vectors = []

# Generate quantum states and extract Bloch vectors
for i in range(num_samples):
# Create circuit and bind parameters
qc = ansatz3
bound_qc = qc.assign_parameters(
{theta: theta_vals[i], phi: phi_vals[i], lam: lam_vals[i]}
)
state = Statevector.from_instruction(bound_qc)
rho = DensityMatrix(state)

X = rho.expectation_value(Pauli("X")).real
Y = rho.expectation_value(Pauli("Y")).real
Z = rho.expectation_value(Pauli("Z")).real
bloch_vectors.append([X, Y, Z]) # Store X, Z components

# Convert to numpy array for plotting
bloch_vectors = np.array(bloch_vectors)

plot_bloch(bloch_vectors)

Output of the previous code cell

Di sini anda dapat melihat keadaan kuantum yang lebih sekata dihasilkan oleh ansatz terakhir kita.

Seperti yang disebutkan, perkara terbaik yang perlu dilakukan ialah mendapatkan pengetahuan tentang keadaan asas yang anda cari dan menggunakan ansatz yang sesuai untuk meneroka keadaan yang hampir dengan keadaan asas tersebut. Contohnya, jika kita tahu keadaan asas kita adalah berhampiran kutub, kita mungkin memilih ansatz 2. Untuk kesederhanaan, kita akan kekal dengan ansatz 3, yang meneroka keseluruhan sfera Bloch secara sekata.

Sekarang kita telah memilih ansatz kita, mari lukis Circuit.

# Pre-defined ansatz circuit and operator class for Hamiltonian

ansatz = ansatz3

num_params = ansatz.num_parameters
print("This circuit has ", num_params, "parameters")

ansatz.draw("mpl", style="iqp")
This circuit has  3 parameters

Output of the previous code cell

Langkah 2: Optimumkan untuk perkakasan sasaran

Apabila menjalankan pengiraan pada komputer kuantum sebenar, kita bukan sahaja mengambil berat tentang logik Circuit kuantum. Kita juga mengambil berat tentang perkara-perkara seperti operasi apa yang boleh dilakukan oleh komputer kuantum tertentu itu, dan di mana pada komputer kuantum itu Qubit yang kita gunakan berada. Adakah mereka bersebelahan antara satu sama lain? Adakah mereka berjauhan? Oleh itu, langkah seterusnya adalah untuk menulis semula Circuit kita menggunakan Gate yang semula jadi untuk komputer kuantum yang akan kita gunakan, dan dengan mengambil kira susun atur Qubit. Ini boleh dilakukan dengan transpilasi - selepas proses ini, anda dapat melihat ansatz mudah kita ditukar kepada set Gate yang berbeza, dan Qubit abstrak kita akan dipetakan ke dalam Qubit fizikal pada komputer kuantum sebenar.

from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

config = backend.configuration()

print("Backend: {config.backend_name}")
print("Native gates: ", config.supported_instructions, ",")

target = backend.target

pm = generate_preset_pass_manager(target=target, optimization_level=3)

ansatz_isa = pm.run(ansatz)

ansatz_isa.draw(output="mpl", idle_wires=False, style="iqp")
Backend: {config.backend_name}
Native gates: ['ecr', 'id', 'delay', 'measure', 'reset', 'rz', 'sx', 'x'] ,

Output of the previous code cell

Anda dapat melihat Gate rx, rz ansatz kita telah ditukar kepada siri Gate rz, sx, yang merupakan Gate asli Backend kita. Juga, anda dapat melihat q0 kita kini dipetakan ke dalam Qubit fizikal kelima. Kita juga perlu memetakan Hamiltonian kita mengikut perubahan-perubahan ini, seperti dalam kod berikut:

Hamiltonian_isa = Hamiltonian.apply_layout(layout=ansatz_isa.layout)

Langkah 3: Jalankan pada perkakasan sasaran

Kini tiba masanya untuk menjalankan VQE kita pada QPU sebenar. Untuk ini, pertama kita perlukan fungsi kos untuk proses pengoptimuman, yang menilai nilai jangkaan Hamiltonian dengan keadaan kuantum, yang dihasilkan oleh ansatz. Jangan risau! Anda tidak perlu mengekod semuanya sendiri. Kami telah menyediakan fungsi untuk ini, dan yang perlu anda lakukan hanyalah menjalankan sel di bawah.

def cost_func(params, ansatz, hamiltonian, estimator):
"""Return estimate of energy from estimator

Parameters:
params (ndarray): Array of ansatz parameters
ansatz (QuantumCircuit): Parameterized ansatz circuit
hamiltonian (SparsePauliOp): Operator representation of Hamiltonian
estimator (EstimatorV2): Estimator primitive instance
cost_history_dict: Dictionary for storing intermediate results

Returns:
float: Energy estimate
"""
pub = (ansatz, [hamiltonian], [params])
result = estimator.run(pubs=[pub]).result()
energy = result[0].data.evs[0]

cost_history_dict["iters"] += 1
cost_history_dict["prev_vector"] = params
cost_history_dict["cost_history"].append(energy)
print(f"Iters. done: {cost_history_dict['iters']} [Current cost: {energy}]")

return energy

Akhirnya, kita sediakan parameter awal untuk ansatz kita dan proses pengoptimumnya. Anda boleh menggunakan semua sifar atau nilai rawak. Kami telah memilih parameter awal di bawah, tetapi anda bebas untuk mengulas atau menyahulas baris dalam sel untuk mengambil sampel parameter secara rawak, seragam dari 0 hingga 2π2\pi.

# x0 = np.random.uniform(0, 2*pi, 3)
x0 = [1, 1, 0]
# QPU Est. 2min for ibm_brisbane

from scipy.optimize import minimize
from qiskit_ibm_runtime import Batch

batch = Batch(backend=backend)

cost_history_dict = {
"prev_vector": None,
"iters": 0,
"cost_history": [],
}
estimator = Estimator(mode=batch)
estimator.options.default_shots = 10000

res = minimize(
cost_func,
x0,
args=(ansatz_isa, Hamiltonian_isa, estimator),
method="cobyla",
options={"maxiter": 10, "tol": 0.01},
)

batch.close()
Iters. done: 1 [Current cost: -0.3361517318448143]
Iters. done: 2 [Current cost: -0.4682546422099432]
Iters. done: 3 [Current cost: -0.38985802144149584]
Iters. done: 4 [Current cost: -0.38319217316749354]
Iters. done: 5 [Current cost: -0.4628720756579032]
Iters. done: 6 [Current cost: -0.4683301936226905]
Iters. done: 7 [Current cost: -0.45480498699294747]
Iters. done: 8 [Current cost: -0.4690533242050814]
Iters. done: 9 [Current cost: -0.465867415110354]
Iters. done: 10 [Current cost: -0.4606882723137227]
h_vqe = res.fun
print("The reference ground state energy is ", min(eigenvalues))
print("The computed ground state energy is ", h_vqe)
The reference ground state energy is  (-0.471+0j)
The computed ground state energy is -0.4690533242050814

Tahniah! Anda baru sahaja berjaya menamatkan eksperimen kimia kuantum pertama anda. Kita dapat melihat perbezaan antara tenaga keadaan asas tepat Hamiltonian dan milik kita, tetapi kerana kita menggunakan teknik pengurangan ralat lalai (yang membetulkan ralat bacaan), perbezaannya adalah kecil. Ini adalah permulaan yang sangat baik!

Nota: Anda boleh mendapatkan keputusan yang lebih baik dengan menetapkan tahap pengurangan ralat menggunakan resilience_level. Nilai lalai ialah 1, dan jika anda menetapkan nilai yang lebih tinggi, ia akan menggunakan lebih banyak masa QPU tetapi mungkin mengembalikan keputusan yang lebih baik.

Langkah 4: Pasca-pemprosesan

Tiba masanya untuk melihat bagaimana pengoptimum klasik kita berfungsi. Jalankan sel di bawah dan lihat corak penumpuan.

fig, ax = plt.subplots()
x = np.linspace(0, 10, 10)

# Define the constant function
y_constant = np.full_like(x, h)
ax.plot(
range(cost_history_dict["iters"]), cost_history_dict["cost_history"], label="VQE"
)
ax.set_xlabel("Iterations")
ax.set_ylabel("Cost (Hartree)")
ax.plot(y_constant, label="Target")
plt.legend()
plt.draw()

Output of the previous code cell

Kita bermula dengan nilai awal yang agak baik, sehingga kita mendapatkan nilai akhir yang baik hanya dalam 10 langkah. Anda dapat melihat puncak besar dan kecil, dan ini adalah ciri tipikal pengoptimum COBYLA - ia meneroka ruang seolah-olah ia tidak dapat melihat landskap dan menyesuaikan saiz langkah dengan setiap pengukuran.

Semak kefahaman anda

Apakah pemerhatian anda? Bahagian mana daripada proses di atas yang boleh diperbaiki untuk mendapatkan keputusan yang lebih hampir dengan nilai teori, atau lebih hampir dengan tenaga keadaan asas tepat Hamiltonian? Apakah beberapa perkara yang perlu dipertimbangkan untuk ini?

Jawapan:

Perkara pertama yang perlu dipertimbangkan ialah perubahan dalam set asas yang digunakan dalam mengira Hamiltonian molekul. Seperti yang disebutkan sebelumnya, tenaga keadaan asas atom H ialah -0.5 Hartree, seperti yang telah diketahui, dan set asas STO-6G yang telah kita pilih tidak mencukupi untuk memperoleh nilai ini secara tepat.

Memilih jenis asas yang lebih kompleks meningkatkan bilangan Qubit yang digunakan oleh Hamiltonian; oleh itu, kita perlu memilih ansatz yang lebih kompleks dan sesuai untuk masalah kimia.

Yang seterusnya untuk dioptimumkan ialah pengurusan hingar dalam QPU. Teknik pengurangan ralat yang lebih canggih menghasilkan keputusan yang lebih baik tetapi mungkin mengambil masa yang lebih lama untuk digunakan. Juga, pertimbangkan bagaimana shot_number mempengaruhi keputusan.

Akhirnya, prestasi penumpuan yang lebih baik juga boleh dicapai dengan mencuba pengoptimum yang berbeza.

Kira tenaga keadaan asas molekul hidrogen dengan VQE

Sekarang setelah kita melihat keseluruhan proses VQE menggunakan atom HH, kita akan mengira tenaga keadaan asas molekul H2H_2 dengan lebih cepat.

Langkah 1: Petakan masalah kepada litar kuantum dan operator

Di sini kami juga memberikan kamu Hamiltonian satu qubit yang menggunakan asas STO-6G dan transformasi Jordan-Wigner, dengan pengurangan qubit menggunakan simetri Hamiltonian. Perhatikan bahawa kami menggunakan jarak antom antara dua atom hidrogen sebesar 0.735 A˚\mathring A.

Tidak seperti pengiraan satu atom hidrogen (HH), untuk mengira keadaan asas molekul hidrogen (H2H_2), kita juga perlu mengambil kira daya tolakan antara nukleus dua atom hidrogen, di samping tenaga yang berkaitan dengan orbital elektronik. Dalam langkah ini, kami akan memberikan nilai ini sebagai pemalar, dan kita akan mengira nilai ini secara sebenar dalam soalan semak masuk. H^=1.04886I+0.79674Z+0.18122X\hat{H} = -1.04886 I + -0.79674 Z + 0.18122 X

h2_hamiltonian = SparsePauliOp.from_list(
[("I", -1.04886087), ("Z", -0.7967368), ("X", 0.18121804)]
)

# exact ground state energy of hamiltonian
nuclear_repulsion = 0.71997
A = np.array(h2_hamiltonian)
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Electronic ground state energy (Hartree): ", min(eigenvalues).real)
print("Nuclear repulsion energy (Hartree): ", nuclear_repulsion)
print(
"Total ground state energy (Hartree): ", min(eigenvalues).real + nuclear_repulsion
)
h2 = min(eigenvalues).real + nuclear_repulsion
Electronic ground state energy (Hartree):  -1.8659468547627318
Nuclear repulsion energy (Hartree): 0.71997
Total ground state energy (Hartree): -1.1459768547627318

Langkah 2: Optimumkan untuk perkakasan sasaran

Memandangkan bilangan qubit yang digunakan oleh VQE dan Hamiltonian sebelum ini adalah sama dengan backend yang akan digunakan untuk pelaksanaan, kita akan menggunakan ansatz sedia ada beserta bentuk yang telah dioptimumkan.

h2_hamiltonian_isa = h2_hamiltonian.apply_layout(layout=ansatz_isa.layout)

Langkah 3: Jalankan pada perkakasan sasaran

Kini tiba masanya untuk melakukan pengiraan pada QPU sebenar. Hampir semuanya sama, tetapi kita akan menggunakan titik awal yang sesuai untuk menyesuaikan Hamiltonian. Selain itu, pada bahagian berulang, beberapa tetapan Estimator, yang digunakan untuk mengira jangkaan Hamiltonian bagi ansatz dalam QPU, akan ditetapkan sedikit berbeza daripada pengiraan sebelumnya. Kita akan membincangkan perubahan ini dengan lebih lanjut dalam soalan semak masuk.

x0 = [2, 0, 0]
# QPU time 4min for ibm_brisbane
batch = Batch(backend=backend)

cost_history_dict = {
"prev_vector": None,
"iters": 0,
"cost_history": [],
}
estimator = Estimator(mode=batch)
estimator.options.default_shots = 10000

res = minimize(
cost_func,
x0,
args=(ansatz_isa, h2_hamiltonian_isa, estimator),
method="cobyla",
options={"maxiter": 15},
)

batch.close()
Iters. done: 1 [Current cost: -0.710621837568328]
Iters. done: 2 [Current cost: -0.2603208441168329]
Iters. done: 3 [Current cost: -0.25548711201326424]
Iters. done: 4 [Current cost: -0.581129450619904]
Iters. done: 5 [Current cost: -1.722920997605439]
Iters. done: 6 [Current cost: -1.6633324849371915]
Iters. done: 7 [Current cost: -1.8066989598929164]
Iters. done: 8 [Current cost: -1.8051093803839542]
Iters. done: 9 [Current cost: -1.802692217571555]
Iters. done: 10 [Current cost: -1.8233585485263144]
Iters. done: 11 [Current cost: -1.6904116652617205]
Iters. done: 12 [Current cost: -1.8245120321245392]
Iters. done: 13 [Current cost: -1.6837021361383608]
Iters. done: 14 [Current cost: -1.8166632606115467]
Iters. done: 15 [Current cost: -1.863446212658907]
h2_vqe = res.fun + nuclear_repulsion
print(
"The reference ground state energy is ", min(eigenvalues).real + nuclear_repulsion
)
print("The computed ground state energy is ", h2_vqe)
The reference ground state energy is  -1.1459768547627318
The computed ground state energy is -1.143476212658907

Walaupun VQE secara teorinya memberikan batas atas kepada tenaga keadaan asas sebenar, pelaksanaan praktikal pada perkakasan kuantum sebenar atau simulasi berhingar, serta penghampiran yang dibuat dalam menyediakan Hamiltonian (seperti set asas atau pengurangan qubit), boleh memperkenalkan ralat yang kadang-kadang menghasilkan tenaga terukur yang sedikit lebih rendah daripada nilai teori tepat atau nilai rujukan numerik tertentu. Walaupun terdapat beberapa ralat, hasilnya kelihatan memuaskan, terutama memandangkan bilangan langkah yang kecil. Sekarang, mari kita selesaikan pengiraan VQE ini dengan melihat bagaimana pengoptimum berfungsi.

Langkah 4: Pasca-proses

fig, ax = plt.subplots()
x = np.linspace(0, 5, 15)

# Define the constant function
y_constant = np.full_like(x, min(eigenvalues))
ax.plot(
range(cost_history_dict["iters"]), cost_history_dict["cost_history"], label="VQE"
)
ax.set_xlabel("Iterations")
ax.set_ylabel("Cost (Hartree)")
ax.plot(y_constant, label="Target")
plt.legend()
plt.draw()

Output of the previous code cell

Semak kefahaman kamu

Mari kita kira tenaga tolakan nukleus molekul H2H_2, yang kita masukkan sebagai nilai pemalar (0.71997 Hartree).

H2 molecule

Sila gunakan hukum Coulomb dan guna unit atomik untuk memastikan kamu mendapat nilai dalam Hartree.

Jawapan:

Memandangkan kedua-dua nukleus hidrogen bercas positif, mereka saling tolak-menolak disebabkan daya elektrostatik. Tolakan ini diterangkan oleh hukum Coulomb:

Erepulsive=e24πϵ0RE_{repulsive} = \frac{e^2}{4\pi\epsilon_0R},

di mana ee ialah cas proton, ϵ0\epsilon_0 ialah ketelusan vakum, dan RR ialah jarak antara dua nukleus, diukur dalam meter atau jejari Bohr dalam unit joule(J).

Untuk mengira tenaga ini dalam Hartree, kita perlu menukar persamaan di atas ke dalam sistem Unit Atomik (AU). Dalam AU, e2=1e^2 = 1, 4πϵ0=14\pi\epsilon_0=1 dan jejari Bohr (a0a_0) adalah 1 dan menjadi skala panjang asas dalam AU. Dengan penyederhanaan ini, hukum Coulomb menjadi:

Erepulsion=1RE_{repulsion} = \frac{1}{R},

di mana RR mesti diukur dalam jejari Bohr (a0a_0).

Untuk menukar pemisahan nukleus yang diberikan dalam A˚\r{A} kepada a0a_0, kita perlukan hubungan penukaran ini:

1A˚=1.88973a01\r{A} = 1.88973 a_0

jadi 0.735A˚0.735\r{A} menjadi 0.7351.88973=1.38895a00.735 * 1.88973 = 1.38895 a_0.

Oleh itu, tenaga tolakan nukleus bagi H2H_2 yang diberikan ialah

Erepulsion=1R=11.38895=0.71997HartreeE_{repulsion} = \frac{1}{R} = \frac{1}{1.38895} = 0.71997 Hartree

Kira tenaga tindak balas H+H=H2H + H = H_2

Sekarang mari gunakan apa yang kita perolehi! Kamu telah menggunakan VQE, penyelesai eigen kuantum variasi, untuk mengira tenaga keadaan asas atom HH dan molekul H2H_2. Yang tinggal ialah menggunakan nilai yang dikira untuk mendapatkan tenaga tindak balas proses H+H=H2H+H=H_2.

Tenaga tindak balas ialah perubahan tenaga yang berlaku apabila bahan-bahan bertindak balas untuk membentuk bahan baru. Bayangkan kamu sedang membina sesuatu: kadang-kadang kamu perlu memasukkan tenaga ke dalamnya (seperti menindih blok), dan kadang-kadang tenaga dilepaskan (seperti bola menggelinding ke bawah bukit). Dalam kimia, tindak balas sama ada menyerap tenaga (endotermik) atau melepaskan tenaga (eksotermik).

Tenaga tindak balas proses H+H=H2H+H = H_2 boleh dikira dengan formula berikut:

Ereaction=EH2(EH+EH)E_{reaction} = E_{H_2} - (E_H + E_H)

Dengan menjalankan sel di bawah, mari lihat ini secara visual. Di sini kita akan menggunakan nilai keadaan asas tepat bagi setiap Hamiltonian, dan kita akan membandingkan tenaga tindak balas penyelesaian tepat dan hasil VQE.

# Theoretical values
E_H_theo = h.real
E_H2_theo = h2

# Experimental values
E_H_exp = h_vqe
E_H2_exp = h2_vqe

# Calculate reaction energies
E_reaction_theo = E_H2_theo - (2 * E_H_theo)
E_reaction_exp = E_H2_exp - (2 * E_H_exp)

# Set up the plot
fig, ax = plt.subplots(figsize=(8, 6))
ax.set_xlim(0, 3)
ax.set_ylim(-1.16, -0.93) # Adjust y-axis range to highlight differences
ax.set_xticks([])
ax.set_ylabel("Energy (Hartree)")
ax.set_title("H + H → H₂ Reaction Energy Diagram")

# Plot theoretical energy levels
ax.hlines(
y=2 * E_H_theo, xmin=0.5, xmax=1.3, linewidth=2, color="r", label="2H (Exact)"
)
ax.hlines(y=E_H2_theo, xmin=1.3, xmax=2, linewidth=2, color="b", label="H₂ (Exact)")

# Plot experimental energy levels
ax.hlines(
y=2 * E_H_exp,
xmin=0.5,
xmax=1.5,
linewidth=2,
color="r",
linestyle="dashed",
label="2H (VQE)",
)
ax.hlines(
y=E_H2_exp,
xmin=1.5,
xmax=2.5,
linewidth=2,
color="b",
linestyle="dashed",
label="H₂ (VQE)",
)

# Add labels
ax.text(
1,
2 * E_H_theo,
f"2H: {2*E_H_theo:.4f}",
verticalalignment="top",
horizontalalignment="left",
)
ax.text(
2,
E_H2_theo,
f"H₂: {E_H2_theo:.4f}",
verticalalignment="top",
horizontalalignment="left",
)
ax.text(
1,
2 * E_H_exp,
f"2H_VQE: {2*E_H_exp:.4f}",
verticalalignment="bottom",
horizontalalignment="right",
)
ax.text(
2,
E_H2_exp,
f"H₂_VQE: {E_H2_exp:.4f}",
verticalalignment="bottom",
horizontalalignment="right",
)

# Add arrows for reaction energy with ΔE label in the middle
mid_y_theo = (2 * E_H_theo + E_H2_theo) / 2
mid_y_exp = (2 * E_H_exp + E_H2_exp) / 2
ax.annotate(
"",
xy=(1.3, E_H2_theo),
xytext=(1.3, 2 * E_H_theo),
arrowprops=dict(arrowstyle="<->", color="g"),
)
ax.text(
1.35, mid_y_theo, f"ΔE: {E_reaction_theo:.4f}", color="g", verticalalignment="top"
)

ax.annotate(
"",
xy=(1.5, E_H2_exp),
xytext=(1.5, 2 * E_H_exp),
arrowprops=dict(arrowstyle="<->", color="g", linestyle="dashed"),
)
ax.text(
1.55,
mid_y_exp,
f"ΔE_VQE: {E_reaction_exp:.4f}",
color="g",
verticalalignment="center",
)

# Add legend
ax.legend()

plt.show()

Output of the previous code cell

Seperti yang ditunjukkan dalam rajah, walaupun terdapat beberapa ralat, tenaga keadaan asas tepat Hamiltonian dan tenaga tindak balas yang dikira menggunakan hasil VQE adalah serupa, hampir -0.2 Hartree.

Perlu diperhatikan di sini bahawa tenaga tindak balas proses ini mempunyai nilai negatif, yang bermakna tenaga dilepaskan melalui proses tersebut, dan molekul yang terhasil mempunyai tenaga yang lebih rendah daripada dua atom tunggal. 6. Kesimpulan

Mari kita ringkaskan apa yang telah kita pelajari sejauh ini.

Kita mula-mula melihat dua teknik penghampiran penting yang diperlukan untuk menyelesaikan masalah kimia kuantum: prinsip variasi dan pilihan set asas, yang kedua-duanya adalah asas kepada VQE. Kita meneroka prinsip variasi secara manual, mengira tenaga keadaan asas pengayun harmonik mudah.

Seterusnya, kita meneroka VQE, algoritma yang banyak digunakan untuk mengira tenaga keadaan asas sistem kuantum. Kita menjalankan kod untuk mengira tenaga keadaan asas bagi hidrogen atom (HH) dan molekul hidrogen (H2H_2). Khususnya, kita belajar bahawa adalah perlu untuk mendapatkan Hamiltonian molekul yang sesuai bagi sistem tersebut dan mengubahnya kepada bentuk yang boleh dilaksanakan pada komputer kuantum. Kita juga melihat bahawa ansatz, Circuit kuantum berparameter, diperlukan untuk menyediakan keadaan kuantum percubaan dalam VQE, dan kita membincangkan kepentingan memilih struktur Circuit ansatz yang sesuai. Kita juga belajar bahawa VQE bergantung pada proses pengoptimuman berulang menggunakan komputer klasik, membimbing Circuit kuantum untuk mencari keadaan tenaga terendah, dan melihat bagaimana proses itu menumpu.

Akhirnya, kita menggunakan tenaga keadaan asas HH dan H2H_2 yang dikira melalui VQE untuk mengira tenaga tindak balas bagi proses H+HH2H + H \rightarrow H_2.

VQE adalah algoritma kuantum jangka pendek yang berkuasa, tetapi penting untuk menyedari hadnya. Prestasi VQE sangat bergantung kepada pilihan ansatz – mencari ansatz yang boleh disediakan dengan cekap yang boleh mewakili keadaan asas sebenar dengan tepat menjadi mencabar untuk molekul yang lebih besar dan lebih kompleks. Tambahan pula, perkakasan kuantum semasa mudah terdedah kepada hingar, yang boleh mempengaruhi ketepatan hasil VQE, terutamanya untuk Circuit yang lebih dalam atau bilangan qubit yang lebih besar. Walaupun menghadapi cabaran ini, VQE berfungsi sebagai algoritma asas, dan penyelidikan berterusan sedang meneroka kaedah variasi yang lebih canggih dan teknik mitigasi ralat untuk menolak sempadan apa yang mungkin dalam kimia kuantum pada komputer kuantum jangka pendek. Sebagai contoh, algoritma seperti Sample-based Quantum Diagonalization (SQD) sedang dibangunkan, yang memanfaatkan sampel yang diperoleh daripada Circuit kuantum digabungkan dengan pendiagonalan klasik dalam subruang untuk meningkatkan anggaran tenaga dan mengatasi beberapa batasan yang dihadapi oleh VQE, terutamanya berkaitan kecekapan pengukuran dan keteguhan terhadap hingar.

Ulasan dan soalan

Konsep penting:

  • Algoritma kuantum variatif ialah paradigma pengkomputeran di mana komputer klasik dan komputer kuantum bekerjasama untuk menyelesaikan sesuatu masalah.
  • Dalam VQE, kita bermula dengan Hamiltonian sistem kita dan memetakannya ke atas Qubit untuk dilaksanakan pada komputer kuantum. Kita memilih Circuit kuantum berparameter, iaitu ansatz, dan membuat pengukuran berulang dengan mengubah parameter ansatz, sehingga nilai tenaga terendah dicapai. Pencarian melalui ruang parameter dilakukan menggunakan pengoptimum klasik. Untuk mendapatkan hasil yang baik, perlu memilih ansatz yang baik dan pengoptimum yang sesuai.
  • Tenaga tindak balas ialah jumlah perubahan tenaga dalam tindak balas kimia, ditentukan oleh perbezaan antara tenaga reaktan dan produk.

Betul/salah

  1. Prinsip variatif menyatakan bahawa nilai jangkaan tenaga bagi sebarang fungsi gelombang percubaan sentiasa lebih besar daripada atau sama dengan tenaga keadaan dasar sebenar.
  2. Set asas ialah koleksi fungsi yang digunakan untuk menganggarkan fungsi gelombang kuantum.
  3. VQE ialah algoritma kuantum yang digunakan untuk menyelesaikan persamaan Schrödinger secara tepat bagi Hamiltonian yang diberikan.
  4. Dalam VQE, Circuit kuantum berparameter (ansatz) digunakan untuk menyediakan fungsi gelombang percubaan.
  5. Pilihan pengoptimum dalam VQE (contohnya, COBYLA, SPSA, atau ADAM) tidak mempengaruhi kualiti keputusan.
  6. Estimator Qiskit digunakan untuk mengira secara langsung nilai jangkaan Hamiltonian dalam VQE.

Soalan aneka pilihan:

  1. Apakah tujuan Hamiltonian dalam VQE?
  • A) Untuk menjana keadaan kuantum rawak
  • B) Untuk menentukan tenaga keadaan kuantum
  • C) Untuk mengoptimumkan Circuit kuantum
  • D) Untuk mewujudkan keterikatan
  1. Apakah objektif utama algoritma VQE?
  • A) Untuk mencari tenaga keadaan dasar suatu Hamiltonian
  • B) Untuk mewujudkan keterikatan antara Qubit
  • C) Untuk melaksanakan carian Grover
  • D) Untuk memecahkan penyulitan RSA
  1. Berapa banyak keadaan kuantum yang dijana dalam buku nota ini untuk membandingkan ansatz?
  • A) 100
  • B) 1000
  • C) 5000
  • D) 10,000
  1. Mengapa pengoptimum klasik diperlukan dalam VQE?
  • A) Untuk melaksanakan pengukuran kuantum
  • B) Mengemas kini parameter ansatz untuk meminimumkan tenaga
  • C) Untuk menyekat Qubit
  • D) Untuk menjana kerawakan kuantum
  1. Mengapa ansatz direka untuk berparameter?
  • A) Untuk membolehkan penyediaan keadaan kuantum
  • B) Untuk membolehkan ruang keadaan kuantum yang luas dicari
  • C) Untuk mengurangkan kerumitan Circuit
  • D) Untuk mengukur nilai eigen secara langsung
  1. Yang manakah pernyataan paling tepat tentang memilih ansatz yang baik?
  • A) Ansatz mesti menghasilkan keadaan yang diedarkan secara seragam pada sfera Bloch, atau ia akan gagal.
  • B) Ansatz perlu disesuaikan dengan sistem anda untuk memastikan ia boleh menjana keadaan yang hampir dengan keadaan dasar.
  • C) Ansatz perlu menghasilkan keadaan rawak menggunakan parameter variatifnya.
  • D) Ansatz yang lebih baik sentiasa mempunyai lebih banyak parameter variatif.

(Pilihan) Lampiran: Overhed pengoptimum mengikut kerumitan ansatz

VQE menghadapi beberapa cabaran yang sudah diketahui[ref 6], dan berikut adalah yang berkaitan dengan apa yang telah kita pelajari di atas.

  1. Cabaran pemilihan ansatz

Terdapat cabaran intrinsik dalam memilih ansatz variatif yang tepat. Ansatz berinspirasi kimia (seperti UCCSD) memberikan ketepatan fizikal tetapi memerlukan Circuit yang dalam, manakala ansatz cekap perkakasan mempunyai Circuit yang lebih cetek tetapi mungkin kurang interpretasi fizikal. Selain itu, banyak ansatz memperkenalkan parameter variatif berlebihan yang menyumbang sedikit kepada peningkatan ketepatan tetapi meningkatkan kesukaran pengoptimuman dengan ketara.

  1. Kesukaran pengoptimuman

Landskap pengoptimuman VQE boleh mempunyai kawasan di mana kecerunan hilang secara eksponen (barren plateaus), menjadikannya sukar bagi pengoptimum klasik untuk mengemas kini parameter variatif dengan cekap. Untuk ini, penyelidik telah mencuba menggunakan pelbagai jenis pengoptimum — berasaskan kecerunan dan tanpa kecerunan, tetapi kedua-duanya menghadapi cabaran. Pengoptimum berasaskan kecerunan menderita daripada barren plateaus, manakala kaedah tanpa kecerunan memerlukan bilangan penilaian fungsi yang besar.

  1. Overhed pengoptimum

Satu lagi cabaran yang sudah diketahui ialah overhed pengoptimum, yang berkaitan dengan skala masalah. Circuit kuantum yang diperlukan untuk VQE bertambah dalam dan rumit apabila saiz masalah meningkat; ini biasanya juga meningkatkan bilangan parameter untuk dioptimumkan. Proses pengoptimuman menjadi tidak praktikal apabila bilangan parameter meningkat, menyebabkan penumpuan yang perlahan dan kesukaran dalam mencari penyelesaian optimum.

Di sini kita akan melihat cabaran-cabaran ini dengan menggunakan VQE untuk molekul H2H_2, dengan dua jenis ansatz yang berbeza.

(Nota: Ini boleh mengambil lebih banyak masa QPU, jadi gunakan simulator jika anda tidak mempunyai masa yang cukup.)

from qiskit.circuit import ParameterVector

num_iter = 4
alpha = ParameterVector("alpha", 3)
beta = ParameterVector("beta", 3 * num_iter)

# step1: Map problem to quantum circuits and operators
hamiltonian = SparsePauliOp.from_list(
[("I", -1.04886087), ("Z", -0.7967368), ("X", 0.18121804)]
)

ansatz_1 = ansatz3
ansatz_2 = QuantumCircuit(1)
for i in range(num_iter):
ansatz_2.rx(beta[i * 3 + 0], 0)
ansatz_2.rz(beta[i * 3 + 1], 0)
ansatz_2.rx(beta[i * 3 + 2], 0)
ansatz_1.draw("mpl")

Output of the previous code cell

ansatz_2.draw("mpl")

Output of the previous code cell

# Step 2: Optimize for target hardware

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

ansatz_isa_1 = pm.run(ansatz_1)
ansatz_isa_2 = pm.run(ansatz_2)
hamiltonian_isa_1 = hamiltonian.apply_layout(layout=ansatz_isa_1.layout)
hamiltonian_isa_2 = hamiltonian.apply_layout(layout=ansatz_isa_2.layout)

Sekarang mari jalankan VQE dengan titik awal yang terdiri daripada semua satu, dengan maksimum 20 langkah, dan bandingkan penumpuan kedua-dua jalankan.

# QPU time 3m 40s for ibm_brisbane
# Step 3: Execute on target hardware

from scipy.optimize import minimize

x0 = np.ones(ansatz_1.num_parameters)

batch = Batch(backend=backend)

cost_history_dict = {
"prev_vector": None,
"iters": 0,
"cost_history": [],
}
estimator = Estimator(mode=batch)
estimator.options.default_shots = 2048

res = minimize(
cost_func,
x0,
args=(ansatz_isa_1, hamiltonian_isa_1, estimator),
method="cobyla",
options={"maxiter": 20},
)

batch.close()
Iters. done: 1 [Current cost: -0.8782202668652658]
Iters. done: 2 [Current cost: -0.43473160695469165]
Iters. done: 3 [Current cost: -0.4076372093159749]
Iters. done: 4 [Current cost: -1.3587839859772106]
Iters. done: 5 [Current cost: -1.774529906754082]
Iters. done: 6 [Current cost: -1.541934983115727]
Iters. done: 7 [Current cost: -1.2732403113465345]
Iters. done: 8 [Current cost: -1.820842221085785]
Iters. done: 9 [Current cost: -1.8065762857059005]
Iters. done: 10 [Current cost: -1.8126394095981146]
Iters. done: 11 [Current cost: -1.8205831886180421]
Iters. done: 12 [Current cost: -1.8086715778994924]
Iters. done: 13 [Current cost: -1.8307676638629322]
Iters. done: 14 [Current cost: -1.8177328827556327]
Iters. done: 15 [Current cost: -1.8179426218088064]
Iters. done: 16 [Current cost: -1.8109239667991088]
Iters. done: 17 [Current cost: -1.824271872489647]
Iters. done: 18 [Current cost: -1.813167587671394]
Iters. done: 19 [Current cost: -1.824647343397313]
Iters. done: 20 [Current cost: -1.8219785311686143]
# Save Cost_history as a new list
ansatz_1_history = cost_history_dict["cost_history"]
# QPU time 3m 40s for ibm_brisbane

x0 = np.ones(ansatz_2.num_parameters)

batch = Batch(backend=backend)

cost_history_dict = {
"prev_vector": None,
"iters": 0,
"cost_history": [],
}
estimator = Estimator(mode=batch)
estimator.options.default_shots = 2048

res = minimize(
cost_func,
x0,
args=(ansatz_isa_2, hamiltonian_isa_2, estimator),
method="cobyla",
options={"maxiter": 20},
)

batch.close()
Iters. done: 1 [Current cost: -0.738191173881188]
Iters. done: 2 [Current cost: -0.42636037194506304]
Iters. done: 3 [Current cost: -1.3503788613797374]
Iters. done: 4 [Current cost: -0.9109204349776897]
Iters. done: 5 [Current cost: -0.9060873157510835]
Iters. done: 6 [Current cost: -0.7735065414083984]
Iters. done: 7 [Current cost: -1.586889197437709]
Iters. done: 8 [Current cost: -1.659215191584943]
Iters. done: 9 [Current cost: -1.245445981794618]
Iters. done: 10 [Current cost: -1.1608385766138023]
Iters. done: 11 [Current cost: -1.1551733876027737]
Iters. done: 12 [Current cost: -1.8143337768286332]
Iters. done: 13 [Current cost: -1.2510951563756598]
Iters. done: 14 [Current cost: -1.6918311531865413]
Iters. done: 15 [Current cost: -1.8163783305531838]
Iters. done: 16 [Current cost: -1.8434877732947152]
Iters. done: 17 [Current cost: -1.8461898233304472]
Iters. done: 18 [Current cost: -1.0346471214915485]
Iters. done: 19 [Current cost: -1.8322518854150687]
Iters. done: 20 [Current cost: -1.717144678705999]
ansatz_2_history = cost_history_dict["cost_history"]
fig, ax = plt.subplots()

# Define the constant function)
ax.plot(
range(cost_history_dict["iters"]),
ansatz_1_history,
label="Ansatz with 3 parameters",
)
ax.plot(
range(cost_history_dict["iters"]),
ansatz_2_history,
label="Ansatz with 12 parameters",
)
ax.set_xlabel("Iterations")
ax.set_ylabel("Cost (Hartree)")
plt.legend()
plt.draw()

Output of the previous code cell

Graf di atas dengan jelas menunjukkan bahawa proses pengoptimuman ansatz dengan lebih banyak pemboleh ubah mengambil lebih banyak masa untuk mencapai penumpuan yang stabil.

Berbanding dengan bergantung pada Circuit Qubit tunggal yang mudah dan ansatz yang ringkas, kerumitan pengoptimuman meningkat apabila Circuit kuantum yang lebih besar dan ansatz berstruktur lebih kompleks diperlukan. Ini menyerlahkan cabaran yang sudah diketahui dalam VQE: overhed pengoptimum.

Penyelidik terus membangunkan pelbagai metodologi canggih yang boleh menggunakan komputer kuantum untuk masalah kimia. Anda boleh mengakses pelbagai bahan pendidikan di IBM Quantum Learning.

Rujukan

  • [ref 1 ] Richard P. Feynman, Simulating Physics with Computers, International Journal of Theoretical Physics, 1982.
  • [ref 2] Marov, M.Y. (2015). The Structure of the Universe. In: The Fundamentals of Modern Astrophysics. Springer, New York, NY.
  • [ref 3] How to solve difficult chemical engineering problems with quantum computing, IBM Research Blog, 2023.
  • [ref 4] Y. Cao, J. Romero and A. Aspuru-Guzik, "Potential of quantum computing for drug discovery," in IBM Journal of Research and Development, vol. 62, no. 6, pp. 6:1-6:20, 1 Nov.-Dec. 2018
  • [ref 5] Present State of Molecular Structure Calculation, REv. Mod. Phys. 32, 170, 1960
  • [ref 6] Fedorov, D.A., Peng, B., Govind, N. et al. VQE method: a short survey and recent developments. Mater Theory 6, 2 (2022)
Source: IBM Quantum docs — updated 27 Apr 2026
English version on doQumentation — updated 7 Mei 2026
This translation based on the English version of approx. 27 Mac 2026