因为主题并非量子力学, 所以这里只是简要介绍, 更详细的内容可以买本书来看然后还可以参考 @sym cheng 好久以前的 Live(这篇文章大约是知乎 Live 刚出现的时候写的)
量子力学的基本假设
类似于其它的物理理论(比如分析力学的最小作用量原理), 量子力学也有一些基本的假设:
原理一: 描写微观系统状态的数学量是 Hilbert (希尔伯特)空间中的矢量相差一个复数因子的两个矢量, 描述同一状态我们用归一化的右矢量或左矢量表示系统的状态, 这个希尔伯特空间称为态空间
原理二:
描写微观系统的物理量是 Hilbert 空间中的 Hermitian(厄米)算符, 也就是说一个 Hermitian 算符就代表了一个微观系统的物理量
物理量所能取的值, 是相应算符的本征值
物理量 在状态 中取各值 的概率, 与态矢量 按照 的归一化本征矢量的展开式中的系数 (一般我们称为概率幅) 的复平方成正比
原理三:
微观系统中每个粒子的广义坐标 (不理解换成直角坐标也行) 下的位置算符 , 与相应的正则动量算符 有下列对易关系:
其中 当且仅当 的时候为, 其余时候都是都是
粒子的自旋角动量算符 各分量之间的对易关系为:, 并且各分量与粒子的位置和动量算符都对易
原理四: 微观系统的状态 随时间变化的规律是薛定谔方程, 这里 是一个常数 (实数), 称为这个系统的 Hamiltonian(哈密顿量)
原理五: 描写全同粒子系统的态矢量, 对于任意一对粒子的对调是对称的 (对调前后完全相同) 或者反对称的(对调前后差一个负号), 前者称为玻色子, 后者称为费米子这里全同粒子系统是指由同一种粒子组成的系统, 这些粒子每个都是一样的
量子计算机的运行就是基于以上五个基本原理关于基本原理是否正确, 以及以上的称述方式是否严格我们不在这里讨论, 在具体实现的时候我们更关心这些原理是否能够帮助我们预测微观系统的行为毕竟对于量子力学的诠释, 除了最经典的哥本哈根诠释, 还有诸如流体力学诠释, Bohm 理论(在非局域的情况下依然能用), 随机诠释等等我们还没有找到在实验中能直接否定它们的方法, 所以目前来说信哪个是一种信仰...
从经典的哈密顿量到量子力学的哈密顿量
从经典的哈密顿量到量子力学的哈密顿量是有一些固定的方法的, 我们在这里也不关心这背后的原理具体是什么, 如果对这里感兴趣, 可以参看本章的参考文献这个具体的方法就是用算符替换经典系统里的动量, 角动量等符号, 比如在经典力学中的动量将被替换为动量算符
在量子计算中, 我们暂时不关心量子力学到底是怎么回事儿 (当然有一些人实际上也在利用量子计算机研究量子力学基础, 这里就不展开了), 我们更加关心的是, 一个人造的微观(量子) 结构如何按照预想的方式进行演化除了我们熟悉的 (可能现在还不那么熟悉的) 解析的数学方法, 数值计算往往是一个 (相对) 简单暴力直接的工具, 很多时候很有用所以首先先介绍一下怎么数值解一个含时的薛定谔方程下面的代码将用 Julia 语言编写
我们要求解的问题是这样的, 有这样一个哈密顿量
其中 是总的演化时间, 是 , 我们将 的本征矢量记为 这个系统的演化就满足薛定谔方程
而由于 是这个 Hilbert 空间的本征矢量,总可以表示为它们的线性组合
注意这个 Hamiltonian 是不显含时间变量的, 那么我们就可以分离变量, 使得在很小的 时间里, 下面的式子成立
这是因为在很小的 时间里, 我们可以把 随时间的变化忽略 (当然这么说是不严格的), 把 看做常数就有
可以解得
所以对于这样一个问题, 我们就可以用很小的 来进行数值计算代码如下
- mutable struct QuSystem
- H::Function
- current_state::Vector
- current_time::Float64
- dt::Float64
- function QuSystem(
- end
- end
- function evolute!(sys::QuSystem)
- sys.current_state = expm(
- sys.current_time += sys.dt
- end
- # 初态
- initial_state = [1/sqrt(2), 1/sqrt(2)]
- # 总的演化时间
- T = 1e2
- # 定义哈密顿量
- Hamiltonian(t) = 0.5*[1 -1;-1 1]*(1-t/T)+[1 0;0 0]*t/T
- # 构造这个量子系统, 为了节约时间把 dt 设成 1 吧, 这个步长没有明显的误差
- qs = QuSystem(Hamiltonian, initial_state, dt=1.0)
- # 打印一下初态, 看看初态是什么
- @show qs.current_state
- # 开始演化
- for i = 1:1e2
- evolute!(qs)
- end
- # 打印演化结束的态
- @show qs.current_state
这是用 Julia 语言写的, 因为中文文档比较落后, 如果你不想看英文文档可以先看我写的这个比较简单的教程
实际上, 这只是数值求解微分方程的方法中最简单的一种, 在 JuliaQuantum 开源组织的 QuDynamics.jl 中已经封装好了很多来自于 ODE.jl 和 Expmv.jl 的其它数值方法这里就暂且不详细介绍了, 等到后面介绍量子计算的模拟的时候具体说明
来源: http://www.tuicool.com/articles/go/7fmEjy7