SymPy 力学模块实战:用 Kane 方法求解滚动圆盘的非贡献约束力(rollingdisc_example_kane_constraints)
SymPy 力学模块实战用 Kane 方法求解滚动圆盘的非贡献约束力rollingdisc_example_kane_constraints【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy导读本篇技术指南围绕 SymPy 力学模块sympy.physics.mechanics中的经典教程 rollingdisc_example_kane_constraints.rst 展开完整演示如何基于 Kane 方法建立无限薄圆盘在地面无滑动纯滚动的多体系统模型并通过引入**辅助广义速度auxiliary generalized speeds把通常被剔除的非贡献力non-contributing / constraint forces**显式求解出来。读完本文你将掌握KanesMethod中u_auxiliary参数的完整用法、auxiliary_eqs属性的含义以及如何从质量矩阵与 forcing 向量出发得到系统的显式运动方程并最终写出约束力关于广义坐标与广义速度的闭式表达式。一、背景为什么要把约束力带入证据在 rollingdisc_example_kane.rst 中圆盘模型直接从接触点向上定义运动学滚动无滑动条件被构造性地满足因此不需要引入广义速度最终只需求解 3 个广义坐标q1, q2, q3与 3 个广义速度u1, u2, u3下的运动方程。但很多工程场景中我们不仅关心运动还关心约束力本身例如地面法向反力、摩擦力用于强度校核或控制系统设计。Kane 方法的核心思想是广义主动力与广义惯性力在广义速度方向上的投影之和为零而非贡献力约束力在允许运动方向上不做功因此它们不会出现在常规的 Kane 方程中。本教程的做法原理详见 [Kane1985]是在接触点人为引入三个辅助广义速度u4, u5, u6它们在纯滚动条件下恒等于零同时引入与它们同方向的三个约束力分量f1, f2, f3。这样一来约束力从隐藏项变成显式未知量可以在 Kane 方程之外得到一组额外的**辅助方程auxiliary equations**用于反解它们。在 SymPy 源码中这一机制由 kane.py 中的KanesMethod实现构造器接受u_auxiliary参数见 kane.py 第 71-72 行并提供auxiliary_eqs属性见 kane.py 第 110-113 行。下面按教程的完整流程逐步实现。二、环境准备符号与动力学符号声明教程首先开启力学模块打印并导入需要的符号。注意这一行 from sympy import symbols, sin, cos, tan from sympy.physics.mechanics import * mechanics_printing(pretty_printFalse)mechanics_printing(pretty_printFalse)用于开启向量运算时的自动简化。文档明确提示它会让小型问题的输出更美观但较大的向量运算可能因此挂起It makes the outputs nicer for small problems, but can cause larger vector operations to hang。因此这是本教程特意开启的开关在大规模建模时建议谨慎使用。接着声明广义坐标、广义速度及其一阶导数以及圆盘半径、质量和重力加速度 q1, q2, q3, u1, u2, u3 dynamicsymbols(q1 q2 q3 u1 u2 u3) q1d, q2d, q3d, u1d, u2d, u3d dynamicsymbols(q1 q2 q3 u1 u2 u3, 1) r, m, g symbols(r m g)这里dynamicsymbols(..., 1)生成对应符号关于时间的一阶导数供后续运动学微分方程kd使用。三、核心新增辅助广义速度与约束力符号与无约束版本相比本教程唯一新增的两行声明是 u4, u5, u6, f1, f2, f3 dynamicsymbols(u4 u5 u6 f1 f2 f3)u4, u5, u6接触点处的三个辅助广义速度分别沿L.x方向圆盘侧向、cross(Y.z, L.x)方向沿滚动路径、Y.z方向垂直地面。由于纯滚动约束它们按定义恒为零f1, f2, f3与上述三个速度方向一一对应的约束力幅值。从源码结构看KanesMethod会把u_auxiliary列表中的速度从主广义速度中分离出来单独处理见 kane.py 第 842-861 行这正是后续能得到auxiliary_eqs的关键。四、参考系与角速度运动学圆盘姿态采用 3-1-2Z、X、Y系列的**简单旋转simple rotation**逐级建立中间参考系 N ReferenceFrame(N) Y N.orientnew(Y, Axis, [q1, N.z]) L Y.orientnew(L, Axis, [q2, Y.x]) R L.orientnew(R, Axis, [q3, L.y]) w_R_N_qd R.ang_vel_in(N) R.set_ang_vel(N, u1 * L.x u2 * L.y u3 * L.z)N惯性参考系地面Y绕N.z旋转q1方位角即圆盘前进方向所在的竖直平面L绕Y.x旋转q2侧倾/lean 角称侧倾参考系惯性主轴在此系中不变R绕L.y旋转q3自转角附着于圆盘本体。w_R_N_qd是从旋转序列解析得到的角速度表达式随后用广义速度u1, u2, u3在L系基向量上的组合显式指定角速度。之后kd方程正是用来建立这两者之间的联系。五、平动运动学接触点速度与质心速度无滑滚动要求接触点速度为零。但为了把约束力带入证据这里反其道而行给接触点显式赋予一个由辅助速度合成的名义速度它在约束成立时归零 C Point(C) C.set_vel(N, u4 * L.x u5 * cross(Y.z, L.x) u6 * Y.z) Dmc C.locatenew(Dmc, r * L.z) vel Dmc.v2pt_theory(C, N, R)C接触点其速度的三个分量分别沿圆盘侧向、滚动路径方向、竖直方向Dmc圆盘质心位于接触点正上方r * L.z处v2pt_theory(C, N, R)基于两点速度关系两点位于同一刚体R上由C的速度与R的角速度自动推出质心速度。六、惯量张量圆盘关于质心的惯量张量在L系中写出圆盘绕自身对称轴L.y的转动惯量为m*r**2/2两个直径方向各为m*r**2/4 I inertia(L, m / 4 * r**2, m / 2 * r**2, m / 4 * r**2)由于圆盘在L系中滚动时惯量不变化圆盘轴对称在L系表达惯量可显著简化最终方程——这一建模技巧在 rollingdisc_example_kane.rst 中有同样说明。七、运动学微分方程kdkd 方程把广义坐标导数与广义速度联系起来通过对R的角速度在L系三个基向量上取点积得到 kd [dot(R.ang_vel_in(N) - w_R_N_qd, uv) for uv in L]即dot(角速度表达式之差, L.x)、dot(..., L.y)、dot(..., L.z)三个标量方程形式为q1d、q2d、q3d与u1、u2、u3之间的线性关系。八、力清单与刚体定义力清单同时包含主动力重力与约束力三个未知分量 ForceList [(Dmc, - m * g * Y.z), (C, f1 * L.x f2 * cross(Y.z, L.x) f3 * Y.z)] BodyD RigidBody(BodyD, Dmc, R, m, (I, Dmc)) BodyList [BodyD](Dmc, -m*g*Y.z)作用于质心的重力(C, f1*L.x f2*cross(Y.z, L.x) f3*Y.z)作用于接触点的约束力三个分量方向与辅助速度u4, u5, u6一一对应力与速度同方向投影正是广义力约束力在虚位移上的虚功的离散化形式。RigidBody(BodyD, Dmc, R, m, (I, Dmc))指定质心点为Dmc、附着参考系为R、质量为m、惯量张量I相对Dmc给出。九、构建 KanesMethod 并求解运动方程构造器传入u_auxiliary[u4, u5, u6]这是与普通 Kane 建模唯一的结构性差异 KM KanesMethod(N, q_ind[q1, q2, q3], u_ind[u1, u2, u3], kd_eqskd, ... u_auxiliary[u4, u5, u6]) (fr, frstar) KM.kanes_equations(BodyList, ForceList) MM KM.mass_matrix forcing KM.forcing rhs MM.inv() * forcing kdd KM.kindiffdict() rhs rhs.subs(kdd) rhs.simplify() mprint(rhs) Matrix([ [(4*g*sin(q2) 6*r*u2*u3 - r*u3**2*tan(q2))/(5*r)], [ -2*u1*u3/3], [ (-2*u2 u3*tan(q2))*u1]])推导过程是标准流程kanes_equations返回广义主动力fr与广义惯性力frstar由mass_matrix与forcing组装M·u̇ forcingrhs MM.inv() * forcing得到u̇的表达式再用kindiffdict()把q̇替换为广义速度最终显式给出u̇1 (4·g·sin(q2) 6·r·u2·u3 − r·u3²·tan(q2)) / (5·r)u̇2 −2·u1·u3 / 3u̇3 (−2·u2 u3·tan(q2)) · u1注意这个结果与不引入约束力的 Kane 版本见 rollingdisc_example_kane.rst 输出完全一致——这印证了辅助速度的引入不改变真实运动方程符合非贡献力不影响运动的理论预期同时验证了建模的正确性。十、求解约束力auxiliary_eqs 与化简技巧运动方程求出后约束力藏在KM.auxiliary_eqs中。直接输出的表达式可能比较冗长教程给出了一个专门的化简管线 from sympy import trigsimp, signsimp, collect, factor_terms def simplify_auxiliary_eqs(w): ... return signsimp(trigsimp(collect(collect(factor_terms(w), f2), m*r))) mprint(KM.auxiliary_eqs.applyfunc(simplify_auxiliary_eqs)) Matrix([ [ -m*r*(u1*u3 u2) f1], [-m*r*u1**2*sin(q2) - m*r*u2*u3/cos(q2) m*r*cos(q2)*u1 f2], [ -g*m m*r*(u1**2*cos(q2) sin(q2)*u1) f3]])化简策略说明factor_terms(w)提出公共因子collect(..., f2)/collect(..., m*r)按约束力符号和质量×半径聚集同类项trigsimp利用三角恒等式化简sin/cos项signsimp规范化符号形式。最终辅助方程为约束力 惯性项解出三个分量侧向约束力f1 m·r·(u1·u3 u̇2)滚动路径方向约束力f2 m·r·u1²·sin(q2) m·r·u2·u3/cos(q2) − m·r·cos(q2)·u̇1法向约束力f3 g·m − m·r·(u1²·cos(q2) sin(q2)·u̇1)例如f3表达式中的−g·m m·r·(u1²·cos(q2) sin(q2)·u̇1)即为圆盘法向反力当圆盘侧倾角q2与侧倾速率u1耦合时法向反力会偏离重力m·g这正是侧倾-自转耦合类似陀螺效应的体现。将上一节的u̇1代入即可得到纯关于(q2, u1, u2, u3)的显式约束力公式。十一、源码级原理辅助方程是如何生成的从 kane.py 的实现可以看到完整的机制KanesMethod.__init__接受u_auxiliary参数并存入self._uaux在kanes_equations中若存在辅助速度if self._uaux:会构造一个以辅助速度为主广义速度的临时KanesMethodkm KanesMethod(self._inertial, self.q, self._uaux, u_auxiliaryself._uaux, ...)见 kane.py 第 842-854 行并复用同样的力清单与刚体清单fraux km._form_fr(loads) frstaraux km._form_frstar(bodies) self._aux_eq fraux frstaraux self._fr fr.col_join(fraux) self._frstar frstar.col_join(frstaraux)即auxiliary_eqs fraux frstaraux见 kane.py 第 855-861 行。辅助广义速度在约束下恒为零但其名义速度使得约束力在该方向上的广义力分量进入方程从而可以被反解。auxiliary_eqs作为只读属性返回self._aux_eq见 kane.py 第 909-915 行。同时kanes_equations的 docstring见 kane.py 第 806-817 行说明设有s个辅助速度、o个广义速度、m个运动约束返回向量的长度为o − m s前o − m个是约束后的 Kane 方程后s个即辅助 Kane 方程。十二、测试与验证仓库中的对应用例仓库测试目录对该功能有专门覆盖可作为实现正确性的证据test_kane.py 第 220-259 行在同一滚动圆盘系统上对比手动引入 2 个辅助速度与使用内置u_auxiliary[u4, u5]两种方式验证二者等价test_kane2.py覆盖了同时含辅助速度、配置约束与非完整约束的复杂用例第 47-49 行注释明确标注ua[0]/ua[1]/ua[2]为接触点三个方向的辅助广义速度并断言auxiliary_eqs与手动推导一致test_lagrange.py、test_linearize.py 中的rollingdisc用例则验证了不同方法Lagrange、线性化对同一系统的结果一致性。这些测试从侧面印证本教程给出的建模流程接触点引入辅助速度→同名约束力→u_auxiliary传入是官方推荐且经过验证的标准做法。十三、与其他建模方式的对比同一物理系统在教程目录doc/src/tutorials/physics/mechanics/下有三种建模视角入口见 rollingdisc_example.rst教程文件方法特点rollingdisc_example_kane.rstKane无约束力3 坐标 3 速度最简洁只给运动方程本文kane_constraintsKane 辅助速度额外引入 3 个零速辅助速度与 3 个约束力得到运动方程 约束力闭式解rollingdisc_example_lagrange.rstLagrange从能量角度建模可对照验证三种方式对同一系统的运动学结果应当一致互为交叉验证。十四、使用注意事项小结自动简化开关mechanics_printing(pretty_printFalse)仅适合小规模问题大系统建议关闭以避免向量运算挂起辅助速度方向选择约束力分量必须与辅助速度方向一一对应本教程为L.x、cross(Y.z, L.x)、Y.z否则广义力投影会丢失对应分量辅助速度恒为零它们只是名义自由度不出现在最终运动方程中rhs结果与无约束版本一致可作为正确性检验约束力求解KM.auxiliary_eqs是求解约束力的唯一入口通常需要配合factor_terms、collect、trigsimp等化简手段如教程中的simplify_auxiliary_eqs才能得到可读的闭式表达式扩展阅读完整可运行脚本位于教程目录 doc/src/tutorials/physics/mechanics/KanesMethod的全部参数含configuration_constraints、velocity_constraints、u_dependent等见 kane.py 的类 docstringkane.py 第 60-99 行。结语本教程完整展示了 SymPy 力学模块中在 Kane 方法框架下显式求解非贡献约束力的标准工程流程通过u_auxiliary引入辅助广义速度、构造同名约束力分量、经kanes_equations获得常规运动方程与auxiliary_eqs辅助方程再借助符号化简管线得到三个约束力的闭式表达式。该能力对需要同时进行动力学仿真与力/力矩分析的场景如机器人足端力、车辆轮胎力等具有直接实用价值。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考