ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SymPy 量子物理模块 Hilbert 空间详解:从抽象基类到张量积、直和与 Fock 空间

SymPy 量子物理模块 Hilbert 空间详解:从抽象基类到张量积、直和与 Fock 空间 SymPy 量子物理模块 Hilbert 空间详解从抽象基类到张量积、直和与 Fock 空间【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympyHilbert 空间是量子力学的数学基石SymPy 的sympy.physics.quantum.hilbert模块为量子态与算符提供了符号化的 Hilbert 空间建模能力。本篇以官方文档 doc/src/modules/physics/quantum/hilbert.rst 为骨架结合模块源码、测试用例与下游模块的真实用法系统讲解HilbertSpace抽象基类、ComplexSpace、L2、FockSpace以及张量积、直和、张量幂的组合运算机制帮助读者理解如何在 SymPy 中描述量子系统并直接驱动量子计算、自旋、位置算符等实际场景。一、Hilbert 空间模块在 SymPy 中的定位在量子力学中Hilbert 空间是一个完备的、定义了内积的抽象向量空间系统的状态ket是其中的向量可观测量是作用其上的算符。SymPy 将这一概念实现为一个独立的子模块位于 sympy/physics/quantum/hilbert.py模块作者为 Brian Granger 与 Matt Curry。该模块通过__all__导出了以下 7 个公开对象见 hilbert.py#L19-L28名称类型作用HilbertSpaceError异常类模块内专用异常继承自QuantumErrorHilbertSpace抽象基类所有 Hilbert 空间的共同父类ComplexSpace具体空间有限维复向量空间如自旋、qubit 系统L2具体空间区间上的平方可积函数空间如位置/动量表示FockSpace具体空间二次量子化使用的 Fock 空间TensorProductHilbertSpace组合空间多个空间的张量积用*表示DirectSumHilbertSpace组合空间多个空间的直和用表示TensorPowerHilbertSpace组合空间空间的张量幂用**表示其中TensorProductHilbertSpace、DirectSumHilbertSpace与TensorPowerHilbertSpace在文档结构上属于主对象Main objects与HilbertSpace一同构成模块核心。值得注意的是模块整体继承自 SymPy 核心的Basic类因此所有空间对象天然具备符号表达式的语义支持subs替换、参与打印体系、可作为符号表达式参与运算。二、抽象基类 HilbertSpace空间对象的共同契约2.1 基本行为HilbertSpace是一个抽象基类本身不可实例化出有意义的维度——它的dimension属性直接抛出NotImplementedError(This Hilbert space has no dimension.)见 hilbert.py#L67-L70要求子类必须实现。但基类本身可以直接构造一个未指定维度的抽象空间对象 from sympy.physics.quantum.hilbert import HilbertSpace hs HilbertSpace() hs H其字符串表示为单个大写字母H_sympystr返回Hpretty 打印为大写拉丁字母 HLaTeX 输出为\mathcal{H}这是全模块统一的打印约定。2.2 运算符重载模块的核心设计HilbertSpace基类通过重载 Python 运算符定义了空间组合的语法糖这是整个模块最核心的设计见 hilbert.py#L72-L88__add__/__radd__hs1 hs2→DirectSumHilbertSpace(hs1, hs2)即直和__mul__/__rmul__hs1 * hs2→TensorProductHilbertSpace(hs1, hs2)即张量积__pow__hs ** n→TensorPowerHilbertSpace(hs, n)即张量幂若传入第三个参数mod会抛出ValueError明确提示不支持 Hilbert 空间的第三个幂参数。这意味着用户无需手动构造组合空间类直接用熟悉的算术运算符即可描述复合系统。2.3 成员测试基于类的比较__contains__用于判断某个算符或态是否属于该 Hilbert 空间。其实现是比较 Hilbert 空间的类class而非实例见 hilbert.py#L90-L100def __contains__(self, other): if other.hilbert_space.__class__ self.__class__: return True else: return False源码注释解释了这一设计动机当空间维度是符号symbolic时不同实例之间无法精确比较因此退化为按类归属判断允许带符号维度的空间正常工作。同时它要求被测试对象具有hilbert_space属性——这正是下一节实际应用中QExpr体系的接入点。三、三种具体 Hilbert 空间3.1 ComplexSpace有限维复向量空间ComplexSpace(dimension)表示 n 维复值向量空间其内积对右侧向量取复共轭。典型的物理图像见 hilbert.py#L113-L143自旋 1/2 系统ComplexSpace(2)推广到自旋 sComplexSpace(2*s1)N 个 qubit 的量子计算系统直积空间ComplexSpace(2)**N。维度参数既可以是具体整数也可以是符号这正是dimension属性返回self.args[0]的原因 from sympy import symbols from sympy.physics.quantum.hilbert import ComplexSpace c1 ComplexSpace(2) c1 C(2) c1.dimension 2 n symbols(n) c2 ComplexSpace(n) c2 C(n) c2.dimension n维度校验逻辑eval类方法见 hilbert.py#L153-L166会对维度做严格检查当维度只有一个原子atom时必须是正整数、oo无穷或Symbol否则抛出TypeError当维度是复合表达式如2*n时其每个原子必须是整数、oo或Symbol。打印方面字符串形式为C(2)pretty 打印为 C 的上标形式LaTeX 为\mathcal{C}^{%s}。3.2 L2区间上的平方可积函数空间L2(interval)表示定义在某个区间上的平方可积函数构成的 Hilbert 空间其构造参数必须是 SymPy 的Interval实例否则抛出TypeError(L2 interval must be an Interval instance)见 hilbert.py#L210-L215 from sympy import Interval, oo from sympy.physics.quantum.hilbert import L2 hs L2(Interval(0, oo)) hs L2(Interval(0, oo)) hs.dimension oo hs.interval Interval(0, oo)dimension恒为oo无限维interval属性返回构造时传入的区间。由于 L2 空间天然对应连续变量位置、动量体系它是 cartesian.py 中位置/动量算符所属空间的直接来源——这一点将在第五节详述。测试还验证了区间端点可以是符号L2(Interval(x, y))在x -1替换后得到L2(Interval(-1, y))见 test_hilbert.py#L37-L48。3.3 FockSpace二次量子化的空间FockSpace()表示二次量子化second quantization对应的 Fock 空间。从数学上讲Fock 空间是单粒子 Hilbert 空间的直积的无限直和结构复杂因此模块直接用一个类来整体表示见 hilbert.py#L241-L262 from sympy.physics.quantum.hilbert import FockSpace hs FockSpace() hs F hs.dimension ooFock 空间无构造参数维度恒为oo字符串表示为FLaTeX 为\mathcal{F}。测试确认任意两个FockSpace()实例相等f1 f2为 True见 test_hilbert.py#L51-L56这得益于其无参构造与Basic的相等语义。四、三种组合空间张量积、直和与张量幂4.1 TensorProductHilbertSpace用*组合系统张量积对应多个子系统的复合数学上写作H1 ⊗ H2。模块用*运算符表示TensorProductHilbertSpace接受任意数量的HilbertSpace参数见 hilbert.py#L286-L327 from sympy.physics.quantum.hilbert import ComplexSpace, FockSpace from sympy import symbols c ComplexSpace(2) f FockSpace() hs c*f hs C(2)*F hs.dimension oo hs.spaces (C(2), F) c1 ComplexSpace(2) n symbols(n) c2 ComplexSpace(n) hs c1*c2 hs C(2)*C(n) hs.dimension 2*n自动化简逻辑是eval方法见 hilbert.py#L336-L379的亮点分两步展平flatten若参数本身是TensorProductHilbertSpace则将其参数展开合并进新列表参数必须是HilbertSpace或TensorPowerHilbertSpace否则抛TypeError合并同类项相邻且相同的空间自动合并为张量幂——两个相同的ComplexSpace(2)相乘会得到C(2)**2而非保持乘积形式TensorPowerHilbertSpace与同底数空间相邻时指数自动相加。维度计算各因子维度相乘若任一因子维度为oo整体维度即oo见 hilbert.py#L381-L387。spaces属性返回各子空间元组。4.2 TensorPowerHilbertSpace用**表示重复张量积TensorPowerHilbertSpace(base, exp)用**运算符表示接受空间与张量幂指数两个参数见 hilbert.py#L553-L589 n symbols(n) c ComplexSpace(2) hs c**n hs C(2)**n hs.dimension 2**n c ComplexSpace(2) c*c C(2)**2 f FockSpace() c*f*f C(2)*F**2指数化简规则见evalhilbert.py#L597-L617hs**1简化为hs本身hs**0简化为标量1即S.One指数为单个原子时必须是非负整数或Symbol否则抛ValueError指数为复合表达式时其每个原子必须是整数或Symbol。base、exp属性分别返回底空间与指数维度计算为base.dimension ** exp底空间维度为oo时结果恒为oo见 hilbert.py#L627-L632。测试用例覆盖了hs1**2维度 4与hs2**3符号维度n**3等场景见 test_hilbert.py#L80-L95。4.3 DirectSumHilbertSpace用表示直和直和对应互斥/分块的系统结构数学上写作H1 ⊕ H2模块用运算符表示见 hilbert.py#L443-L472 from sympy.physics.quantum.hilbert import ComplexSpace, FockSpace c ComplexSpace(2) f FockSpace() hs cf hs C(2)F hs.dimension oo list(hs.spaces) [C(2), F]其eval见 hilbert.py#L480-L498同样会展平嵌套的DirectSumHilbertSpace参数并要求所有参数必须是HilbertSpace子类。维度计算为各因子维度求和任一因子为oo则整体为oo见 hilbert.py#L500-L506。测试验证了hs1 f hs2会被展平为(hs1, f, hs2)三元素直和见 test_hilbert.py#L98-L111。五、打印体系str / pretty / LaTeX 的完整覆盖作为Basic子类每个空间类都实现了_sympystr、_pretty、_latex三套打印方法便于在不同输出环境交互式 shell、文档、Notebook下获得一致美观的数学符号。汇总如下空间字符串prettyUnicodeLaTeXHilbertSpace()HH\mathcal{H}ComplexSpace(2)C(2)C 上标 2\mathcal{C}^{2}L2(Interval(0, oo))L2(Interval(0, oo))L 上标 2{\mathcal{L}^2}( ... )FockSpace()FF\mathcal{F}c*fC(2)*F带 ⊗ 符号\otimes连接cfC(2)F带 ⊕ 符号\oplus连接c**nC(2)**n上标带 ⊗{\mathcal{C}}^{\otimes n}组合空间的打印有两点值得注意见 hilbert.py#L394-L440 与 hilbert.py#L513-L550张量积/直和中的子项若是嵌套组合空间会被自动加上括号以保证歧义消除pretty 打印中 Unicode 模式使用⊗N-ARY CIRCLED TIMES OPERATOR与⊕CIRCLED PLUSASCII 模式退化为x与。六、模块的真实应用量子态与算符如何关联 Hilbert 空间hilbert 模块不是孤立存在的它是整个sympy.physics.quantum体系的空间层通过QExpr的hilbert_space属性与所有量子对象挂钩。QExpr是所有算符与态的基类在__slots__中声明了hilbert_space并在__new__中通过_eval_hilbert_space(args)动态计算见 qexpr.py#L86-L136。默认情况下未覆盖_eval_hilbert_space的对象归属于抽象空间H例如QExpr(0).hilbert_space输出H。各子模块通过覆写_eval_hilbert_space将具体物理系统映射到上述空间类量子计算qubitqubit.py#L81-L83 中QubitState._eval_hilbert_space返回ComplexSpace(2)**len(args)即 N 个 qubit 对应C(2)⊗N与文档中量子计算用ComplexSpace(2)**N的论述完全吻合位置与动量连续变量cartesian.py#L52-L54 中XOp._eval_hilbert_space返回L2(Interval(-oo, oo))即一维位置算符所在的空间是实轴上的平方可积函数空间自旋spinspin.py 中自旋 j 的态空间为ComplexSpace(2*j 1)见 spin.py#L956-L957而耦合表象下的系统会用DirectSumHilbertSpace描述多个不可约分量的直和见 spin.py#L1483-L1493二次量子化boson/fermionboson.py 与 fermion.py 中的产生湮灭算符通过_eval_hilbert_space归属到 Fock 空间表象转换represent.py#L443-L444 在构造连续表象的矩阵表示时会读取basis_op.hilbert_space.interval.start/end说明L2的interval属性直接参与数值离散化的边界计算。从源码结构可以推断HilbertSpace的__contains__成员测试正是为这套hilbert_space属性机制设计的任何算符/态对象通过other.hilbert_space暴露所属空间从而支持空间归属判定。七、验证与测试模块的行为由 sympy/physics/quantum/tests/test_hilbert.py 完整覆盖共 6 组测试函数测试函数验证内容test_hilbert_space基类构造、str/srepr 输出H/HilbertSpace()test_complex_space整数维度、符号维度、subs替换、str/repr 输出test_L2具体/符号区间、维度恒为oo、subs替换test_fock_space维度为oo、实例相等性test_tensor_product张量积类型、维度乘积、合并为张量幂、含 Fock 空间时维度为ootest_tensor_power/test_direct_sum指数与维度计算、直和展平与维度求和此外sympy/core/tests/test_args.py 也会遍历该模块的所有类进行Basic参数一致性检查确保各空间类符合 SymPy 核心表达式体系的不变量。若需在本地复现可直接运行python -m pytest sympy/physics/quantum/tests/test_hilbert.py八、综合示例构建一个复合量子系统综合以上内容可以用几十行代码完成一个复合系统的空间描述一个由 2 个 qubit 与一个自旋 1/2 粒子组成的系统其总空间是ComplexSpace(2)**2 ⊗ ComplexSpace(2)from sympy import Interval, oo, symbols from sympy.physics.quantum.hilbert import ( ComplexSpace, L2, FockSpace, TensorProductHilbertSpace, DirectSumHilbertSpace, TensorPowerHilbertSpace, ) # 2-qubit 系统C(2)**2 two_qubits ComplexSpace(2)**2 print(two_qubits) # C(2)**2 print(two_qubits.dimension) # 4 # 张量积自动合并相同空间 print(ComplexSpace(2) * ComplexSpace(2)) # C(2)**2 # 复合系统qubit 对 自旋 1/2 coupled two_qubits * ComplexSpace(2) print(coupled) # C(2)**2*C(2) print(coupled.dimension) # 8 # 直和互斥通道 alt ComplexSpace(2) L2(Interval(0, oo)) print(alt) # C(2)L2(Interval(0, oo)) print(alt.dimension) # ooL2 维度无穷 # 符号维度 张量幂 n symbols(n) print((ComplexSpace(n)**3).dimension) # n**3该示例展示了模块的全部核心能力自动合并、符号维度、无穷维空间传播以及组合空间的维度代数。九、小结sympy.physics.quantum.hilbert模块以HilbertSpace为根通过运算符重载把张量积*、直和、张量幂**映射为直观的 Python 语法配合ComplexSpace、L2、FockSpace三类具体空间为 SymPy 的量子力学框架提供了统一的符号化空间模型。理解本模块后读者可以进一步探索 qubit、spin、cartesian 等子模块是如何通过_eval_hilbert_space挂钩到这些空间上的从而把握整个sympy.physics.quantum包的空间层设计。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表