Sympy physics.vector 深度解析:向量、参考系与刚体运动学的符号化建模

📅 发布时间:2026/9/14 18:22:53
Sympy physics.vector 深度解析:向量、参考系与刚体运动学的符号化建模
Sympy physics.vector 深度解析向量、参考系与刚体运动学的符号化建模【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy在 sympy 中sympy.physics.vector是为三维空间向量运算包括随时间变化的向量提供符号化支持的物理模块它是sympy.physics体系内处理参考系ReferenceFrame、向量Vector、点Point、二重积Dyadic与向量场运算的核心组件也是sympy.physics.mechanics等上层动力学模块的数学基础。读完本文你将能够在 sympy 中用ReferenceFrame、orient、dynamicsymbols等 API 完整描述多参考系系统的姿态与运动学使用点定理方法求解点速度与加速度并对标量/向量场执行梯度、散度、旋度与势函数计算——本文所有代码示例均取自该模块官方解释文档实现细节均可在sympy/physics/vector/源码目录中查证。模块定位与文档骨架官方解释文档 index.rst 的开篇即点明模块设计目的the components of the sympy.physics.vector have been discussed. sympy.physics.vector has been written to facilitate the operations pertaining to 3-dimensional vectors, as functions of time or otherwise, in sympy.physics.该文档以 toctree 组织了四个子文档构成了理解本模块的完整骨架文档相对路径覆盖主题Vector ReferenceFramevectors.rst向量代数、参考系、方向余弦矩阵DCM、多参考系微分Kinematicskinematics.rst角速度、导数定理、1 点/2 点定理、点在参考系中的速度加速度Scalar and Vector Fieldfields.rst坐标符号CoordinateSym、curl/divergence/gradient、保守场与无散场Advanced Topicsadvanced.rstDyadic、常见问题打印/替换/加速度、高级接口、向量方程求解官方引用文献index.rst包括 Likins, Peter W.《Elements of Engineering Mechanics》(McGraw-Hill, 1973) 以及关于 Dyadics 与 Dyadic Product 的参考条目可视为该模块数学表述的出处。从源码结构看模块的公开 API 集中在 sympy/physics/vector/__init__.py 中导出的符号分为六类核心类型CoordinateSym、ReferenceFrameframe.py、Dyadicdyadic.py、Vectorvector.py、Pointpoint.py函数接口cross、dot、express、time_derivative、outer、kinematic_equations、get_motion_params、partial_velocity、dynamicsymbolsfunctions.py打印工具vprint、vsstrrepr、vsprint、vpprint、vlatex、init_vprintingprinting.py场运算curl、divergence、gradient、is_conservative、is_solenoidal、scalar_potential、scalar_potential_differencefieldfunctions.py。对应测试分布在 sympy/physics/vector/tests/ 下包括test_frame.py、test_vector.py、test_point.py、test_dyadic.py、test_fieldfunctions.py、test_printing.py等逐类覆盖了上述 API。Vector 与 ReferenceFrame模块的积木块官方文档将向量与参考系称为动态系统的 building blocks积木块。数学上向量是既有大小又有方向的几何对象两个向量当且仅当大小与取向相同时相等。向量代数支持的基本运算包括加法满足平行四边形法则交换律与结合律成立数乘结果方向不变、模长缩放乘以 -1 等价于绕任意垂直轴旋转 180 度单位向量任意向量v可写为单位向量n̂_v v/‖v‖ 与标量之积三种乘积点积映射为标量交换律成立、叉积返回向量反交换律a×b -b×a不满足结合律平行向量叉积为零、外积在惯性矩/Dyadic 一节使用。常用恒等式包括分配律、标量三重积的轮换对称性(a × b) · c a · (b × c) (b × c) · a以及双叉积展开式(a × b) × c b(a · c) - a(b · c)等。基向量与测度数给定三个非共面单位向量n̂_x,n̂_y,n̂_z 构成基通常互正交且右手系即正交归一基任意向量可写成a a_xn̂_x a_yn̂_y a_zn̂_z其中 a_x、a_y、a_z 称为测度数measure numbers。此时各运算有了分量形式点积a·b a_x b_x a_y b_y a_z b_z叉积行列式形式 | n̂_x n̂_y n̂_z; a_x a_y a_z; b_x b_y b_z |标量三重积(a × b) · c 即 3×3 测度数矩阵的行列式将向量写进指定基a (a·n̂_x)n̂_x (a·n̂_y)n̂_y (a·n̂_z)n̂_z。官方文档给出的数值示例a n̂_x 5n̂_yb n̂_y αn̂_za b n̂_x 6n̂_y αn̂_za · b 5a × b 5αn̂_x − αn̂_y n̂_zb × a -5αn̂_x αn̂_y − n̂_z可在 sympy/physics/vector/tests/test_vector.py 中找到对应的自动化验证。向量微分与参考系向量微积分的引入源于一个朴素观察火车上的两名乘客互为静止但相对站外观察者都有速度——同一向量的变化率依赖于观察所在的参考系。参考系 N 是一块虚拟的观察平台每个参考系配一组固定的正交基如 N 配 n̂_x, n̂_y, n̂_z。向量 e 若在参考系 B 中固定则 B 中其导数为零而在 A 中一般非零因此微分记号必须显式带上参考系^A d e/dθ ≠ 0 e 关于 θ 在参考系 A 中的导数 ^B d e/dθ 0 e 关于 θ 在参考系 B 中的导数向量微分满足与标量类似的结构加法线性、乘积法则^A d/dt (γa) (dγ/dt)a γ ^A d a/dt、叉积乘积法则^A d/dt (a × b) (^A d a/dt) × b a × (^A d b/dt)。方向余弦矩阵DCM与简单旋转两个参考系的联系用方向余弦矩阵DCM描述[â_x] [ A C B ] [b̂_x] [â_y] | | [b̂_y] [â_z] [ ] [b̂_z]当两参考系绕某一基向量方向做简单旋转如绕 Z 轴转 θ此时 â_z 与 b̂_z 仍对齐时DCM 有封闭形式绕 Z 轴、X 轴、Y 轴的旋转矩阵分别为文档 vectors.rst 中给出的三个 3×3 矩阵正方向由右手定则定义。DCM 的每个元素就是对应基向量的点积如 C_xy â_x · b̂_y且正交性保证了 ^A C^B (^B C^A)^(-1) (^B C^A)^T。官方文档用一个完整的例子展示了 DCM 的实际价值在绕 Z 轴相差 θ 的两个参考系中向量b b̂_x b̂_y b̂_z 在 A 系中表达为 (cos θ − sin θ)n̂_ax (sin θ cos θ)n̂_ay n̂_az。更进一步文档强调了一个对动力学建模极其重要的实践结论同一导数结果用不同基表达时复杂度差异巨大——把 ^A d c/dt 先按 A 系基展开再换回 B 系可得到更简洁的 ṫx b̂_x − θ̇x b̂_z 形式用复杂形式定义向量会显著拖慢运动方程的建立并使其冗长到无法显示这是该模块设计表达系概念的直接动机。代码使用从参考系创建到多参考系微分官方文档刻意在所有数学关系讲完后才引入代码。第一步永远是创建参考系 from sympy.physics.vector import * N ReferenceFrame(N) N.x # 基向量访问 N.x N.y N.y N.z N.z向量代数层面 N.x N.x True N.x N.y False N.x N.y N.x N.y 2 * N.x N.y 2*N.x N.y from sympy import Symbol, symbols x Symbol(x) x * N.x x*N.x文档特别提醒不要把标量加到向量上N.x 5会报错。向量乘法提供了运算符、方法、函数三级接口 N.x.dot(N.x) # 方法接口 1 N.x.dot(N.y) 0 dot(N.x, N.y) # 函数接口官方推荐 0 N.x.cross(N.x) 0 N.x.cross(N.z) - N.y cross(N.x, (N.y N.z)) -N.y N.z (N.x N.y).normalize() sqrt(2)/2*N.x sqrt(2)/2*N.y (N.x N.y).magnitude() sqrt(2) (x * N.x 2 * x * N.y 3 * x * N.z).to_matrix(N) Matrix([ [ x], [2*x], [3*x]])文档明确指出函数接口是官方接口所有示例都采用它原因是运算符层面的优先级不正确用运算符写向量乘法时必须格外注意括号。to_matrix(frame)将向量转成列矩阵常用于数值场景由于矩阵本身不携带参考系信息必须显式传入参考系。向量微分方面SymPy 的diff目前不能直接作用于Vector因为它无法表达在哪个参考系中求导这一必要参数应使用Vector的diff方法第二参数为参考系或dt (x * N.x N.y).diff(x, N) N.x引入第二个参考系后未定义姿态关系前只能做加法而不能做向量乘法 A ReferenceFrame(A) A.x N.x N.x A.x要定义姿态用orient方法A.orient(N, Axis, [x, N.y])表示 A 相对 N 绕 Y 轴简单旋转 x 弧度此后随时可用A.dcm(N)查看 DCM ^A C^N。除 Axis 外还支持 Body 旋转、Space 旋转、四元数和任意轴旋转。文档给出了一段很有代表性的等价性示例三次 Axis 串联旋转Bpp 绕 N.x 转 q1Bp 绕 Bpp.y 转 q2B 绕 Bp.z 转 q3得到的N.dcm(B)矩阵与直接执行B.orient(N, Body, [q1, q2, q3], XYZ)的结果逐元素相同。Space 旋转则从系到体应用关键约束是每次简单旋转必须绕不同的轴ZZX 这样的序列无法完全确定基向量姿态对应 frame.py 中 orient 系列的实现测试见 test_frame.py。orientnew是创建并取向的一步式封装C N.orientnew(C, Axis, [q1, N.x])。四元数Euler 参数与任意轴旋转的完整用法见orient/orientnew的方法文档。dynamicsymbols 与向量打印多参考系微分需要时间的未定函数dynamicsymbols就是为此设计的快捷函数 from sympy import diff q1, q2, q3 dynamicsymbols(q1 q2 q3) diff(q1, Symbol(t)) Derivative(q1(t), t)默认打印不够直观模块提供向量专用打印工具非交互会话用vprint交互会话用init_vprinting与 SymPy 的vprint/vpprint/latex分别对应vprint/vpprint/vlatex q1d diff(q1, Symbol(t)) vprint(q1) q1 vprint(q1d) q1 from sympy.physics.vector import init_vprinting init_vprinting(pretty_printFalse) q1d q1文档要求任何时变量坐标、速度、力都应表示为 dynamicsymbol。有了它多参考系微分变得直接 N ReferenceFrame(N) B N.orientnew(B, Axis, [q1, N.x]) (B.y*q2 B.z).diff(q2, N) B.y (B.y*q2 B.z).dt(N) (-q1 q2)*B.y q2*q1*B.z注意输出向量保持在其原有参考系中即使向量含多个参考系的基向量也成立(B.y*q2 B.z q2*N.x).diff(q2, N)返回N.x B.y。源码视角Vector 是如何存储的官方文档专门有一节 How Vectors are Coded可对照 vector.py 理解每个Vector的主要信息存在args属性中一个列表元素个数等于该向量分量中出现的唯一参考系数量含 A、B 两系基向量为长度 2三系则为 3每个元素是一个二元组(Matrix, ReferenceFrame)——SymPy 矩阵存该系下的测度数参考系指明归属向量在代码中必须先有ReferenceFrame才能存在参考系的x/y/z属性是不可变Vector测度数分别为 [1,0,0]、[0,1,0]、[0,0,1]一切新向量都由基向量的代数运算生成ReferenceFrame存名字name属性与 DCM 字典键为参考系、值为 SymPyMatrix。取向是双向设置的——A取向到N时A 的字典加入 N 及其矩阵N 的字典同时加入 A 及该矩阵的转置。Kinematics角速度、导数定理与点定理运动学文档 kinematics.rst 给出了刚体运动的数学框架刚体运动分解为平动与转动转动再分为简单转动总有一条线保持平行与一般转动。角速度与加法定理刚体 B 在参考系 N 中的角速度记作 ^N ω^B参考系同样可以有角速度。它可由基向量导数严格定义^N ω^B ((^N d b̂_y/dt) · b̂_z) b̂_x ((^N d b̂_z/dt) · b̂_x) b̂_y ((^N d b̂_x/dt) · b̂_y) b̂_z角速度满足加法定理^N ω^D ^N ω^A ^A ω^B ^B ω^C ^C ω^D。这意味着多体系统中每个体只需相对上一体定义角速度即可完成完整描述例如 ^N ω^D q̇_1 â_x − q̇_2 b̂_z q̇_3 ĉ_y。文档特别强调该定理只适用于角速度不能用于点的速度。另一个常用工具是导数定理^N d v/dt ^B d v/dt ^N ω^B × v。先在 v 的主场参考系 B 中求导通常 v 由 B 系基向量组成求导最简再加角速度与 v 的叉积。角加速度 ^N α^B ^N d(^N ω^B)/dt用导数定理展开后当角速度以体固连分量 ω_x b̂_x ω_y b̂_y ω_z b̂_z 表示时自叉积项恒为零退化为简单的 α ω̇_x b̂_x ω̇_y b̂_y ω̇_z b̂_z。点的速度与加速度1 点定理与 2 点定理点 P 有三类特征量位置向量 r^OP不带参考系因为无时间导数、速度 ^N v^P、加速度 ^N a^P。平动速度没有加法定理因此文档给出两个定理2 点定理S、P 均固定在刚体 B 上已知 ^N v^S 与 ^N ω^B ^N v^P ^N v^S ^N ω^B × r^SP ^N a^P ^N a^S ^N α^B × r^SP ^N ω^B × (^N ω^B × r^SP)。1 点定理仅 S 固定在 B 上另已知 ^B v^P ^N v^P ^B v^P ^N v^S ^N ω^B × r^SP 加速度项中额外包含科里奥利项 2 ^N ω^B × ^B v^P。文档配了三个经典算例平面内平动加转动的圆盘求 P 点速度 u_1 n̂_x u_2 n̂_y u_3 R b̂_y 与加速度 … − R u_3² b̂_x R u̇_3 b̂_y、双摆两次套用 2 点定理得 ^N v^P u_1 l b̂_y u_2 l ĉ_y、粒子在可旋转圆环上运动先 2 点定理求环心 Q 速度再 1 点定理求 P 速度最终 ^N v^P −R u_2 sin q_2 ĉ_x (R u_2 cos q_2 u_1 l) ĉ_y R u_1 sin q_2 ĉ_z以及无滑滚动的定义两接触点在另一参考系中速度相同当且仅当无滑滚动。运动学在代码中的表达 from sympy import Symbol, sin, cos from sympy.physics.vector import * init_vprinting(pretty_printFalse) N ReferenceFrame(N) q1 dynamicsymbols(q1) A N.orientnew(A, Axis, [q1, N.x]) A.ang_vel_in(N) q1*N.x值得注意的实现细节orientnew创建参考系时会用 DCM 的时间导数按角速度定义自动计算角速度。也可显式设置 B ReferenceFrame(B) u1 dynamicsymbols(u1) B.set_ang_vel(N, u1 * B.y) B.ang_vel_in(N) u1*B.y N.ang_vel_in(B) - u1*B.y角速度链式传递 N ReferenceFrame(N) A ReferenceFrame(A); B ReferenceFrame(B) C ReferenceFrame(C); D ReferenceFrame(D) u1, u2, u3 dynamicsymbols(u1 u2 u3) A.set_ang_vel(N, 0) B.set_ang_vel(A, u1 * A.x) C.set_ang_vel(B, -u2 * B.z) D.set_ang_vel(C, u3 * C.y) D.ang_vel_in(N) u1*A.x - u2*B.z u3*C.y从源码结构看frame.py 中角速度存储与查询逻辑查询D.ang_vel_in(N)时模块使用两参考系间的最短路径拼接角速度。官方文档也提示了一个陷阱如果之后又执行D.set_ang_vel(N, 0)最短路径就变成这条直接定义导致与原有链式定义不一致——应避免此类混用。Point是平动的类比对象创建方式与ReferenceFrame对称先建后set_pos或一步locatenew O Point(O) P O.locatenew(P, 3 * N.x N.y) P.pos_from(O) 3*N.x N.y Q Point(Q) Q.set_pos(P, N.z) Q.pos_from(O) 3*N.x N.y N.z位置向量同样按最短路径中间点个数最少查找而速度必须显式设定加速度默认取速度的时间导数、也可覆盖 O.set_vel(N, u1*N.x) O.vel(N) u1*N.x O.acc(N) u1*N.x O.set_acc(N, u2*u1*N.y) O.acc(N) u1*u2*N.y2 点/1 点定理对应Point的方法v2pt_theory、a2pt_theory、v1pt_theorypoint.py。圆盘算例的代码化 N ReferenceFrame(N) u1, u2, u3 dynamicsymbols(u1 u2 u3) R Symbol(R) B ReferenceFrame(B) O Point(O) O.set_vel(N, u1 * N.x u2 * N.y) P O.locatenew(P, R * B.x) B.set_ang_vel(N, u3 * B.z) P.v2pt_theory(O, N, B) u1*N.x u2*N.y R*u3*B.y P.a2pt_theory(O, N, B) u1*N.x u2*N.y - R*u3**2*B.x R*u3*B.y圆环粒子算例1 点定理 N ReferenceFrame(N) u1, u2 dynamicsymbols(u1 u2) q1, q2 dynamicsymbols(q1 q2) l Symbol(l); R Symbol(R) C N.orientnew(C, Axis, [q1, N.x]) C.set_ang_vel(N, u1 * N.x) O Point(O); O.set_vel(N, 0) Q O.locatenew(Q, -l * C.z) P Q.locatenew(P, R * (cos(q2) * C.x sin(q2) * C.y)) P.set_vel(C, R * u2 * (-sin(q2) * C.x cos(q2) * C.y)) Q.v2pt_theory(O, N, C) l*u1*C.y P.v1pt_theory(Q, N, C) -R*u2*sin(q2)*C.x (R*u2*cos(q2) l*u1)*C.y R*u1*sin(q2)*C.z标量场与向量场fields.rst 从物理概念入手标量质量、电荷、温度、距离只有大小向量位移、速度、磁场有大小和方向。以位移 3î 4ĵ 5k̂ 为例其模为 √50 5√2方向由单位向量 (3/5√2)î (4/5√2)ĵ (5/5√2)k̂ 给出。场是空间中处处可指定的向量或标量本模块只处理三维空间因此场定义为 (x, y, z) 的函数——例如电势 T(x,y,z) 是标量场重力加速度场 g(x,y,z) 是向量场。场在模块中的实现每个ReferenceFrame实例除x/y/z基向量外还被赋予三个坐标符号CoordinateSym本质是特殊的 SymPySymbol用R[0]、R[1]、R[2]访问字符串表示分别为R_x、R_y、R_z from sympy.physics.vector import ReferenceFrame R ReferenceFrame(R) v 3*R.x 4*R.y 5*R.z # 向量 electric_potential 2*R[0]**2*R[1] # 标量场 2*x^2*y electric_potential 2*R_x**2*R_y标量场就是普通 SymPy 表达式可直接用diff求偏导对应电场的 X 分量 4xy from sympy import diff diff(electric_potential, R[0]) 4*R_x*R_y与向量类似标量场也可换参考系表达——前提是两系间已定义取向关系。express函数把variables参数设为True即可连坐标符号一起替换 from sympy.physics.vector import dynamicsymbols, express q dynamicsymbols(q) R1 R.orientnew(R1, rot_typeAxis, amounts[q, R.z]) express(electric_potential, R1, variablesTrue) 2*(R1_x*sin(q(t)) R1_y*cos(q(t)))*(R1_x*cos(q(t)) - R1_y*sin(q(t)))**2标量场同样可以随时间变化time_derivative的结果取决于表达式中的符号与所选参考系 from sympy.physics.vector import time_derivative time_derivative(electric_potential, R) 0 time_derivative(electric_potential, R1).simplify() # 2*(...)*Derivative(q(t), t) 形式非零场算子curl、divergence、gradient三个场算子的实现集中在 fieldfunctions.py数学定义与调用方式如下。旋度描述向量场中无穷小旋转方向由右手定则给出∇ × F (∂F_z/∂y − ∂F_y/∂z) î (∂F_x/∂z − ∂F_z/∂x) ĵ (∂F_y/∂x − ∂F_x/∂y) k̂ from sympy.physics.vector import curl field R[0]*R[1]*R[2]*R.x curl(field, R) R_x*R_y*R.y - R_x*R_z*R.z散度度量某点处源/汇的带符号标量强度作用结果恒为标量∇ · F ∂U/∂x ∂V/∂y ∂W/∂z from sympy.physics.vector import divergence field R[0]*R[1]*R[2] * (R.x R.y R.z) divergence(field, R) R_x*R_y R_x*R_z R_y*R_z梯度是标量场三个偏导数构成的向量 from sympy.physics.vector import gradient scalar_field R[0]*R[1]*R[2] gradient(scalar_field, R) R_y*R_z*R.x R_x*R_z*R.y R_x*R_y*R.z保守场、无散场与标量势保守场是某标量场的梯度其线积分只依赖端点、与路径无关保守场必无旋旋度为零。is_conservative用于判定 from sympy.physics.vector import is_conservative, is_solenoidal field R[1]*R[2]*R.x R[0]*R[2]*R.y R[0]*R[1]*R.z is_conservative(field) True curl(field, R) 0**无散场solenoidal field**是处处散度为零的向量场用is_solenoidal判定上例中divergence(field, R)同样为 0。scalar_potential由保守场反求标量势自然相差一个积分常数传入非保守场会抛出ValueError from sympy.physics.vector import scalar_potential conservative_field (4*R[0]*R[1]*R[2]*R.x 2*R[0]**2*R[2]*R.y ... 2*R[0]**2*R[1]*R.z) scalar_potential(conservative_field, R) 2*R_x**2*R_y*R_z势差scalar_potential_difference计算保守场两个空间点之间标量势的差是保守场线积分的快捷方式 from sympy.physics.vector import Point, scalar_potential_difference O Point(O) P O.locatenew(P, 1*R.x 2*R.y 3*R.z) vectfield 4*R[0]*R[1]*R.x 2*R[0]**2*R.y scalar_potential_difference(vectfield, R, O, P, O) 4若传入标量表达式而非向量场该函数退化为标量场在两点处的差值。上述功能的回归测试见 sympy/physics/vector/tests/test_fieldfunctions.py。高级主题Dyadic、常见问题与隐藏接口advanced.rst 覆盖模块的进阶能力与已知坑。Dyadic二重积在sympy.physics.mechanics中Dyadic 用于表示惯性。Dyadic 是两个向量的外积是单位 Dyadic 的线性多项式类比向量是单位向量的线性多项式â_x ⊗ â_x 写作 â_x â_x顺序有意义左向量当列、右向量当行。基本性质包括标量提取 (xv) ⊗ w v ⊗ (xw) x(v ⊗ w) 与对加法的分配律。Dyadic 可用 3×3 张量或八项 Dyadic 和表示每个 Dyadic 项的两个分量可以来自不同参考系â_x ⊗ b̂_y 合法从而保留相对于哪个系定义的信息。Dyadic 可与向量点乘/叉乘顺序影响结果如 â_x â_y · â_x 0â_x × â_y â_x â_z â_x也可像向量一样做时间导数和换系表达。实现见 dyadic.py测试见 test_dyadic.py。常见问题文档列出了三类实战经验打印默认对Vector和Dyadic的测度数排序而vprint/vpprint/vlatex输出不排序。打印大型表达式时务必使用后三者——排序可能把打印时间从秒级拖到分钟级替换对大型表达式做 substitution 可能耗时数分钟点的加速度点至少要有速度定义加速度可由同参考系下速度求时间导数得到。但若速度是用 1 点/2 点定理算出的对速度再求导得到的加速度通常比直接用加速度级别的 1 点/2 点定理如a2pt_theory更复杂——先用加速度级定理可以得到更短的表达式后续如构建 Kane 方程都会受益。高级接口ReferenceFrame支持自定义基向量下标与 LaTeX 字符串 from sympy.physics.vector import ReferenceFrame, vprint, vpprint, vlatex N ReferenceFrame(N, indices[i, j, k]) N[i] N[i] N.x N[i] vlatex(N.x) \\mathbf{\\hat{n}_{i}} N ReferenceFrame(N, latexs[n1, \\mathbf{n}_2, cat]) vlatex(N.x) n1 vlatex(N.y) \\mathbf{n}_2dynamicsymbols还有隐藏功能修改dynamicsymbols._t可改变关联的时间变量dynamicsymbols._str可改变导数的打印记号 q1 dynamicsymbols(q1) # q1(t) dynamicsymbols._t symbols(T) q2 dynamicsymbols(q2) # q2(T) q1 # q1(t)不受影响 q1d dynamicsymbols(q1, 1) vprint(q1d) # q1 dynamicsymbols._str d vprint(q1d) # q1d dynamicsymbols._str \ dynamicsymbols._t symbols(t) # 恢复默认注意两点_t的修改只影响之后创建的 dynamicsymbol而_str只影响打印对已有符号同样生效另外Vector.dt方法会读取dynamicsymbols._t不要混用不同的时间符号。解向量方程不能直接对向量调用solve需要先把向量方程转成标量方程组。典型场景N 与 A 两系相差绕 z 轴 30 度同一向量的两套分量符号之间求换算关系 from sympy import pi, symbols, solve from sympy.physics.vector import ReferenceFrame N ReferenceFrame(N) A ReferenceFrame(A) A.orient_axis(N, pi / 6, N.z) v1x, v1y, v1z symbols(v1x v1y v1z) v2x, v2y, v2z symbols(v2x v2y v2z) v1 v1x * N.x v1y * N.y v1z * N.z v2 v2x * A.x v2y * A.y v2z * A.z solve((v1 - v2).to_matrix(N), [v2x, v2y, v2z]) {v2x: sqrt(3)*v1x/2 v1y/2, v2y: -v1x/2 sqrt(3)*v1y/2, v2z: v1z}关键手法正是前面介绍过的to_matrix(frame)差向量在指定参考系下化为列矩阵后就是一个普通的线性方程组。源码结构速览与延伸阅读模块源码文件与文档主题一一对应便于按主题定位主题实现文件测试文件参考系、取向、DCM、角速度sympy/physics/vector/frame.py约 1576 行模块中最大的实现文件test_frame.pyVector 类型与 args 存储sympy/physics/vector/vector.pytest_vector.pyPoint、1/2 点定理sympy/physics/vector/point.pytest_point.pyDyadicsympy/physics/vector/dyadic.pytest_dyadic.pydot/cross/express/time_derivative/dynamicsymbolssympy/physics/vector/functions.pytest_functions.py场算子与势函数sympy/physics/vector/fieldfunctions.pytest_fieldfunctions.py向量打印sympy/physics/vector/printing.pytest_printing.py官方解释文档的完整入口是 doc/src/explanation/modules/physics/vector/index.rst四个子文档分别位于 vectors/vectors.rst、kinematics/kinematics.rst、fields.rst、advanced.rst。运动学子文档中还配有 kin_1.svg、kin_2pt.svg、kin_1pt.svg、kin_angvel1~3.svg、kin_rolling.svg 等示意图位于 doc/src/explanation/modules/physics/vector/kinematics/ 目录矢量与参考系子文档配有 vec_add.svg、vec_cross.svg、vec_dot.svg、simp_rot.svg 等位于 doc/src/explanation/modules/physics/vector/vectors/ 目录在线文档中可直接查看。对刚体动力学建模的完整实践sympy.physics.vector通常作为sympy.physics.mechanics的下层组件使用Dyadic 表示惯性矩即为典型衔接点理解本文的参考系、dynamicsymbols、点定理与打印约定后即可在 sympy 中完整地符号化描述多刚体系统的运动学并推导其运动方程。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考