How to simulate a non-Hermitian Hamiltonian?

289 views
Skip to first unread message

Jonah Peter

unread,
Nov 24, 2021, 9:23:50 AM11/24/21
to QuTiP: Quantum Toolbox in Python
How does one simulate a non-Hermitian Hamiltonian in qutip? I tried setting:
options = qutip.Options(normalize_output=False)

and also passing:
liouv = -1j * (spre(ham) - spost(ham.dag()))

to mesolve for some non-Hermitian hamiltonian "ham" but both seem to give unphysical results (trace greater than 1).

Thanks!

Nathan Shammah

unread,
Nov 24, 2021, 9:51:30 AM11/24/21
to qu...@googlegroups.com
Relaxing the hermiticity actually does not provide a unitary evolution nor guarantees trace preservation. There are different types of non-Hermitian dynamics models, it then depends on the one you'd like to implement. For example, behind the scenes also mcsolve employs non-Hermitian matrices, but renormalizes the state accordingly. But it makes sense that employing a non-Hermitian Hamiltonian for the evolution will provide non-normalized states.

Bests, 

Nathan 

--
You received this message because you are subscribed to the Google Groups "QuTiP: Quantum Toolbox in Python" group.
To unsubscribe from this group and stop receiving emails from it, send an email to qutip+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/qutip/a11cf80b-dfb9-4c85-88bc-d0b4c1646ee7n%40googlegroups.com.


--
https://unitary.fund/
Creating a quantum technology ecosystem that benefits the most people.

Peter, Jonah

unread,
Nov 24, 2021, 5:08:56 PM11/24/21
to qu...@googlegroups.com
Hi Nathan,

Thanks for your reply. Perhaps I should have been a little more specific about the issue I’m facing. 

I am trying to simulate a collection of atoms which interact via dipole-dipole interactions (I implement this through a non Hermitian Hamiltonian using the Green’s tensor formalism). I am working in the single excitation manifold so the dynamics should be exactly equivalent to using the master equation. However, I find that in certain cases the population in the system increases exponentially instead of decreases. I suspect that the issue has something to do with the fact that I’ve turned off the normalization in order to incorporate non hermiticity.  

Is there an official way to simulate dynamics with a non hermitian Hamiltonian in qutip? I can’t find it anywhere in the documentation. 

Thanks!
Jonah

You received this message because you are subscribed to a topic in the Google Groups "QuTiP: Quantum Toolbox in Python" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/qutip/huQibgo64gs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to qutip+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/qutip/CAKcZDfS-R0XFRJQaNSbDc5KoBp-8SPa%2BRyYsWGfHAcON-cPvBQ%40mail.gmail.com.
--

Nathan Shammah

unread,
Dec 1, 2021, 1:38:53 PM12/1/21
to qu...@googlegroups.com, Neill Lambert
Hi Jonah, 

I am not sure on how to proceed on top of my head. Maybe @Neill Lambert, you know better?

Bests,

Nathan

Neill Lambert

unread,
Dec 1, 2021, 9:55:49 PM12/1/21
to Nathan Shammah, qu...@googlegroups.com
Hi Jonah

I am also not 100% certain what you are trying to do, but I made a small test example, and everything seems to work as expected. Attaching it just in case it helps you spot the issue. If not, maybe you can share a minimal code example that fails so we can see what's going on.

One quick point: if you define  liouv = -1j * (spre(ham) - spost(ham.dag()))  and send it to mesolve() it will solve the master equation, not the schrodinger equation, so you wont get the memory benefit I guess?   On the other hand, if you have other losses, so do want to solve a master equation, it is important to use  liouv = -1j * (spre(ham) - spost(ham.dag())) because mesolve() does not take the .dag() of the Hamiltonian for you.

thanks
neill
--
-----------------------------------
Senior Research Scientist
RIKEN, Japan
Research Homepage
smallnonhermitianexample.ipynb

Peter, Jonah

unread,
Dec 7, 2021, 2:25:32 PM12/7/21
to qu...@googlegroups.com
Oh interesting, so if I use mesolve I can't simply put in a non-hermitian hamiltonian and some additional collapse operators? I have to pass the function a liouvillan?

Peter, Jonah

unread,
Dec 21, 2021, 2:00:26 PM12/21/21
to qu...@googlegroups.com
Hi,

Just wanted to follow up on this. Is the proper way to simulate a non-Hermitian Hamiltonian (ham) to pass liouv = -1j * (spre(ham) - spost(ham.dag())) to mesolve()? Can I also pass ham to sesolve() if I don't have other Lindbladians? Or do I always have to use liouv?

Also, is it possible to use steady state solvers with non-Hermitian Hamiltonians?

Thanks!
Jonah


Neill Lambert

unread,
Dec 21, 2021, 9:34:20 PM12/21/21
to qu...@googlegroups.com
hi Jonah,

 
Just wanted to follow up on this. Is the proper way to simulate a non-Hermitian Hamiltonian (ham) to pass liouv = -1j * (spre(ham) - spost(ham.dag())) to mesolve()? Can I also pass ham to sesolve() if I don't have other Lindbladians? Or do I always have to use liouv?

 Sorry maybe my message below wasn't super clear, i would say there are the following options for the problem you described

1) If you have just one source of loss which you are modeling with a non-hermitian hamiltonian, and want the memory benefit of just modeling the  wave-function instead of a density matrix, you can just send your non-hermitian hamiltonian to either mesolve(ham,..)  or sesolve(ham,...), with the appropriate options you mentioned in your earlier email, and a initial condition in the form of a ket, not an operator.    Mesolve() will notice there are no collapse operators and the initial condition is not a density operator, so internally will call sesolve(), so they should be equivalent.  

2) If you have other sources of loss, and collapse operators for them, but also want to include the non-hermitian hamiltonian, you can use liouv = -1j * (spre(ham) - spost(ham.dag()))    with mesolve().   This is just because  when constructing the Liouvillian internally   mesolve won't explicitly take the ham.dag() for you.  Whether it makes sense to have some collapse operators mixed with non-hermitian hamiltionian depends on what you are trying to do i guess.


One  thing to note is the above are really work-arounds, I think design wise there are no specific choices made for non-hermitian hamiltonians outside of mcsolve(), because as nathan mentioned it really depends on what you want to do.  E.g., we could change mesolve() so that .dag() is done by default, but I think there are cases where people don't want that to happen.  

 
Also, is it possible to use steady state solvers with non-Hermitian Hamiltonians?


I think so, but  if you have some issues feel free to ask here.
 
Thanks!
Jonah



To unsubscribe from this group and stop receiving emails from it, send an email to qutip+unsubscribe@googlegroups.com.


--
https://unitary.fund/
Creating a quantum technology ecosystem that benefits the most people.

--
You received this message because you are subscribed to a topic in the Google Groups "QuTiP: Quantum Toolbox in Python" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/qutip/huQibgo64gs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to qutip+unsubscribe@googlegroups.com.
--

--
You received this message because you are subscribed to the Google Groups "QuTiP: Quantum Toolbox in Python" group.
To unsubscribe from this group and stop receiving emails from it, send an email to qutip+unsubscribe@googlegroups.com.


--
https://unitary.fund/
Creating a quantum technology ecosystem that benefits the most people.


--
-----------------------------------
Senior Research Scientist
RIKEN, Japan
Research Homepage

--
You received this message because you are subscribed to a topic in the Google Groups "QuTiP: Quantum Toolbox in Python" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/qutip/huQibgo64gs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to qutip+unsubscribe@googlegroups.com.
--
You received this message because you are subscribed to the Google Groups "QuTiP: Quantum Toolbox in Python" group.
To unsubscribe from this group and stop receiving emails from it, send an email to qutip+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/qutip/CACXKfO%3DC0_KTE%3DjmYPfFuUqkuWbGeOT7qMXMkJHAD1cq8h_CTA%40mail.gmail.com.
Reply all
Reply to author
Forward
0 new messages