物理壬踩坑记录including_qutip_python
qutip
是个很有用的量子计算集成开发包,abbreviated from Quantum toolbox in Python.
但是确实使用时候遇到了很多困难和坑,正好目前所在的量子计算组和大创项目需要用到,就记录一下遇到的问题。
- 绘制Bloch Sphere用
add_states()
方法
1 | sphere=qutip.Bloch() |
报错
1 | object has no attribute 'do_3d_projection' |
原因是我用的matplotlib版本是3.5.1,的确没有了这个属性,需要降到3.3.2
- 在计算基态某个物理量的平均值时,用
Qobj.groundstates()
方法
1 | print(qt.expect(qt.simgaz(),H.groundstate())) |
报错
1 | TypeError: Arguments must be quantum objects or eseries |
改正方法,H.groundstate()
返回本征值和本征矢
1 | print(qt.expect(qt.simgaz(),H.groundstate()[1])) |
尝试过将H.groundstate()
强制转化成Qobj,也尝试过将qt.simgaz(),H.groundstate()
转化成array用numpy恩算。
- Ising模型$\sigma^z_i \sigma^z_{i+1} $ for循环叠加
1 | N=10 |
报错,thx to QuTiP不完全ガイド,日本人写的都比中文互联网全。
1 | Incompatible quantum object dimensions |
需要让每个sigma_x(i)都是相同dims的Qobj,解决方案
1 | def sigma_x(index): |
- 将数据保存成.csv and .xls等文件时若单元格空白则再用pandas读取时该数据为
np.nan
,应该用df.replace(np.nan,0)
,报错:
1 | FutureWarning: elementwise comparison failed |
- if 循环时,判断单元格是否为文本,否则加入列表中,结果最后列表都是空列表。noting that the judgement of type do not need the like
isdigit()
funcisalpha()
, justtype ==type
.
1 | for i in range(len(df.columns)): |
肯定不能用pass对吧,否则这条就没啥用了。用break的话只执行当前的i,后续的i都不执行力。那应该:
1 | for i in range(len(df.columns)): |
这样跳过此i,执行下一个i。By the way it is worthing to pointing out that if the data is digit of string type, then transforming it to number type:
1 | a='123' |
join方法是字符串的操作函数,str.join(iterable)
,对一个可迭代对象执行用str分割,最后返回一个str。这个函数很好玩,可以玩出来花来,比如把列表每个元素分行打印:
1 | lst=['a','a','a'] |
1 | print(*lst,sep='\n') |
matplotlib配色
- 高精度计算问题
在计算
时,因带着,其数量级为-e12,e-23,而cschx=2np.exp(x)/(np.exp(2x)-1) # 2/(np.exp(x)-np.exp(-x))上溢,为零。
1 | RuntimeWarning: overflow encountered in exp |
所以就成了计算exp(-e30)问题,python精度最大为2^52,直接溢出,lg(exp(1e30))大概等于e29这么多位,,,,能算出来就有鬼了,解决办法:
1 | 1. 每一步计算都转换科学记数法分别算前面和10的次数部分,只计算科学计数法前半部分,后半部分就带着 |
- 量子多体数值就别tm用qutip了
因为之前做的量子优化控制偏量子光学,所以现在来做量子多体习惯性的继续用qutip,但是遇到到大失败!以下是用qutip and scipy.sparse来做相关计算的用时记录。对于橫场伊辛模型来说,发现qutip生成多体Hamiltionian的速度极快,比scipy.sparse还要快,但是求解矩阵本征态有着多项式级别的差异,同时矩阵点乘的速度也相差不多,而且qutip还有内存的问题。qutip老老实实算量子光学得了。
L=8
1 | t0=datetime.datetime.now() |
求解一个本征矢需要多花0:00:00.05
1 | E,states=sl.eigs(test_H(),k=2**8-2,which='SR') |
所以可能还是eigsh faster than eigs.
L=12 10times
qutip H.eigenstats() 0:00:59.843034
sl.eigsh 0:00:01.549344
sl.eigs 0:00:01.491331
E1,states1=scipy.linalg.eig(test_H().toarray()) 0:00:45.689474 #one time
L=14
eigsh 0:00:00.806247
eigs 0:00:00.908200
L=16 10 times
eigsh 0:00:27.331040
eigs 0:00:24.588102
此时qutip会爆内存,因为32GB的电脑最大存储16个格点的系统, 2^162^162^3=32GB,一个float类型变量占8B.
dot
np.dot(H,v[:,i]) 0:00:00.090018 #取本征矢时用 v[:,i]
H*states 0:00:00.096038
conclusion: Viva la scipy, go bitch qutip
In fact, the eigsh func is a packaging of Arpack package of C and Fortran, using the lanczos algorithm.
1 | def lanczos(hm,length): |