[ PROMPT_NODE_27474 ]
physics-mechanics
[ SKILL_DOCUMENTATION ]
# SymPy 物理与力学
本文档涵盖了 SymPy 的物理模块,包括经典力学、量子力学、向量分析、单位、光学、连续介质力学和控制系统。
## 向量分析
### 创建参考系和向量
python
from sympy.physics.vector import ReferenceFrame, dynamicsymbols
# 创建参考系
N = ReferenceFrame('N') # 惯性参考系
B = ReferenceFrame('B') # 刚体参考系
# 创建向量
v = 3*N.x + 4*N.y + 5*N.z
# 随时间变化的量
t = dynamicsymbols._t
x = dynamicsymbols('x') # 时间的函数
v = x.diff(t) * N.x # 速度向量
### 向量运算
python
from sympy.physics.vector import dot, cross
v1 = 3*N.x + 4*N.y
v2 = 1*N.x + 2*N.y + 3*N.z
# 点积
d = dot(v1, v2)
# 叉积
c = cross(v1, v2)
# 幅值
mag = v1.magnitude()
# 归一化
v1_norm = v1.normalize()
### 参考系方向
python
# 相对于 N 旋转参考系 B
from sympy import symbols, cos, sin
theta = symbols('theta')
# 绕 z 轴简单旋转
B.orient(N, 'Axis', [theta, N.z])
# 方向余弦矩阵 (DCM)
dcm = N.dcm(B)
# B 在 N 中的角速度
omega = B.ang_vel_in(N)
### 点与运动学
python
from sympy.physics.vector import Point
# 创建点
O = Point('O') # 原点
P = Point('P')
# 设置位置
P.set_pos(O, 3*N.x + 4*N.y)
# 设置速度
P.set_vel(N, 5*N.x + 2*N.y)
# 获取 P 在参考系 N 中的速度
v = P.vel(N)
# 获取加速度
a = P.acc(N)
## 经典力学
### 拉格朗日力学
python
from sympy import symbols, Function
from sympy.physics.mechanics import dynamicsymbols, LagrangesMethod
# 定义广义坐标
q = dynamicsymbols('q')
qd = dynamicsymbols('q', 1) # q 的导数 (速度)
# 定义拉格朗日量 (L = T - V)
from sympy import Rational
m, g, l = symbols('m g l')
T = Rational(1, 2) * m * (l * qd)**2 # 动能
V = m * g * l * (1 - cos(q)) # 势能
L = T - V
# 应用拉格朗日方法
LM = LagrangesMethod(L, [q])
LM.form_lagranges_equations()
eqs = LM.rhs() # 运动方程的右侧
### 凯恩方法 (Kane's Method)
python
from sympy.physics.mechanics import KanesMethod, ReferenceFrame, Point
from sympy.physics.vector import dynamicsymbols
# 定义系统
N = ReferenceFrame('N')
q = dynamicsymbols('q')
u = dynamicsymbols('u') # 广义速度
# 创建凯恩方程
kd = [u - q.diff()] # 运动学微分方程
KM = KanesMethod(N, [q], [u], kd)
#