
SymPy 量子力学表示模块 represent 全解析态与算符在任意基下的展开【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy本篇技术指南围绕 SymPy 计算机代数系统纯 Python 实现的符号计算库中的量子力学表示模块展开讲解如何通过represent系列函数将抽象的量子态Ket/Bra与算符Operator投影到指定的基底下得到列向量、行向量、矩阵或连续波函数表达式。读完本文你将掌握represent的调用方式、_represent_FooBasis分发约定、连续基下的 DiracDelta 结果处理、三种矩阵输出格式sympy/numpy/scipy.sparse的切换以及如何自定义新的基表示方法从而把量子符号计算无缝衔接数值计算。模块定位与文档说明SymPy 的量子力学子模块位于sympy/physics/quantum/其中represent.py是该子模块的表示层核心它提供了一套统一接口把抽象态矢/算符翻译成具体基下的坐标表示。模块的官方 API 文档位于doc/src/modules/physics/quantum/represent.rst该文档通过 Sphinxautomodule指令直接提取represent.py中的 docstring 生成因此本文的内容骨架函数清单、参数说明、示例与源码 docstring 一一对应并且可以沿源码继续追溯底层实现。模块公开的顶层接口定义在represent.py的__all__中共 6 个函数函数作用represent顶层入口遍历表达式树将其中所有量子对象表示为指定基下的形式rep_innerproduct以内积形式如x|x表示给定的 Ket/Brarep_expectation以期望值形式如x|A|x表示给定算符integrate_result对连续基表示结果中的单位元|xx|做积分消去冗余坐标get_basis根据表达式与参数推导/构造基态实例enumerate_states为基态追加哑指标dummy index生成一组态表示Representation的核心思想量子力学中同一个抽象态或算符可以选择不同的基矢展开。represent函数完成的正是这种换基操作源码 docstringKet → 列向量或函数波函数Bra → 行向量或函数共轭波函数Operator → 矩阵或微分算符其实现策略是represent遍历 SymPy 表达式树寻找所有带有_represent方法的QExpr实例调用该方法并用返回的表示替换原对象。而QExpr._represent定义于qexpr.py会通过dispatch_method按基底名称动态分发到形如以下命名约定的方法def _represent_FooBasis(self, e, basis, **options)也就是说想定义某个量子对象在FooBasis类表示的基下的形式只需实现名为_represent_FooBasis的方法框架会自动按基底类名完成路由。若未指定基底则回落到_represent_default_basis。快速上手自定义自旋 1/2 例子原文档给出的最小完整示例展示了这一约定对应represent.py的 docstring 示例 from sympy.physics.quantum import Operator, represent, Ket from sympy import Matrix class SzUpKet(Ket): ... def _represent_SzOp(self, basis, **options): ... return Matrix([1, 0]) ... class SzOp(Operator): ... pass ... sz SzOp(Sz) up SzUpKet(up) represent(up, basissz) Matrix([ [1], [0]])这里我们自定义了一个z 方向自旋算符SzOp和它的自旋向上本征态SzUpKet。通过给SzUpKet定义_represent_SzOp方法represent(up, basissz)就能在 z 自旋基下把它表示为列向量Matrix([1, 0])。这演示了表示机制的两个关键点基底通过basis参数传入具体的表示逻辑完全由对象的_represent_BasisName方法决定框架只负责分发与组装。represent顶层接口详解represent(expr, **options)是模块的门面函数其完整签名与参数语义源码expr待表示的量子表达式可以是单个QExpr也可以是Add、Mul、Pow、TensorProduct、Dagger、Commutator、AntiCommutator、OuterProduct、InnerProduct等组合结构。basis基底信息。传入算符时默认取其正交归一的本征矢作为基底也可传入任意包含基底信息的对象甚至是基底类的StateBase实例。options键值对选项透传给底层表示方法例如基底规模态的数量就在这里指定。表达式树遍历逻辑represent对不同类型的顶层表达式采用不同的处理分支源码单个QExpr且非OuterProduct先尝试expr._represent(**options)若抛出NotImplementedError即没有对应的_represent_FooBasis则回退到兜底策略Ket/Bra 走rep_innerproductOperator 走rep_expectation。Add对每一项分别represent后相加。Pow对底数表示后求幂在numpy格式下使用np.linalg.matrix_power在scipy.sparse格式下使用_scipy_sparse_matrix_power负指数会先求逆再幂见源码中的兼容处理。TensorProduct对各因子分别表示后再组回TensorProduct。Dagger先表示内部对象再取共轭。Commutator/AntiCommutator展开成A*B ∓ B*A的差/和再递归表示。Mul/OuterProduct/InnerProduct从最后一项开始逆序逐个表示并按矩阵乘法规则numpy 用np.matmulscipy.sparse 用其余用*累积结果同时借助index与unities两个内部选项跟踪连续基下自动插入的单位元|xx|最后调用flatten_scalar把 1×1 矩阵压成标量再交给integrate_result完成积分。这种设计保证了表示操作对任意嵌套的量子表达式都是可组合的——矩阵基下天然得到矩阵积连续基下则得到含DiracDelta的符号表达式。连续基示例位置算符与位置态原文档中对应的连续基示例源码 docstring from sympy.physics.quantum.cartesian import XOp, XKet, XBra X XOp() x XKet() y XBra(y) represent(X*x) x*DiracDelta(x - x_2)represent(X*x)表示位置算符作用在位置态上结果是x*DiracDelta(x - x_2)——一个含狄拉克 δ 函数的连续表达式。该结果的来源可追溯到cartesian.py中位置/动量类族的定义XKet._eval_innerproduct_XBra返回DiracDelta(self.position - bra.position)XOp与PxOp之间满足对易关系[X, Px] i·hbar而XOp._represent_PxKet、PxOp._represent_XKet则给出动量基下的微分算符表示# cartesian.py 中 XOp 的动量基表示 return I*hbar*(d*delta) # d 为 DifferentialOperatordelta 为 DiracDelta这些内置的表示方法构成了坐标-动量X/Px这对最常见连续基的完整表示体系位置本征态、动量本征态以及两者之间的傅里叶变换关系都由此产生。基底的推导get_basis 与 operators_to_stateget_basis(expr, *, basisNone, replace_noneTrue, **options)源码负责解析基底到底是什么有三种行为分支options中的basis已是StateBase实例 → 直接返回若给出的是类而非实例 → 构造默认实例。basis是算符或算符集合 → 通过operators_to_state映射到对应的本征态。未指定基底 → 若expr是态返回其类的默认实例若是算符映射到对应态否则无法获得基底。映射依赖operatorset.py中的全局字典state_mapping源码 L37-L43state_mapping { JxKet: frozenset((J2Op, JxOp)), JyKet: frozenset((J2Op, JyOp)), JzKet: frozenset((J2Op, JzOp)), Ket: Operator, PositionKet3D: frozenset((XOp, YOp, ZOp)), PxKet: PxOp, XKet: XOp }operators_to_state与state_to_operators互为逆映射且同时接受类和实例两种形态的输入。例如 from sympy.physics.quantum.cartesian import XOp, PxOp from sympy.physics.quantum.operatorset import operators_to_state operators_to_state(XOp) |x operators_to_state(PxOp()) |px正因如此get_basis(x, basisPxOp())会返回|px原文档示例即用动量算符指定基底时位置态x就被投影到动量基下。get_basis的完整示例源码 docstring x XKet() X XOp() get_basis(x) |x get_basis(X) |x get_basis(x, basisPxOp()) |px get_basis(x, basisPxKet) |px兜底表示rep_innerproduct 与 rep_expectation当某个对象没有实现_represent_FooBasis时represent会自动降级为内积或期望值表示这两个函数也可以被独立调用。rep_innerproductx|x形式的表示rep_innerproduct(expr, **options)源码只接受KetBase或BraBase实例其思路是用enumerate_states从基底生成两个带指标的态构造InnerProduct(bra, ket)并调用.doit()求值。连续基下的结果正是内积函数本身 from sympy.physics.quantum.represent import rep_innerproduct from sympy.physics.quantum.cartesian import XOp, XKet, PxOp, PxKet rep_innerproduct(XKet()) DiracDelta(x - x_1) rep_innerproduct(XKet(), basisPxOp()) sqrt(2)*exp(-I*px_1*x/hbar)/(2*sqrt(hbar)*sqrt(pi)) rep_innerproduct(PxKet(), basisXOp()) sqrt(2)*exp(I*px*x_1/hbar)/(2*sqrt(hbar)*sqrt(pi))可见位置基下位置本征态的内积是 DiracDelta而位置态与动量态之间的内积是平面波傅里叶核这正是量子力学教科书中的标准结果。这些结果背后是cartesian.py中_eval_innerproduct_XBra/_eval_innerproduct_PxBra的实现。rep_expectationx|A|x形式的表示rep_expectation(expr, **options)源码用于算符同样借助enumerate_states取两个基态构造qapply(bra*expr*ket)计算矩阵元 from sympy.physics.quantum.cartesian import XOp, PxOp, PxKet from sympy.physics.quantum.represent import rep_expectation rep_expectation(XOp()) x_1*DiracDelta(x_1 - x_2) rep_expectation(XOp(), basisPxOp()) px_2|*X*|px_1 rep_expectation(XOp(), basisPxKet()) px_2|*X*|px_1注意在动量基下表示位置算符X时由于cartesian.py中 X 的动量表示是微分算符I*hbar*d/dp其结果以px_2|*X*|px_1这样的符号期望值形式保留而非数值矩阵。连续基结果的积分处理integrate_result在连续基下represent对乘积型表达式如X*x表示时会自动在相邻算符与态之间插入单位元|xx|产生多个指标变量x_1、x_2等。integrate_result(orig_expr, result, **options)源码负责把这类冗余的坐标积分掉它通过state_to_operators取回基底算符利用其hilbert_space.interval获得积分区间位置/动量都是全实数轴(-∞, ∞)对出现在结果中的每个哑坐标执行integrate(result, (coord, start, end))。原文档中的示例源码 docstring from sympy import symbols, DiracDelta from sympy.physics.quantum.represent import integrate_result from sympy.physics.quantum.cartesian import XOp, XKet x_ket XKet() X_op XOp() x, x_1, x_2 symbols(x, x_1, x_2) integrate_result(X_op*x_ket, x*DiracDelta(x-x_1)*DiracDelta(x_1-x_2)) x*DiracDelta(x - x_1)*DiracDelta(x_1 - x_2) integrate_result(X_op*x_ket, x*DiracDelta(x-x_1)*DiracDelta(x_1-x_2), ... unities[1]) x*DiracDelta(x - x_2)可以看到当显式传入unities[1]时integrate_result对x_1积分利用 δ 函数的筛选性质把DiracDelta(x-x_1)*DiracDelta(x_1-x_2)化简为DiracDelta(x-x_2)。这正是represent(X*x)能得到简洁结果x*DiracDelta(x - x_2)的关键一环。unities与index这两个内部选项由represent在遍历Mul时自动维护源码 L231-L251普通使用者通常无需手动干预。态枚举enumerate_statesenumerate_states(*args, **options)源码为基底态生成带哑指标的实例列表支持两种调用模式两个参数enumerate_states(state, [4, 5, 10])——第二个参数是指标列表。三个参数enumerate_states(state, start, num)——指定起始指标与数量。其内部尝试调用state._enumerate_state失败则返回空列表。连续 1D 基底的实现位于cartesian.py的_enumerate_continuous_1D做法是把原 label 字符串拼接_index生成新态例如XKet(foo)枚举出|foo_1, |foo_2, |foo_3。原文档示例 from sympy.physics.quantum.cartesian import XBra, XKet from sympy.physics.quantum.represent import enumerate_states test XKet(foo) enumerate_states(test, 1, 3) [|foo_1, |foo_2, |foo_3] test2 XBra(bar) enumerate_states(test2, [4, 5, 10]) [bar_4|, bar_5|, bar_10|]输出格式sympy / numpy / scipy.sparse 三态切换represent通过options中的format键控制结果类型默认sympyformat 值返回类型典型用途sympysympy.Matrix或符号表达式纯符号计算、进一步化简numpynumpy.ndarray数值矩阵运算、数值模拟scipy.sparsescipy.sparse稀疏矩阵大规模稀疏量子系统格式转换由qexpr.py的_format_represent完成底层使用matrixutils.py的to_sympy/to_numpy/to_scipy_sparse。需要注意的是在 numpy/scipy 格式下非量子数值标量会被_sympy_to_scalar转成 Python 标量sympy模块内部函数见represent.pyL45-L54因此represent(Integer(1), formatnumpy)返回1而非Integer(1)。Pow在 numpy/scipy 格式下会走np.linalg.matrix_power或稀疏矩阵快速幂负指数在 scipy 格式下需先inv求逆源码中已给出 SciPy 1.12 的兼容降级实现。这些行为都有对应测试覆盖见test_represent.py中的test_format_sympy、test_format_numpy、test_format_scipy_sparse以及三个test_scalar_*测试测试同时验证了 Bra/Ket/Operator、Dagger、OuterProduct、TensorProduct、Pow、Add/Mul、对易子、反对易子、内积等各类表达式的表示结果一致。与其它量子模块的协作represent不是孤立存在的它与量子子模块的多个组件协同工作qapplyrep_expectation内部使用qapply(bra*expr*ket)完成算符对态的作用与化简qapply.py。InnerProductrep_innerproduct构造并求解内积innerproduct.py。Dagger对 Bra/Ket 表示结果取共轭dagger.py。TensorProduct张量积的表示按因子分别展开tensorproduct.py。Operator/State基类Operator._represent、State系列的默认表示方法都在operator.py与state.py中定义所有具体算符/态类自旋spin.py、一维谐振子sho1d.py、无限深势阱piab.py、量子门gate.py、量子比特qubit.py等都是通过实现各自的_represent_FooBasis来接入这一框架的。扩展指南为新基底添加表示支持如果你想为自己的算符/态类接入表示框架参照源码约定只需三步定义态与算符类分别继承sympy.physics.quantum.state.Ket/Bra与sympy.physics.quantum.operator.Operator实现default_args、dual_class等必要接口。实现_represent_FooBasis方法签名固定为def _represent_FooBasis(self, basis, **options)其中FooBasis是目标基底类名返回Matrix、numpy.ndarray、scipy.sparse矩阵或符号表达式同时可用options中的format判断输出类型。可选注册映射若希望basisYourOp()能自动推导基底态把态-算符对加入operatorset.py的state_mapping并实现_operators_to_state/_state_to_operators类方法参考cartesian.py中XKet的写法。完成上述步骤后represent(your_expr, basisyour_basis)、rep_innerproduct、rep_expectation等入口会自动识别你的新类型无需改动框架代码——这也是整个表示模块约定优于配置的设计精髓。小结SymPy 量子表示模块以represent.py为枢纽通过_represent_BasisName方法命名约定实现了高度可扩展的换基机制单个态/算符的表示、复合表达式的递归展开、连续基下单位元积分化简、三种矩阵格式的输出以及从算符自动推导基底态的双向映射构成了一个完整、自洽且可验证的量子力学表示体系。无论是做教科书习题的符号推导还是把量子算符投影成数值矩阵接入模拟流程这个模块都能提供统一的入口。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考