Próbuję wykładać skomplikowaną macierz w Pythonie i mam problemy. Używam funkcji scipy.linalg.expm
, i mam dość dziwny komunikat o błędzie, gdy próbuję następujący kod:Wykładanie macierzy w Pythonie
import numpy as np
from scipy import linalg
hamiltonian = np.mat('[1,0,0,0;0,-1,0,0;0,0,-1,0;0,0,0,1]')
# This works
t_list = np.linspace(0,1,10)
unitary = [linalg.expm(-(1j)*t*hamiltonian) for t in t_list]
# This doesn't
t_list = np.linspace(0,10,100)
unitary = [linalg.expm(-(1j)*t*hamiltonian) for t in t_list]
Błąd gdy drugi eksperyment prowadzony jest:
This works!
Traceback (most recent call last):
File "matrix_exp.py", line 11, in <module>
unitary_t = [linalg.expm(-1*t*(1j)*hamiltonian) for t in t_list]
File "/usr/lib/python2.7/dist-packages/scipy/linalg/matfuncs.py", line 105, in expm
return scipy.sparse.linalg.expm(A)
File "/usr/lib/python2.7/dist- packages/scipy/sparse/linalg/matfuncs.py", line 344, in expm
X = _fragment_2_1(X, A, s)
File "/usr/lib/python2.7/dist- packages/scipy/sparse/linalg/matfuncs.py", line 462, in _fragment_2_1
X[k, k] = exp_diag[k]
TypeError: only length-1 arrays can be converted to Python scalars
Wydaje się naprawdę dziwne, ponieważ zmieniłem tylko zakres t
, którego używałem. Czy to dlatego, że hamiltonian ma przekątną? Ogólnie rzecz biorąc, Hamiltonianie nie będą, ale ja też chcę, żeby działał na przekątnych. Naprawdę nie znam mechaniki expm
, więc każda pomoc byłaby bardzo doceniana.
Możesz spróbować przenieść obliczenia do pętli for zamiast do listy. Wtedy mógłbyś przynajmniej dowiedzieć się, która wartość jest niewystarczająca. – Elliot
Pierwsza liczba, na której program zawiedzie, to 't = 2.12121212121'. Wydaje się całkowicie arbitralne ... program nie działa dla 't = 2.ax' gdzie' a> 0'. I wcale nie działa dla 't = 3.x' ... – anar