ARTICLE DETAIL

资讯详情

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

SymPy 量子力学算符模块 operator 详解:从 Operator 基类到外积与微分算符

SymPy 量子力学算符模块 operator 详解:从 Operator 基类到外积与微分算符 SymPy 量子力学算符模块 operator 详解从 Operator 基类到外积与微分算符【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy本篇技术指南以 SymPy 仓库 operator.rst 所渲染的sympy.physics.quantum.operator模块为绝对主体系统讲解量子力学中非对易算符在纯 Python 计算机代数系统 SymPy 中的符号化实现。你将掌握Operator、HermitianOperator、UnitaryOperator、OuterProduct、DifferentialOperator等核心类的构造方式、代数性质、伴随与求逆行为以及如何借助qapply让算符真正作用于量子态并得到解析结果。一、模块定位量子力学算符的符号化基座sympy.physics.quantum.operator是 SymPy 量子力学子包sympy/physics/quantum的核心模块之一。在量子力学中算符是作用在量子态上的数学对象可观测物理量含测量值由厄米算符表示。该模块为非对易、不可交换的量子算符提供了一整套符号代数设施其公开 API 由__all__明确列出见 operator.py__all__ [ Operator, HermitianOperator, UnitaryOperator, IdentityOperator, OuterProduct, DifferentialOperator ]这些类均可通过from sympy.physics.quantum import *或from sympy.physics.quantum.operator import Operator直接导入sympy/physics/quantum/init.py 统一将六个类注册到包级命名空间。二、类继承体系与公共基础设施整个模块的继承关系可以概括为Expr └── QExpr # 所有量子对象的基类sympy/physics/quantum/qexpr.py └── Operator # 非对易算符基类 ├── HermitianOperator # 厄米算符自伴算符 ├── UnitaryOperator # 酉算符 ├── IdentityOperator # 单位算符自 1.14 起废弃 ├── OuterProduct # 右矢|ket⟩与左矢⟨bra|的外积 └── DifferentialOperator # 微分算符 d/dx2.1 QExpr所有量子对象的根QExprqexpr.py是所有量子对象算符与态的公共基类它为算符提供了三项关键基础设施label属性对象的唯一标识元组通常包含除时间以外的全部量子数信息qexpr.py。例如Operator(A).label返回(A,)。hilbert_space槽对象所属的希尔伯特空间由_eval_hilbert_space在构造时自动计算qexpr.py默认是通用HilbertSpace()在__new__中被写入__slots__。is_commutative False量子对象默认不满足交换律这是整个量子符号代数的前提qexpr.py。default_args未传参时返回的默认标签元组Operator重写为(O,)operator.py因此Operator() Operator(O)。字符串标签在构造时经_qsympify_sequence转为Symbol而非 sympify目的正是保证像pi这样的名字保持为符号而不会意外变成内置数值常量qexpr.py。2.2 Operator非对易算符基类Operatoroperator.py是非对易量子算符的基类。其类级标记is_hermitian: bool | None None与is_unitary: bool | None Noneoperator.py以None表示未知由子类显式覆盖为True。基本构造与属性 from sympy.physics.quantum import Operator from sympy import I A Operator(A) A A A.hilbert_space H A.label (A,) A.is_commutative False算符代数运算算符之间支持加减乘与幂运算且严格遵守非对易规则 B Operator(B) C 2*A*A I*B C 2*A**2 I*B A*B B*A False展开多项式时同样尊重对易关系不交换A、B的次序 e (AB)**3 e.expand() A*B*A A*B**2 A**2*B A**3 B*A*B B*A**2 B**2*A B**3从源码结构看(AB)**2展开为A**2 A*B B*A B**2这种保留次序的行为在测试 test_operator.py 中被显式断言测试同时验证了A*(BC) A*B A*C的分配律。符号求逆算符的逆以符号形式处理inv()是inverse()的别名operator.py A.inv() A**(-1) A*A.inv() 1测试test_operator_inv进一步断言A*A.inv() 1且A.inv()*A 1test_operator.py。注意逆的符号化简成立的前提是A**(-1)与A对易同一算符的幂自然对易这正是Pow层面的处理结果。对易子/反对易子的派发钩子Operator定义了_eval_commutator与_eval_anticommutatoroperator.py它们通过dispatch_method按other的类型派发到对应子类的实现供 Commutator 与AntiCommutator在求值.doit()时调用。例如对单位算符_eval_commutator直接返回S.Zero、_eval_anticommutator返回2*otheroperator.py。打印体系Operator重写了三套打印方法字符串、pretty、LaTeX。当标签长度为 1 时直接打印标签如A多标签时打印为类名(标签)形式例如Jz(1,1)operator.py。_label_separator ,控制标签分隔符。三、厄米算符 HermitianOperatorHermitianOperatoroperator.py表示满足H Dagger(H)的厄米算符可观测量的数学表示。它只需将is_hermitian置为Trueoperator.py from sympy.physics.quantum import Dagger, HermitianOperator H HermitianOperator(H) Dagger(H) H其底层机制Daggerdagger.py是通用厄米共轭操作__new__优先调用参数的adjoint()方法HermitianOperator继承QExpr._eval_adjoint沿Expr体系传播hilbert_spaceqexpr.py最终因为is_hermitianTrue而化简为自身。HermitianOperator还重写了_eval_inverse与_eval_poweroperator.py若同时是UnitaryOperator例如量子门XGate逆等于自身_eval_power对酉且厄米的算符做幂化简偶数次幂等于恒等元S.One奇数次幂等于自身其谱只含 1 与 -1见 Issue 24153 的注释。测试 test_operator.py 断言Dagger(H) H、H.inv() ! H且厄米算符及其共轭均非对易。四、酉算符 UnitaryOperatorUnitaryOperatoroperator.py表示满足U·Dagger(U) 1的酉算符时间演化、量子门等。关键实现是_eval_adjoint返回_eval_inverse()operator.py即酉算符的共轭等于逆 from sympy.physics.quantum import Dagger, UnitaryOperator U UnitaryOperator(U) U*Dagger(U) 1测试同时断言U.inv() Dagger(U)、Dagger(U)*U 1test_operator.py。test_eval_power中进一步验证了酉厄米的门算符如XGate(0)满足X**n 1n 为偶数、X**n Xn 为奇数、X**4 1等幂规律test_operator.py这直接来自HermitianOperator._eval_power的化简逻辑。五、单位算符 IdentityOperator自 1.14 起废弃IdentityOperatoroperator.py满足对任意算符op * I I * op op。构造时可选整数N指定希尔伯特空间维度用于生成矩阵表示operator.py from sympy.physics.quantum import IdentityOperator IdentityOperator() # doctest: SKIP I重要变更自 SymPy 1.14 起该类已废弃deprecated_since_version1.14官方建议使用标量S.One作为算符与态的乘法恒等元operator.py。因此现代代码应写A * S.One A而非A * IdentityOperator()。其余实现要点N默认为oo无限维dimension属性返回self.Noperator.py_apply_operator返回原 ket、_apply_from_right_to返回原 bra即作用在态上不改变态operator.py_represent_default_basis在有限维时返回eye(self.N)单位矩阵无限维则抛NotImplementedErroroperator.py打印为ILaTeX 为{\mathcal{I}}operator.py。测试 test_operator.py 完整覆盖了I*O O、I*x x、I.inv() I、Dagger(I) I、qapply下的行为以及represent(IdentityOperator(n)) eye(n)n 取 2、3、5并确认调用会触发废弃警告。六、外积算符 OuterProduct|ket⟩⟨bra|OuterProductoperator.py构造任意KetBase与BraBase之间的未求值外积|a⟩⟨b|它本身是算符可在量子表达式中充当算子。构造参数为左端 ket 与右端 bra from sympy.physics.quantum import Ket, Bra, OuterProduct, Dagger k Ket(k) b Bra(b) op OuterProduct(k, b) op |kb| op.hilbert_space H op.ket |k op.bra b| Dagger(op) |bk|自动识别与优先级规则在量子表达式中k*b会被自动识别为外积 k*b |kb|但内积的创建优先级高于外积 b*k*b b|k*b|__new__中的优先级逻辑operator.py还包含若干约束与分发要求恰好 2 个参数否则抛ValueError要求 ket 侧为KetBase或其Mul、bra 侧为BraBase或其Mul否则抛TypeError要求 ket 与 bra 互为对偶类kets[0].dual_class() bras[0].__class__否则抛TypeError系数会被拆出args_cnc如OuterProduct(2*k, b) 2*OuterProduct(k, b)ket 或 bra 为Add叠加态时按分配律展开为外积之和例如OuterProduct(k1k2, b1) OuterProduct(k1,b1) OuterProduct(k2,b1)。这些规则在 test_operator.py 中有成体系的断言覆盖包括缩放 ket/bra、双变量叠加展开系数 3、4、6、8 的乘积分配等。数学操作_eval_adjointDagger(OuterProduct(k, b)) OuterProduct(Dagger(b), Dagger(k))即转置并取共轭、交换左右operator.py_represent外积的矩阵表示等于ket的表示乘以bra的表示列向量乘行向量得到矩阵operator.py_eval_traceTr(|j,m⟩⟨j,m|).doit() 1支持求迹operator.py测试见 test_operator.py。七、微分算符 DifferentialOperator对波函数求导DifferentialOperatoroperator.py用于表示微分算符如 d/dx是唯一真正作用出数值结果的算符类型。它通过两个参数初始化expr含函数的任意表达式如1/x*Derivative(f(x), x)func要替换为Wavefunction的函数如f(x)。基本用法 from sympy import Derivative, Function, Symbol from sympy.physics.quantum.operator import DifferentialOperator from sympy.physics.quantum.state import Wavefunction from sympy.physics.quantum.qapply import qapply f Function(f) x Symbol(x) d DifferentialOperator(1/x*Derivative(f(x), x), f(x)) w Wavefunction(x**2, x) d.function f(x) d.variables (x,) qapply(d*w) Wavefunction(2, x)作用过程qapply触发_apply_operator_Wavefunctionoperator.py将expr中的f(x)替换为波函数x**2后执行.doit()求导1/x * d/dx(x**2) 2最后包装为新的Wavefunction。三个核心属性variables返回函数所依赖的变量元组operator.py。一维(x,)二维偏导数场景返回(x, y)function返回待替换的函数operator.pyexpr返回含导数的任意表达式operator.py。此外free_symbols直接代理self.expr.free_symbolsoperator.py。高阶与多维场景测试 test_operator.py 提供了丰富的验证包括二阶导Derivative(f(x), x, 2)作用在Wavefunction(x**3, x)上得到Wavefunction(6*x, x)二维笛卡尔拉普拉斯算符∂²/∂x² ∂²/∂y²作用在x**3*y**2 y**3*x**2上得到2*x**3 6*x*y**2 6*x**2*y 2*y**3二维极坐标拉普拉斯算符1/r·∂/∂r(r·∂/∂r) 1/r²·∂²/∂θ²作用在r**2*sin(θ)上得到3*sin(θ)diff(d, x)返回新的DifferentialOperator即对算符整体再求导_eval_derivativeoperator.py。八、让算符真正生效qapply 与 Dagger8.1 qapply把算符作用到态上qapplyqapply.py是驱动算符作用于量子态的总入口。它会递归遍历表达式树找到作用在态上的算符并完成替换。核心选项选项默认值作用daggerFalse是否尝试将Dagger算符向左作用ip_doitTrue遇到内积时调用.doit()sum_doitFalse对遇到的求和调用.doit()有助于塌缩qapply产生的 Kronecker delta 求和处理流程qapply.py先按e.kind判断是否为纯数值数值直接短路返回接着expand(commutatorTrue, tensorproductTrue)展开表达式包括(ABC)|a⟩、A(|a⟩|b⟩)、Commutator 与 TensorProduct然后按节点类型递归原始 ket 直接返回、Add逐项qapply、Density/TensorProduct/Sum对其子对象递归。典型用法外积作为投影算符 from sympy.physics.quantum import qapply, Ket, Bra b Bra(b); k Ket(k) A k * b # |kb| qapply(A * b.dual / (b * b.dual)) |k qapply(k.dual * A / (k.dual * k)) b|8.2 Dagger厄米共轭运算Daggerdagger.py是通用厄米共轭操作。对矩阵等价于转置加复共轭对量子对象它正确分发了各种反线性规则 A Operator(A); B Operator(B) Dagger(A*B) Dagger(B)*Dagger(A) Dagger(AB) Dagger(A) Dagger(B) Dagger(A**2) Dagger(A)**2它同时无缝处理复数与矩阵Dagger(Matrix([[1,I],[2,I]]))得到转置共轭矩阵并且Dagger(Commutator(A,B)) -[Dagger(A),Dagger(B)]对易子取共轭反号见 commutator.py 的 doctest。test_operator_dagger对乘积、求和与幂的共轭规则做了完整断言test_operator.py。九、快速上手示例将上述知识串联成一段完整可运行的示例from sympy import I, Derivative, Function, Symbol from sympy.physics.quantum import ( Operator, HermitianOperator, UnitaryOperator, Ket, Bra, OuterProduct, Dagger, qapply ) # 1) 非对易算符代数 A, B Operator(A), Operator(B) assert A*B ! B*A assert (AB)**3 # 2) 厄米与酉算符的共轭/求逆 H HermitianOperator(H) U UnitaryOperator(U) assert Dagger(H) H # H† H assert U.inv() Dagger(U) # U⁻¹ U† # 3) 外积投影算符 k, b Ket(k), Bra(b) P OuterProduct(k, b) assert P.ket k and P.bra b assert Dagger(P) OuterProduct(b, k) # 4) 微分算符作用于波函数 f, x Function(f), Symbol(x) d DifferentialOperator(Derivative(f(x), x), f(x)) w Wavefunction(x**2, x) assert qapply(d*w) Wavefunction(2*x, x)十、扩展阅读算符与态的相互作用态与内积见 state.rstKet/Bra/Wavefunction驱动算符求值见 qapply.rst对易子与反对易子见 commutator.rst 与 anticommutator.rst共轭运算见 dagger.rst矩阵表示与期望值见 represent.rstrepresent、rep_expectation希尔伯特空间见 hilbert.rst测试佐证本模块全部行为均有测试覆盖见 test_operator.py。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表