SymPy 量子力学模块中的一维粒子于盒中(Particle in a Box)建模与计算指南

发布时间:2026/9/15 17:42:10
SymPy 量子力学模块中的一维粒子于盒中(Particle in a Box)建模与计算指南
SymPy 量子力学模块中的一维粒子于盒中Particle in a Box建模与计算指南【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy一维无限深势阱粒子于盒中Particle in a Box是量子力学中最基础的解析模型之一。SymPy 在sympy.physics.quantum.piab子模块中将其抽象为完备的 Hilbert 空间、哈密顿算符、本征矢与本征左矢四个层次用户可以直接以符号方式计算本征能量、本征波函数与正交归一内积。本文以仓库中的官方文档 piab.rst 为骨架结合模块源码 piab.py 与测试用例 test_piab.py完整讲解该模型的 API 结构、物理含义、源码实现与实战用法。一、文档定位与模块概览在 SymPy 文档体系中该模型归属于「Quantum Mechanics」物理量子模块位于官方文档索引 index.rst 的「Analytic Solutions解析解」小节下与cartesian连续位置本征态、sho1d一维谐振子等模型并列用于演示如何用 Dirac 记号把教科书中的解析解系统地编码成可计算的符号对象。文档正文通过automodule指令自动收集模块中所有公开成员的 docstring.. automodule:: sympy.physics.quantum.piab :members:因此真正承载技术内容的是 piab.py 中的源码注释与类结构。该模块的 docstring 只有一句话1D quantum particle in a box.而它暴露的 API 由__all__声明为三个核心类型__all__ [ PIABHamiltonian, PIABKet, PIABBra ]此外模块在顶层预定义了物理符号m Symbol(m)粒子质量与L Symbol(L)势阱宽度它们是所有能量表达式与波函数表达式中的参数。二、物理背景一维无限深势阱的标准解在深入 API 之前先明确该模型对应的物理图像一个质量为m的粒子被限制在长度L的一维区间内运动区间外势能无穷大。定态薛定谔方程的标准解析解为本征能量能级E_n n²·π²·ħ² / (2·m·L²)其中n 1, 2, 3, …本征波函数位置表象ψ_n(x) √(2/L) · sin(n·π·x/L)正交归一性⟨ψ_i|ψ_j⟩ δ_ijKronecker deltaSymPy 的 piab 模块把这套教科书公式逐条落到了三个类上PIABHamiltonian负责能级本征方程PIABKet/PIABBra负责波函数及其正交归一内积hbar约化普朗克常数来自 constants.py 模块在符号结果中以符号形式保留。三、Hilbert 空间平方可积函数空间 L2PIABHamiltonian、PIABKet、PIABBra三个类都通过重载_eval_hilbert_space类方法声明自己的希尔伯特空间return L2(Interval(S.NegativeInfinity, S.Infinity))也就是说本模型的所有状态都生活在区间(-∞, ∞)上的平方可积函数空间L2中。L2类定义在 hilbert.py其 docstring 明确指出L2 是「定义在某个区间上的平方可积函数」构成的希尔伯特空间构造参数必须是 SymPy 的Interval实例。 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)关键行为点若构造参数不是IntervalL2.__new__会直接抛出TypeError(L2 interval must be an Interval instance).dimension属性恒为oo无穷维.interval属性返回定义区间。对于 piab 模型Hilbert 空间被声明为全实数区间L2(Interval(-oo, oo))这与教科书上势阱波函数只在(0, L)内非零、其余处取 0 的边界条件是一致的——波函数本身定义在全实轴上只是在阱外恒为零。测试 test_piab.py 中第一行断言即验证了这一点assert PIABHamiltonian(H).hilbert_space \ L2(Interval(S.NegativeInfinity, S.Infinity))四、哈密顿算符 PIABHamiltonian本征能量与 qapplyPIABHamiltonian继承自HermitianOperator定义于 operator.py构造方式与普通量子算符一致需要传入一个标签字符串H PIABHamiltonian(H)4.1 作用于本征态能量本征方程该类的核心是重载了_apply_operator_PIABKet方法它实现了算符对 ket 的作用规则def _apply_operator_PIABKet(self, ket, **options): n ket.label[0] return (n**2*pi**2*hbar**2)/(2*m*L**2)*ket这里ket.label[0]取出本征态的量子数n返回(n²π²ħ²)/(2mL²)·|n⟩——正是教科书中的能级公式E_n n²π²ħ²/(2mL²)。也就是说PIABHamiltonian作用在任意本征态上都会把它映射为「能级系数 × 原态」即本征方程H|n⟩ E_n|n⟩的符号化实现。由于该算子是以「_apply_operator_StateClass」的命名约定注册的它会被 qapply.py 中的qapply函数自动识别并触发。测试中的完整验证为assert qapply(PIABHamiltonian(H)*PIABKet(n)) \ (n**2*pi**2*hbar**2)/(2*m*L**2)*PIABKet(n)4.2 实操示例from sympy.physics.quantum import qapply, hbar from sympy.physics.quantum.piab import PIABHamiltonian, PIABKet, m, L from sympy import symbols, pi n symbols(n) H PIABHamiltonian(H) ket_n PIABKet(n) result qapply(H * ket_n) print(result) # n**2*pi**2*hbar**2/(2*L**2*m)*|n输出表达式中的hbar、m、L、n全部保持为符号可以继续参与后续的符号运算例如代入具体数值求能级E_n (result / ket_n) # 提出系数得到能级 print(E_n.subs({n: 1, m: 1, L: 1, hbar: 1})) # pi**2/2五、本征 ketPIABKet 与位置表象波函数PIABKet继承自Ket定义于 state.py表示势阱中量子数n对应的本征右矢|n⟩。构造方式ket PIABKet(n)5.1 波函数的符号表示PIABKet重载了_represent_default_basis与_represent_XOp两个方法把抽象的右矢投影到位置X基底下得到具体的波函数def _represent_default_basis(self, **options): return self._represent_XOp(None, **options) def _represent_XOp(self, basis, **options): x Symbol(x) n Symbol(n) subs_info options.get(subs, {}) return sqrt(2/L)*sin(n*pi*x/L).subs(subs_info)其返回的√(2/L)·sin(n·π·x/L)正是教科书中的位置表象波函数ψ_n(x)。这里有两个值得注意的实现细节_represent_default_basis被定义为默认基为 X 基底因此不带任何基底参数调用represent也会得到波函数_represent_XOp接受subs选项可以对结果中的符号做一次性替换例如把n代入具体量子数。5.2 实操示例from sympy.physics.quantum import represent from sympy.physics.quantum.piab import PIABKet from sympy import symbols, sin, sqrt, pi n, x symbols(n x) print(represent(PIABKet(n))) # sqrt(2/L)*sin(pi*n*x/L)若取基态n1并设定单位制可以快速得到具体的波函数图像数据源psi_1 represent(PIABKet(n)).subs({n: 1, L: 1}) # sqrt(2)*sin(pi*x)测试 test_piab.py 对represent的断言为assert represent(PIABKet(n)) sqrt(2/L)*sin(n*pi*x/L)六、本征 bra 与内积PIABBra、正交归一性PIABBra继承自Bra是PIABKet的共轭对偶对象二者通过dual_class()相互绑定PIABKet.dual_class()返回PIABBraPIABBra.dual_class()返回PIABKet这保证了Dagger(PIABKet(n))能得到对应的 bra测试中的验证为assert PIABKet(n).dual_class() PIABBra assert PIABBra(n).dual_class() PIABKet6.1 正交归一内积KroneckerDeltaPIABKet重载了_eval_innerproduct_PIABBra方法实现了两个本征态的内积规则def _eval_innerproduct_PIABBra(self, bra): return KroneckerDelta(bra.label[0], self.label[0])即⟨i|j⟩ δ_ij——不同能级的本征态正交同一能级归一。KroneckerDelta来自 KroneckerDelta 符号函数sympy.functions.special.tensor_functions可在.doit()之后化简为 0 或 1。6.2 实操示例from sympy.physics.quantum.piab import PIABKet, PIABBra from sympy import symbols i, j symbols(i j) inner PIABBra(i) * PIABKet(j) print(inner) # i|j print(inner.doit()) # KroneckerDelta(i, j)代入具体量子数可得到数值结论print((PIABBra(1) * PIABKet(2)).doit()) # 0正交 print((PIABBra(2) * PIABKet(2)).doit()) # 1归一测试中的断言为assert (PIABBra(i)*PIABKet(j)).doit() KroneckerDelta(i, j)七、从源码结构看模型设计模式从 piab.py 的源码可以归纳出 SymPy 量子模块对「可解析量子系统」的三条通用设计约定Hilbert 空间声明约定每个算符/态类重载_eval_hilbert_space类方法声明自己的希尔伯特空间供hilbert_space属性与后续张量积、直和运算使用算符作用规则约定算符类以_apply_operator_StateClassName命名重载方法注册对各态类的作用规则由qapply统一调度执行见 qapply.py本模块中即_apply_operator_PIABKet表示与内积约定态类重载_represent_Basis系列方法定义到各基底的投影重载_eval_innerproduct_BraClassName定义与对偶态的内积分别被 represent.py 中的represent与内积运算识别。这套约定与cartesian连续位置本征态、sho1d一维谐振子等兄弟模块保持一致因此熟悉本模块后可以迅速迁移到 SymPy 中其他可解析量子系统。八、官方测试一键验证所有行为仓库在 test_piab.py 中提供了完整的单元测试覆盖了本模块的全部对外行为是理解与验证模型的权威参照def test_H(): assert PIABHamiltonian(H).hilbert_space \ L2(Interval(S.NegativeInfinity, S.Infinity)) assert qapply(PIABHamiltonian(H)*PIABKet(n)) \ (n**2*pi**2*hbar**2)/(2*m*L**2)*PIABKet(n) def test_states(): assert PIABKet(n).dual_class() PIABBra assert PIABKet(n).hilbert_space \ L2(Interval(S.NegativeInfinity, S.Infinity)) assert represent(PIABKet(n)) sqrt(2/L)*sin(n*pi*x/L) assert (PIABBra(i)*PIABKet(j)).doit() KroneckerDelta(i, j) assert PIABBra(n).dual_class() PIABKet在仓库根目录运行python -m pytest sympy/physics/quantum/tests/test_piab.py -v即可逐条验证Hilbert 空间类型、本征方程、波函数表示、正交归一内积与对偶绑定。九、小结与进一步阅读piab模块是 SymPy 把「教科书解析解 → 可计算符号 API」这一思路落地的范例三个类分别承载能级、右矢与左矢Hilbert 空间统一为L2全部公式以m、L、n、hbar等符号参数保留可直接参与后续符号推导与数值代入。如果希望深入理解本模块依赖的量子力学基础设施建议继续阅读以下仓库文件operator.pyHermitianOperator等算符基类state.pyKet、Bra等态基类与对偶机制hilbert.pyL2及其他 Hilbert 空间类型represent.pyrepresent表示函数的调度逻辑qapply.pyqapply算符作用函数的调度逻辑量子模块文档索引查看该模型在文档体系中的位置及同类的解析模型文档。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考