Time Evolution using Renormalizer#
Overview#
In this notebook we will simulate the charge transfer between two molecules using the Marcus model
with transfer integral \(V=-0.1\), dimensionless coupling constant \(g=1\), vibration frequency \(\omega=0.5\).
We will first show how to use Renormalizer to simulation the time evolution at \(\Delta G = 0\). Then, we will show that, by decreasing the reaction Gibbs free energy change \(\Delta G\), the reaction rate will first increase and then decrease, as predicted by the Marcus theory.
Preparation: Setting Up Logger#
[1]:
from renormalizer.utils.log import package_logger as logger
2025-08-12 09:13:31,054[INFO] Use NumPy as backend
2025-08-12 09:13:31,055[INFO] numpy random seed is 9012
2025-08-12 09:13:31,056[INFO] random seed is 1092
2025-08-12 09:13:31,064[INFO] Git Commit Hash: 17d8634f55d07699b9771eb4183b519874cb7d31
2025-08-12 09:13:31,065[INFO] use 64 bits
[2]:
logger.debug("logger output")
2025-08-12 09:13:31,104[DEBUG] logger output
[3]:
from renormalizer.utils.log import set_stream_level, INFO
[4]:
# filter logger output
set_stream_level(INFO)
[5]:
logger.debug("This message will not be shown")
[6]:
logger.info("Logger output")
2025-08-12 09:13:31,124[INFO] Logger output
Define the Model and Initial State#
[7]:
from renormalizer import Op, BasisMultiElectron, BasisSHO, Model
import numpy as np
[8]:
v = -0.1
g = 1
omega = 0.5
nbas = 16
[9]:
def get_model(delta_g):
ham_terms = v * Op(r"a^\dagger a", ["e0", "e1"]) + v * Op(r"a^\dagger a", ["e1", "e0"])
ham_terms += delta_g * Op(r"a^\dagger a", "e1")
for i in range(2):
ham_terms += omega * Op(r"b^\dagger b", f"v{i}")
ham_terms += g * omega * Op(r"a^\dagger a", f"e{i}") * Op(r"b^\dagger+b", f"v{i}")
basis = [BasisMultiElectron(["e0", "e1"], [0, 0]), BasisSHO("v0", omega, nbas), BasisSHO("v1", omega, nbas)]
return Model(basis, ham_terms)
[10]:
# using a relaxed initial state
def get_init_condition():
basis = BasisSHO(0, omega, nbas)
state = np.linalg.eigh(basis.op_mat(r"b^\dagger b") + g * basis.op_mat(r"b^\dagger+b"))[1][:, 0]
return {"v0": state}
init_condition = get_init_condition()
Time Evolution with the Default Configuration#
Next, we run the simulation using the evolve
method in the Mps
class. At this phase, we keep \(\Delta G = 0\).
[11]:
delta_g = 0
model = get_model(delta_g)
[12]:
from renormalizer import Mps, Mpo
[13]:
# Hamiltonian MPO
mpo = Mpo(model)
# The occupation of e0
n_op = Mpo(model, Op(r"a^\dagger a", "e0"))
[14]:
# initialize the MPS
mps = Mps.hartree_product_state(model, condition=init_condition)
# time evolution step
dt = 0.2
# record the electronic occupation
n_list = []
for i_step in range(50):
n = mps.expectation(n_op)
logger.info(f"Step {i_step}. Time {i_step * dt:.2f}. $n$ {n}")
# perform time evolution. Note that the evolution is not in-place.
mps = mps.evolve(mpo, dt)
n_list.append(n)
2025-08-12 09:13:31,173[INFO] Step 0. Time 0.00. $n$ 0.9999999999999998
2025-08-12 09:13:31,186[INFO] Step 1. Time 0.20. $n$ 0.9996030537865594
2025-08-12 09:13:31,199[INFO] Step 2. Time 0.40. $n$ 0.998431396656162
2025-08-12 09:13:31,212[INFO] Step 3. Time 0.60. $n$ 0.9965532876450579
2025-08-12 09:13:31,228[INFO] Step 4. Time 0.80. $n$ 0.9940731362639054
2025-08-12 09:13:31,243[INFO] Step 5. Time 1.00. $n$ 0.9911161868842491
2025-08-12 09:13:31,259[INFO] Step 6. Time 1.20. $n$ 0.9878132450238745
2025-08-12 09:13:31,275[INFO] Step 7. Time 1.40. $n$ 0.9842873078294337
2025-08-12 09:13:31,291[INFO] Step 8. Time 1.60. $n$ 0.9806441927926955
2025-08-12 09:13:31,307[INFO] Step 9. Time 1.80. $n$ 0.976967746624379
2025-08-12 09:13:31,323[INFO] Step 10. Time 2.00. $n$ 0.9733182226560808
2025-08-12 09:13:31,339[INFO] Step 11. Time 2.20. $n$ 0.9697373081106376
2025-08-12 09:13:31,355[INFO] Step 12. Time 2.40. $n$ 0.9662497016753406
2025-08-12 09:13:31,371[INFO] Step 13. Time 2.60. $n$ 0.962867160945706
2025-08-12 09:13:31,387[INFO] Step 14. Time 2.80. $n$ 0.9595919026133962
2025-08-12 09:13:31,405[INFO] Step 15. Time 3.00. $n$ 0.9564197521679629
2025-08-12 09:13:31,421[INFO] Step 16. Time 3.20. $n$ 0.9533423734970323
2025-08-12 09:13:31,438[INFO] Step 17. Time 3.40. $n$ 0.9503492089387037
2025-08-12 09:13:31,455[INFO] Step 18. Time 3.60. $n$ 0.9474287391824951
2025-08-12 09:13:31,471[INFO] Step 19. Time 3.80. $n$ 0.9445692798814913
2025-08-12 09:13:31,487[INFO] Step 20. Time 4.00. $n$ 0.9417594196434944
2025-08-12 09:13:31,504[INFO] Step 21. Time 4.20. $n$ 0.9389883140168839
2025-08-12 09:13:31,520[INFO] Step 22. Time 4.40. $n$ 0.9362456942950406
2025-08-12 09:13:31,538[INFO] Step 23. Time 4.60. $n$ 0.9335221984937244
2025-08-12 09:13:31,561[INFO] Step 24. Time 4.80. $n$ 0.9308095732941701
2025-08-12 09:13:31,581[INFO] Step 25. Time 5.00. $n$ 0.9281008849250423
2025-08-12 09:13:31,599[INFO] Step 26. Time 5.20. $n$ 0.9253906107085343
2025-08-12 09:13:31,616[INFO] Step 27. Time 5.40. $n$ 0.9226738471654728
2025-08-12 09:13:31,633[INFO] Step 28. Time 5.60. $n$ 0.9199478805518423
2025-08-12 09:13:31,649[INFO] Step 29. Time 5.80. $n$ 0.9172094618331406
2025-08-12 09:13:31,665[INFO] Step 30. Time 6.00. $n$ 0.9144551950424458
2025-08-12 09:13:31,682[INFO] Step 31. Time 6.20. $n$ 0.9116816732036944
2025-08-12 09:13:31,698[INFO] Step 32. Time 6.40. $n$ 0.9088859026726781
2025-08-12 09:13:31,714[INFO] Step 33. Time 6.60. $n$ 0.9060659656334908
2025-08-12 09:13:31,731[INFO] Step 34. Time 6.80. $n$ 0.9032210121837198
2025-08-12 09:13:31,747[INFO] Step 35. Time 7.00. $n$ 0.9003515623906606
2025-08-12 09:13:31,763[INFO] Step 36. Time 7.20. $n$ 0.8974590790192766
2025-08-12 09:13:31,779[INFO] Step 37. Time 7.40. $n$ 0.8945453849965326
2025-08-12 09:13:31,795[INFO] Step 38. Time 7.60. $n$ 0.8916120979060871
2025-08-12 09:13:31,812[INFO] Step 39. Time 7.80. $n$ 0.8886602437062094
2025-08-12 09:13:31,828[INFO] Step 40. Time 8.00. $n$ 0.8856902107426247
2025-08-12 09:13:31,844[INFO] Step 41. Time 8.20. $n$ 0.8827020259679245
2025-08-12 09:13:31,861[INFO] Step 42. Time 8.40. $n$ 0.8796958667524066
2025-08-12 09:13:31,877[INFO] Step 43. Time 8.60. $n$ 0.8766726737398559
2025-08-12 09:13:31,895[INFO] Step 44. Time 8.80. $n$ 0.8736347299848458
2025-08-12 09:13:31,912[INFO] Step 45. Time 9.00. $n$ 0.8705861034366976
2025-08-12 09:13:31,930[INFO] Step 46. Time 9.20. $n$ 0.8675328737556515
2025-08-12 09:13:31,947[INFO] Step 47. Time 9.40. $n$ 0.8644830817098144
2025-08-12 09:13:31,965[INFO] Step 48. Time 9.60. $n$ 0.8614463370235249
2025-08-12 09:13:31,981[INFO] Step 49. Time 9.80. $n$ 0.8584330043902285
[15]:
# plotting the occupation
from matplotlib import pyplot as plt
plt.style.use("mm.mplstyle")
plt.plot(np.arange(len(n_list)) * dt, n_list, label="Default")
plt.xlabel("$t$")
plt.ylabel(r"Occupation $\langle a^\dagger_0 a_0 \rangle$")
plt.legend()
plt.show()

In this example, the time evolution is performed with default time evolution configuration and MPS compression configuration.
Renormalizer by default uses the RK4 “propagation and compression” method for time evolution. The advantage of the method is that it is easy to understand and setup.
Please refer to our recent review for a discussion of the different time evolution schemes.
[16]:
mps.evolve_config.method
[16]:
<EvolveMethod.prop_and_compress: 'P&C'>
Regarding MPS compression/truncation configuration, Renormalizer by default employs a truncation scheme based on the the singular value threshold.
[17]:
mps.compress_config.criteria, mps.compress_config.threshold
[17]:
(<CompressCriteria.threshold: 'threshold'>, 0.001)
Inspection of the dimension of the final mps after time evolution shows that the compression is efficient.
[18]:
mps.bond_dims
[18]:
[1, 2, 4, 1]
Configuring Time Evolution#
In order to configure the time evolution, you should update the evolve_config
and compress_config
attributes of an MPS instance. These attributes are instances of the EvolveConfig
class and the CompressConfig
class. Please see the API referece for full options of the configuration classes.
[19]:
from renormalizer.utils.configs import CompressConfig, CompressCriteria
[20]:
# update the compresssion configuration. Adopt a fixed bond dimension of 8
mps.compress_config = CompressConfig(CompressCriteria.fixed, max_bonddim=8)
Next, we perform one more step of the time evolution, and the bond dimension in the middle of the MPS is increased from 4 to 8, according to the updated compression configuration.
[21]:
new_mps = mps.evolve(mpo, dt)
new_mps.bond_dims
[21]:
[1, 2, 8, 1]
Recent studies have shown that methods based on time dependent variantional principle (TDVP) show higher accuracy and efficiency. In our production runs, we usually employ one-site TDVP with projector splitting (TDVP-PS) for time evolution. TDVP-PS allows much larger time evolution step size and reduces memory consumption. However, its setup is a little more complex than propagation and compression, since one-site TDVP generally can not adjust bond dimension during time evolution.
[22]:
from renormalizer.utils.configs import EvolveConfig, EvolveMethod
[23]:
mps.evolve_config = EvolveConfig(EvolveMethod.tdvp_ps)
Next, we perform one more step of the time evolution using TDVP-PS.
Note that the bond dimension in the middle of the MPS does not increase from 4 to 8. This is because one-site TDVP-PS does not alter the bond dimension.
[24]:
new_mps = mps.evolve(mpo, dt)
new_mps.bond_dims
[24]:
[1, 2, 4, 1]
The expand_bond_dimension
function increases the bond dimension to target value specified by the compress_config
. In short, the function adds the vectors in the Krylov space \(H^n|\psi\rangle\) to the input wavefunction \(|\psi\rangle\), and then compresses it to the target bond dimension.
The include_ex
option is specifically designed for systems with quantum number conservation. If the initial wavefunction does not include contributions from a certain symmetry sector, these contributions will not reappear during time evolution due to the projection error in TDVP. Setting include_ex=True
will add a small perturbation to the initial state to help recover the missing symmetry sector contributions. In our case, the quantum number conservation is disabled, so we set
include_ex=False
.
[25]:
new_mps = mps.expand_bond_dimension(mpo, include_ex=False)
new_mps.bond_dims
[25]:
[1, 2, 8, 1]
Observing Marcus Inverted Region#
Next, we put everything together and perform time evolution with different \(\Delta G\) using TDVP-PS. Since the initial state of time evolution is a Hartree product state, we must expand the bond dimension before performing the time evolution.
[26]:
# time evolution step
dt = 0.5
# initialize the MPS
init_mps = Mps.hartree_product_state(model, condition=init_condition)
# setup compression configuration
init_mps.compress_config = CompressConfig(CompressCriteria.fixed, max_bonddim=8)
# setup time evolution configuration
init_mps.evolve_config = EvolveConfig(EvolveMethod.tdvp_ps)
# record the electronic occupation
n_list_list = []
delta_g_list = np.linspace(0, -2, 5)
for delta_g in delta_g_list:
# reconstruct the Hamiltonian. We can reuse the occupation operator though
model = get_model(delta_g)
mpo = Mpo(model)
# expand the bond dimension
mps = init_mps.expand_bond_dimension(mpo, include_ex=False)
logger.info(f"MPS bond dimension: {mps.bond_dims}")
n_list = []
for i_step in range(20):
n = mps.expectation(n_op)
logger.info(f"Step {i_step}. Time {i_step * dt:.2f}. $n$ {n}")
# perform time evolution. Note that the evolution is not in-place.
mps = mps.evolve(mpo, dt)
n_list.append(n)
n_list_list.append(n_list)
2025-08-12 09:13:34,513[INFO] MPS bond dimension: [1, 2, 8, 1]
2025-08-12 09:13:34,516[INFO] Step 0. Time 0.00. $n$ 1.0
2025-08-12 09:13:34,542[INFO] Step 1. Time 0.50. $n$ 0.9975776788496081
2025-08-12 09:13:34,567[INFO] Step 2. Time 1.00. $n$ 0.9911341778211975
2025-08-12 09:13:34,593[INFO] Step 3. Time 1.50. $n$ 0.9824981838275647
2025-08-12 09:13:34,618[INFO] Step 4. Time 2.00. $n$ 0.9733283418283654
2025-08-12 09:13:34,644[INFO] Step 5. Time 2.50. $n$ 0.9645218516469737
2025-08-12 09:13:34,669[INFO] Step 6. Time 3.00. $n$ 0.956338236849221
2025-08-12 09:13:34,693[INFO] Step 7. Time 3.50. $n$ 0.948730433389219
2025-08-12 09:13:34,718[INFO] Step 8. Time 4.00. $n$ 0.9415533981894384
2025-08-12 09:13:34,743[INFO] Step 9. Time 4.50. $n$ 0.9346400325046184
2025-08-12 09:13:34,769[INFO] Step 10. Time 5.00. $n$ 0.9278351842220698
2025-08-12 09:13:34,794[INFO] Step 11. Time 5.50. $n$ 0.9210298996164081
2025-08-12 09:13:34,820[INFO] Step 12. Time 6.00. $n$ 0.9141749831330699
2025-08-12 09:13:34,844[INFO] Step 13. Time 6.50. $n$ 0.9072563582422922
2025-08-12 09:13:34,869[INFO] Step 14. Time 7.00. $n$ 0.9002591286104606
2025-08-12 09:13:34,894[INFO] Step 15. Time 7.50. $n$ 0.8931521085342403
2025-08-12 09:13:34,918[INFO] Step 16. Time 8.00. $n$ 0.8858943878575136
2025-08-12 09:13:34,943[INFO] Step 17. Time 8.50. $n$ 0.8784553598367533
2025-08-12 09:13:34,968[INFO] Step 18. Time 9.00. $n$ 0.8708472420517182
2025-08-12 09:13:34,992[INFO] Step 19. Time 9.50. $n$ 0.8631616549410925
2025-08-12 09:13:35,036[INFO] MPS bond dimension: [1, 2, 8, 1]
2025-08-12 09:13:35,037[INFO] Step 0. Time 0.00. $n$ 1.0000000000000002
2025-08-12 09:13:35,062[INFO] Step 1. Time 0.50. $n$ 0.9975401925879049
2025-08-12 09:13:35,087[INFO] Step 2. Time 1.00. $n$ 0.990601362849024
2025-08-12 09:13:35,112[INFO] Step 3. Time 1.50. $n$ 0.9802488858640299
2025-08-12 09:13:35,137[INFO] Step 4. Time 2.00. $n$ 0.9676593608104574
2025-08-12 09:13:35,161[INFO] Step 5. Time 2.50. $n$ 0.9537696503060062
2025-08-12 09:13:35,186[INFO] Step 6. Time 3.00. $n$ 0.939207294852095
2025-08-12 09:13:35,211[INFO] Step 7. Time 3.50. $n$ 0.9243586104260207
2025-08-12 09:13:35,237[INFO] Step 8. Time 4.00. $n$ 0.909439784835915
2025-08-12 09:13:35,264[INFO] Step 9. Time 4.50. $n$ 0.8945511232283814
2025-08-12 09:13:35,290[INFO] Step 10. Time 5.00. $n$ 0.8797430038665828
2025-08-12 09:13:35,317[INFO] Step 11. Time 5.50. $n$ 0.8650797798247604
2025-08-12 09:13:35,343[INFO] Step 12. Time 6.00. $n$ 0.8506519218071078
2025-08-12 09:13:35,368[INFO] Step 13. Time 6.50. $n$ 0.8365374567180586
2025-08-12 09:13:35,393[INFO] Step 14. Time 7.00. $n$ 0.8227688239625943
2025-08-12 09:13:35,417[INFO] Step 15. Time 7.50. $n$ 0.8093300617593495
2025-08-12 09:13:35,442[INFO] Step 16. Time 8.00. $n$ 0.7961632960693847
2025-08-12 09:13:35,466[INFO] Step 17. Time 8.50. $n$ 0.7831685752085122
2025-08-12 09:13:35,491[INFO] Step 18. Time 9.00. $n$ 0.7702000677823149
2025-08-12 09:13:35,515[INFO] Step 19. Time 9.50. $n$ 0.7570646850987613
2025-08-12 09:13:35,559[INFO] MPS bond dimension: [1, 2, 8, 1]
2025-08-12 09:13:35,561[INFO] Step 0. Time 0.00. $n$ 1.0
2025-08-12 09:13:35,585[INFO] Step 1. Time 0.50. $n$ 0.9975277339592454
2025-08-12 09:13:35,609[INFO] Step 2. Time 1.00. $n$ 0.9904261839751384
2025-08-12 09:13:35,634[INFO] Step 3. Time 1.50. $n$ 0.9795268047068664
2025-08-12 09:13:35,658[INFO] Step 4. Time 2.00. $n$ 0.9659170449060817
2025-08-12 09:13:35,683[INFO] Step 5. Time 2.50. $n$ 0.950685008940619
2025-08-12 09:13:35,707[INFO] Step 6. Time 3.00. $n$ 0.9347455146607812
2025-08-12 09:13:35,732[INFO] Step 7. Time 3.50. $n$ 0.9187422726641733
2025-08-12 09:13:35,755[INFO] Step 8. Time 4.00. $n$ 0.9030158921696068
2025-08-12 09:13:35,781[INFO] Step 9. Time 4.50. $n$ 0.8876520609099685
2025-08-12 09:13:35,805[INFO] Step 10. Time 5.00. $n$ 0.8725982798020405
2025-08-12 09:13:35,830[INFO] Step 11. Time 5.50. $n$ 0.8577742342547123
2025-08-12 09:13:35,855[INFO] Step 12. Time 6.00. $n$ 0.8431151893156017
2025-08-12 09:13:35,879[INFO] Step 13. Time 6.50. $n$ 0.8285809886892026
2025-08-12 09:13:35,903[INFO] Step 14. Time 7.00. $n$ 0.8141772509631209
2025-08-12 09:13:35,927[INFO] Step 15. Time 7.50. $n$ 0.7999687732355276
2025-08-12 09:13:35,952[INFO] Step 16. Time 8.00. $n$ 0.7860556760297779
2025-08-12 09:13:35,976[INFO] Step 17. Time 8.50. $n$ 0.7725203376680742
2025-08-12 09:13:36,001[INFO] Step 18. Time 9.00. $n$ 0.7593659426880252
2025-08-12 09:13:36,025[INFO] Step 19. Time 9.50. $n$ 0.7464615604976077
2025-08-12 09:13:36,069[INFO] MPS bond dimension: [1, 2, 8, 1]
2025-08-12 09:13:36,070[INFO] Step 0. Time 0.00. $n$ 1.0
2025-08-12 09:13:36,096[INFO] Step 1. Time 0.50. $n$ 0.9975406090105963
2025-08-12 09:13:36,121[INFO] Step 2. Time 1.00. $n$ 0.9906249611406743
2025-08-12 09:13:36,145[INFO] Step 3. Time 1.50. $n$ 0.9804700824710465
2025-08-12 09:13:36,169[INFO] Step 4. Time 2.00. $n$ 0.9686190882357234
2025-08-12 09:13:36,194[INFO] Step 5. Time 2.50. $n$ 0.9564506630039299
2025-08-12 09:13:36,218[INFO] Step 6. Time 3.00. $n$ 0.944824401740503
2025-08-12 09:13:36,242[INFO] Step 7. Time 3.50. $n$ 0.9339798618065531
2025-08-12 09:13:36,267[INFO] Step 8. Time 4.00. $n$ 0.9236970054402206
2025-08-12 09:13:36,292[INFO] Step 9. Time 4.50. $n$ 0.9136118419963739
2025-08-12 09:13:36,317[INFO] Step 10. Time 5.00. $n$ 0.9034945341198813
2025-08-12 09:13:36,342[INFO] Step 11. Time 5.50. $n$ 0.8933290940558758
2025-08-12 09:13:36,367[INFO] Step 12. Time 6.00. $n$ 0.8832123669566789
2025-08-12 09:13:36,391[INFO] Step 13. Time 6.50. $n$ 0.8732206640791175
2025-08-12 09:13:36,415[INFO] Step 14. Time 7.00. $n$ 0.8633414313596279
2025-08-12 09:13:36,440[INFO] Step 15. Time 7.50. $n$ 0.8534881635602922
2025-08-12 09:13:36,465[INFO] Step 16. Time 8.00. $n$ 0.8435889215797642
2025-08-12 09:13:36,490[INFO] Step 17. Time 8.50. $n$ 0.8336922458094261
2025-08-12 09:13:36,516[INFO] Step 18. Time 9.00. $n$ 0.8239993933202377
2025-08-12 09:13:36,541[INFO] Step 19. Time 9.50. $n$ 0.8147658344266686
2025-08-12 09:13:36,586[INFO] MPS bond dimension: [1, 2, 8, 1]
2025-08-12 09:13:36,587[INFO] Step 0. Time 0.00. $n$ 1.0000000000000002
2025-08-12 09:13:36,613[INFO] Step 1. Time 0.50. $n$ 0.9975784978846651
2025-08-12 09:13:36,637[INFO] Step 2. Time 1.00. $n$ 0.9911783314788768
2025-08-12 09:13:36,662[INFO] Step 3. Time 1.50. $n$ 0.9828793267407635
2025-08-12 09:13:36,686[INFO] Step 4. Time 2.00. $n$ 0.9748047375106147
2025-08-12 09:13:36,711[INFO] Step 5. Time 2.50. $n$ 0.9681008008243928
2025-08-12 09:13:36,736[INFO] Step 6. Time 3.00. $n$ 0.9626946118364345
2025-08-12 09:13:36,760[INFO] Step 7. Time 3.50. $n$ 0.9578334887382822
2025-08-12 09:13:36,784[INFO] Step 8. Time 4.00. $n$ 0.9528636883612422
2025-08-12 09:13:36,809[INFO] Step 9. Time 4.50. $n$ 0.9476402488995224
2025-08-12 09:13:36,833[INFO] Step 10. Time 5.00. $n$ 0.9423714783197237
2025-08-12 09:13:36,858[INFO] Step 11. Time 5.50. $n$ 0.9372226613912147
2025-08-12 09:13:36,882[INFO] Step 12. Time 6.00. $n$ 0.9321434873912725
2025-08-12 09:13:36,906[INFO] Step 13. Time 6.50. $n$ 0.9270168710222633
2025-08-12 09:13:36,930[INFO] Step 14. Time 7.00. $n$ 0.9218472771188859
2025-08-12 09:13:36,955[INFO] Step 15. Time 7.50. $n$ 0.9167421622570106
2025-08-12 09:13:36,980[INFO] Step 16. Time 8.00. $n$ 0.9117276598161903
2025-08-12 09:13:37,004[INFO] Step 17. Time 8.50. $n$ 0.906647971796358
2025-08-12 09:13:37,028[INFO] Step 18. Time 9.00. $n$ 0.9013355144433696
2025-08-12 09:13:37,052[INFO] Step 19. Time 9.50. $n$ 0.8959335401185704
By plotting the figure, we see that when \(\Delta G=-1\), the charge transfer rate is highest.
[27]:
t = np.arange(len(n_list_list[0])) * dt
for i, n_list in enumerate(n_list_list):
label = r"$\Delta G =" + str(delta_g_list[i]) + "$"
plt.plot(t, n_list, label=label, linestyle="--")
plt.xlabel("$t$")
plt.ylabel(r"Occupation $\langle a^\dagger_0 a_0 \rangle$")
plt.legend()
[27]:
<matplotlib.legend.Legend at 0x7f62f72a0100>

The prediction is consistent with the Marcus theory ,where the Marcus rate is
Here \(\lambda = 2g^2\omega = 1\) is the reorganization energy.