CW方程的向量形式与解析形式
引言:两种表述的互补之美
Clohessy-Wiltshire方程之所以成为轨道相对运动的经典模型,一个重要原因是它同时具备向量形式 的简洁优雅和解析形式的明确解。向量形式揭示了相对运动的本质结构,而解析形式提供了直接可用的解决方案。本文将深入探讨这两种表述形式,展示它们的内在联系和工程价值。
一、向量形式:揭示运动本质
1.1 基本向量方程
Clohessy-Wiltshire方程的完整向量形式可以表示为:
r⃗¨+2ω⃗×r⃗˙+ω⃗×(ω⃗×r⃗)+ω⃗˙×r⃗=−μRc3R⃗c+μRt3R⃗t \boxed{\ddot{\vec{r}} + 2\vec{\omega} \times \dot{\vec{r}} + \vec{\omega} \times (\vec{\omega} \times \vec{r}) + \dot{\vec{\omega}} \times \vec{r} = -\frac{\mu}{R_c^3}\vec{R}_c + \frac{\mu}{R_t^3}\vec{R}_t} r ¨+2ω ×r ˙+ω ×(ω ×r )+ω ˙×r =−Rc3μR c+Rt3μR t
其中:
- r⃗=R⃗c−R⃗t\vec{r} = \vec{R}_c - \vec{R}_tr =R c−R t:追踪航天器相对于目标航天器的位置向量
- ω⃗\vec{\omega}ω :目标轨道角速度向量
- μ\muμ:地球引力常数
- R⃗t\vec{R}_tR t:目标航天器的地心位置向量
- R⃗c\vec{R}_cR c:追踪航天器的地心位置向量
1.2 简化向量形式
在圆轨道假设 (ω⃗˙=0\dot{\vec{\omega}} = 0ω ˙=0)和小相对距离假设 (∣r⃗∣≪∣R⃗t∣|\vec{r}| \ll |\vec{R}_t|∣r ∣≪∣R t∣)下,方程简化为:
r⃗¨+2ω⃗×r⃗⃗˙+ω⃗×(ω⃗×r⃗)=Gr⃗ \boxed{\ddot{\vec{r}} + 2\vec{\omega} \times \dot{\vec{\vec{r}}} + \vec{\omega} \times (\vec{\omega} \times \vec{r}) = \mathbf{G}\vec{r}} r ¨+2ω ×r ˙+ω ×(ω ×r )=Gr
其中G\mathbf{G}G是引力梯度张量:
G=μRt3[300000000] \mathbf{G} = \frac{\mu}{R_t^3} \begin{bmatrix} 3 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix} G=Rt3μ 300000000
或者更紧凑地:
Gr⃗=μRt3[3x00]=3ω2[x00] \mathbf{G}\vec{r} = \frac{\mu}{R_t^3} \begin{bmatrix} 3x \\ 0 \\ 0 \end{bmatrix} = 3\omega^2 \begin{bmatrix} x \\ 0 \\ 0 \end{bmatrix} Gr =Rt3μ 3x00 =3ω2 x00
1.3 物理项解释(向量形式)
| 项 | 向量表达式 | 物理意义 | 备注 |
|---|---|---|---|
| 惯性加速度 | r⃗¨\ddot{\vec{r}}r ¨ | 相对加速度 | 在旋转坐标系中观察 |
| 科里奥利加速度 | 2ω⃗×r⃗˙2\vec{\omega} \times \dot{\vec{r}}2ω ×r ˙ | 由于相对速度在旋转系中运动 | 垂直于ω⃗\vec{\omega}ω 和r⃗˙\dot{\vec{r}}r ˙ |
| 离心加速度 | ω⃗×(ω⃗×r⃗)\vec{\omega} \times (\vec{\omega} \times \vec{r})ω ×(ω ×r ) | 由于坐标系旋转 | 指向远离旋转轴 |
| 引力梯度 | Gr⃗\mathbf{G}\vec{r}Gr | 引力场不均匀性 | 仅径向有分量 |
1.4 旋转坐标系下的推导
在LVLH坐标系中,角速度向量为:
ω⃗=ωy^=[0ω0] \vec{\omega} = \omega \hat{y} = \begin{bmatrix} 0 \\ \omega \\ 0 \end{bmatrix} ω =ωy^= 0ω0
各向量分量为:
r⃗=[xyz],r⃗˙=[x˙y˙z˙],r⃗¨=[x¨y¨z¨] \vec{r} = \begin{bmatrix} x \\ y \\ z \end{bmatrix}, \quad \dot{\vec{r}} = \begin{bmatrix} \dot{x} \\ \dot{y} \\ \dot{z} \end{bmatrix}, \quad \ddot{\vec{r}} = \begin{bmatrix} \ddot{x} \\ \ddot{y} \\ \ddot{z} \end{bmatrix} r = xyz ,r ˙= x˙y˙z˙ ,r ¨= x¨y¨z¨
利用向量叉积公式:
a⃗×b⃗=[aybz−azbyazbx−axbzaxby−aybx] \vec{a} \times \vec{b} = \begin{bmatrix} a_y b_z - a_z b_y \\ a_z b_x - a_x b_z \\ a_x b_y - a_y b_x \end{bmatrix} a ×b = aybz−azbyazbx−axbzaxby−aybx
可以计算各项:
科里奥利项 :
2\\vec{\\omega} \\times \\dot{\\vec{r}} = 2 \\begin{bmatrix} 0 \\ \\omega \\ 0 \\end{bmatrix} \\times \\begin{bmatrix} \\dot{x} \\ \\dot{y} \\ \\dot{z} \\end{bmatrix} = 2 \\begin{bmatrix} \\omega \\dot{z} - 0 \\cdot \\dot{y} \\ 0 \\cdot \\dot{x} - 0 \\cdot \\dot{z} \\ 0 \\cdot \\dot{y} - \\omega \\dot{x} \\end{bmatrix} \\begin{bmatrix} 2\\omega \\dot{z} \\ 0 \\ -2\\omega \\dot{x} \\end{bmatrix}
离心项 :
\\vec{\\omega} \\times (\\vec{\\omega} \\times \\vec{r}) = \\begin{bmatrix} 0 \\ \\omega \\ 0 \\end{bmatrix} \\times \\left( \\begin{bmatrix} 0 \\ \\omega \\ 0 \\end{bmatrix} \\times \\begin{bmatrix} x \\ y \\ z \\end{bmatrix} \\right) ## \\begin{bmatrix} 0 \\ \\omega \\ 0 \\end{bmatrix} \\times \\begin{bmatrix} \\omega z \\ 0 \\ -\\omega x \\end{bmatrix} \\begin{bmatrix} -\\omega\^2 x \\ 0 \\ -\\omega\^2 z \\end{bmatrix}
引力梯度项 :
Gr⃗=3ω2[x00] \mathbf{G}\vec{r} = 3\omega^2 \begin{bmatrix} x \\ 0 \\ 0 \end{bmatrix} Gr =3ω2 x00
二、分量形式:具体可计算的方程
2.1 标准分量方程
将向量方程展开到LVLH坐标系的三个轴向上,得到经典的分量形式:
x¨−2ωz˙−3ω2x=axy¨+ω2y=ayz¨+2ωx˙=az \boxed{ \begin{aligned} \ddot{x} - 2\omega\dot{z} - 3\omega^2 x &= a_x \\ \ddot{y} + \omega^2 y &= a_y \\ \ddot{z} + 2\omega\dot{x} &= a_z \end{aligned}} x¨−2ωz˙−3ω2xy¨+ω2yz¨+2ωx˙=ax=ay=az
其中:
- xxx:径向分量(R-bar方向)
- yyy:法向分量(H-bar方向,轨道角动量方向)
- zzz:切向分量(V-bar方向,速度方向)
- ω=μ/Rt3\omega = \sqrt{\mu/R_t^3}ω=μ/Rt3 :轨道角速度
- ax,ay,aza_x, a_y, a_zax,ay,az:控制加速度分量
2.2 各分量方程的物理解释
径向方程(x方向)
x¨−2ωz˙−3ω2x=ax \ddot{x} - 2\omega\dot{z} - 3\omega^2 x = a_x x¨−2ωz˙−3ω2x=ax
- x¨\ddot{x}x¨:径向加速度
- −2ωz˙-2\omega\dot{z}−2ωz˙:科里奥利项,切向速度引起径向加速度
- −3ω2x-3\omega^2 x−3ω2x:净引力梯度(−ω2x-\omega^2 x−ω2x离心力 + 3ω2x3\omega^2 x3ω2x引力梯度 = −3ω2x-3\omega^2 x−3ω2x)
法向方程(y方向)
y¨+ω2y=ay \ddot{y} + \omega^2 y = a_y y¨+ω2y=ay
- 最简单的一维简谐振荡器
- ω2y\omega^2 yω2y:恢复力项,使偏离平面的运动振荡
- 无耦合项,独立于其他方向
切向方程(z方向)
z¨+2ωx˙=az \ddot{z} + 2\omega\dot{x} = a_z z¨+2ωx˙=az
- z¨\ddot{z}z¨:切向加速度
- +2ωx˙+2\omega\dot{x}+2ωx˙:科里奥利项,径向速度引起切向加速度
- 无位置相关项,但有速度耦合
2.3 矩阵形式
将分量方程写为矩阵形式,便于状态空间分析:
状态空间形式 :
定义状态向量 X=[x,y,z,x˙,y˙,z˙]T\mathbf{X} = [x, y, z, \dot{x}, \dot{y}, \dot{z}]^TX=[x,y,z,x˙,y˙,z˙]T,则:
X˙=AX+Bu \dot{\mathbf{X}} = A\mathbf{X} + B\mathbf{u} X˙=AX+Bu
其中:
A=[0001000000100000013ω200002ω0−ω20000000−2ω00],B=[000000000100010001],u=[axayaz] A = \begin{bmatrix} 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 \\ 3\omega^2 & 0 & 0 & 0 & 0 & 2\omega \\ 0 & -\omega^2 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & -2\omega & 0 & 0 \end{bmatrix}, \quad B = \begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}, \quad \mathbf{u} = \begin{bmatrix} a_x \\ a_y \\ a_z \end{bmatrix} A= 0003ω2000000−ω2000000010000−2ω0100000012ω00 ,B= 000100000010000001 ,u= axayaz
这个形式是现代控制理论应用的基础。
三、解析解:闭合形式的解
3.1 无控情况下的通解(u=0\mathbf{u} = 0u=0)
3.1.1 平面外运动(y方向)
平面外运动完全解耦,解为简谐振荡:
y(t)=y0cos(ωt)+y˙0ωsin(ωt)y˙(t)=−y0ωsin(ωt)+y˙0cos(ωt) \boxed{ \begin{aligned} y(t) &= y_0 \cos(\omega t) + \frac{\dot{y}_0}{\omega} \sin(\omega t) \\ \dot{y}(t) &= -y_0 \omega \sin(\omega t) + \dot{y}_0 \cos(\omega t) \end{aligned}} y(t)y˙(t)=y0cos(ωt)+ωy˙0sin(ωt)=−y0ωsin(ωt)+y˙0cos(ωt)
或者用振幅-相位形式:
y(t)=Aycos(ωt−ϕy) y(t) = A_y \cos(\omega t - \phi_y) y(t)=Aycos(ωt−ϕy)
其中:
Ay=y02+(y˙0ω)2,ϕy=arctan(y˙0ωy0) A_y = \sqrt{y_0^2 + \left(\frac{\dot{y}_0}{\omega}\right)^2}, \quad \phi_y = \arctan\left(\frac{\dot{y}_0}{\omega y_0}\right) Ay=y02+(ωy˙0)2 ,ϕy=arctan(ωy0y˙0)
3.1.2 平面内运动(x-z平面)
平面内运动耦合,通解为:
x(t)=(4x0+2z˙0ω)−(3x0+2z˙0ω)cos(ωt)+x˙0ωsin(ωt)z(t)=z0−2x˙0ω+(6ωx0+3z˙0)t+2x˙0ωcos(ωt)+(6x0+4z˙0ω)sin(ωt)x˙(t)=(3x0+2z˙0ω)ωsin(ωt)+x˙0cos(ωt)z˙(t)=(6ωx0+3z˙0)−2x˙0ωωsin(ωt)+(6x0+4z˙0ω)ωcos(ωt) \boxed{ \begin{aligned} x(t) &= \left(4x_0 + \frac{2\dot{z}_0}{\omega}\right) - \left(3x_0 + \frac{2\dot{z}_0}{\omega}\right)\cos(\omega t) + \frac{\dot{x}_0}{\omega}\sin(\omega t) \\ z(t) &= z_0 - \frac{2\dot{x}_0}{\omega} + \left(6\omega x_0 + 3\dot{z}_0\right)t + \frac{2\dot{x}_0}{\omega}\cos(\omega t) + \left(6x_0 + \frac{4\dot{z}_0}{\omega}\right)\sin(\omega t) \\ \dot{x}(t) &= \left(3x_0 + \frac{2\dot{z}_0}{\omega}\right)\omega\sin(\omega t) + \dot{x}_0\cos(\omega t) \\ \dot{z}(t) &= \left(6\omega x_0 + 3\dot{z}_0\right) - \frac{2\dot{x}_0}{\omega}\omega\sin(\omega t) + \left(6x_0 + \frac{4\dot{z}_0}{\omega}\right)\omega\cos(\omega t) \end{aligned}} x(t)z(t)x˙(t)z˙(t)=(4x0+ω2z˙0)−(3x0+ω2z˙0)cos(ωt)+ωx˙0sin(ωt)=z0−ω2x˙0+(6ωx0+3z˙0)t+ω2x˙0cos(ωt)+(6x0+ω4z˙0)sin(ωt)=(3x0+ω2z˙0)ωsin(ωt)+x˙0cos(ωt)=(6ωx0+3z˙0)−ω2x˙0ωsin(ωt)+(6x0+ω4z˙0)ωcos(ωt)
3.2 解的物理分解
平面内解可以分解为几个有物理意义的成分:
1. 振荡成分
- cos(ωt)\cos(\omega t)cos(ωt)和sin(ωt)\sin(\omega t)sin(ωt)项:轨道频率振荡
- 振幅由初始条件决定
2. 漂移成分
- z(t)z(t)z(t)中的(6ωx0+3z˙0)t(6\omega x_0 + 3\dot{z}_0)t(6ωx0+3z˙0)t项:线性漂移
- 这是最重要的工程意义项:初始径向偏移或切向速度会导致持续漂移
3. 偏置成分
- x(t)x(t)x(t)中的(4x0+2z˙0/ω)(4x_0 + 2\dot{z}_0/\omega)(4x0+2z˙0/ω)项:常数偏置
- 即使最终振荡归零,仍有常值偏移
3.3 状态转移矩阵形式
解析解可以用状态转移矩阵Φ(t)\Phi(t)Φ(t)紧凑表示:
X(t)=Φ(t)X(0) \mathbf{X}(t) = \Phi(t) \mathbf{X}(0) X(t)=Φ(t)X(0)
其中Φ(t)\Phi(t)Φ(t)为:
Φ(t)=[4−3c00sω02ω(1−c)0c00sω06(s−θ)01−2ω(1−c)01ω(4s−3θ)3ωs00c02s0−ωs00c0−6ω(1−c)00−2s04c−3] \Phi(t) = \begin{bmatrix} 4-3c & 0 & 0 & \frac{s}{\omega} & 0 & \frac{2}{\omega}(1-c) \\ 0 & c & 0 & 0 & \frac{s}{\omega} & 0 \\ 6(s-\theta) & 0 & 1 & -\frac{2}{\omega}(1-c) & 0 & \frac{1}{\omega}(4s-3\theta) \\ 3\omega s & 0 & 0 & c & 0 & 2s \\ 0 & -\omega s & 0 & 0 & c & 0 \\ -6\omega(1-c) & 0 & 0 & -2s & 0 & 4c-3 \end{bmatrix} Φ(t)= 4−3c06(s−θ)3ωs0−6ω(1−c)0c00−ωs0001000ωs0−ω2(1−c)c0−2s0ωs00c0ω2(1−c)0ω1(4s−3θ)2s04c−3
其中:
- c=cos(θ)c = \cos(\theta)c=cos(θ), s=sin(θ)s = \sin(\theta)s=sin(θ), θ=ωt\theta = \omega tθ=ωt
四、代码实现:验证与可视化
4.1 Python实现:解析解计算
python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
class ClohessyWiltshireSolver:
"""Clohessy-Wiltshire方程求解器"""
def __init__(self, omega):
"""
初始化CW求解器
omega: 轨道角速度 (rad/s)
"""
self.omega = omega
# ========== 解析解方法 ==========
def analytical_solution(self, X0, t):
"""
计算CW方程的解析解
X0: [x0, y0, z0, vx0, vy0, vz0] 初始状态
t: 时间标量或数组
"""
x0, y0, z0, vx0, vy0, vz0 = X0
omega = self.omega
# 确保t为数组
t = np.asarray(t)
if t.ndim == 0:
t = np.array([t])
# 计算中间变量
theta = omega * t
cos_theta = np.cos(theta)
sin_theta = np.sin(theta)
# 平面外运动 (y方向)
y = y0 * cos_theta + (vy0/omega) * sin_theta
vy = -y0 * omega * sin_theta + vy0 * cos_theta
# 平面内运动 (x-z平面)
# x方向的解
x = (4*x0 + 2*vz0/omega) - (3*x0 + 2*vz0/omega)*cos_theta + (vx0/omega)*sin_theta
vx = (3*x0 + 2*vz0/omega)*omega*sin_theta + vx0*cos_theta
# z方向的解
z = z0 - (2*vx0/omega) + (6*omega*x0 + 3*vz0)*t + (2*vx0/omega)*cos_theta + (6*x0 + 4*vz0/omega)*sin_theta
vz = (6*omega*x0 + 3*vz0) - 2*vx0*sin_theta + (6*x0 + 4*vz0/omega)*omega*cos_theta
# 组装结果
if len(t) == 1:
return np.array([x[0], y[0], z[0], vx[0], vy[0], vz[0]])
else:
states = np.column_stack([x, y, z, vx, vy, vz])
return states
def state_transition_matrix(self, t):
"""
计算状态转移矩阵 Φ(t)
"""
theta = self.omega * t
c = np.cos(theta)
s = np.sin(theta)
omega = self.omega
phi = np.zeros((6, 6))
# 位置-位置块
phi[0, 0] = 4 - 3*c
phi[0, 3] = s/omega
phi[0, 5] = 2*(1 - c)/omega
phi[1, 1] = c
phi[1, 4] = s/omega
phi[2, 0] = 6*(s - theta)
phi[2, 2] = 1
phi[2, 3] = -2*(1 - c)/omega
phi[2, 5] = (4*s - 3*theta)/omega
# 速度-位置块
phi[3, 0] = 3*omega*s
phi[3, 3] = c
phi[3, 5] = 2*s
phi[4, 1] = -omega*s
phi[4, 4] = c
phi[5, 0] = -6*omega*(1 - c)
phi[5, 3] = -2*s
phi[5, 5] = 4*c - 3
return phi
def propagate_with_phi(self, X0, t):
"""
使用状态转移矩阵传播状态
"""
phi = self.state_transition_matrix(t)
return phi @ X0
# ========== 数值积分方法 ==========
def numerical_integration(self, X0, t_eval, control_func=None):
"""
数值积分CW方程
control_func: 控制函数 control_func(t, X) -> [ax, ay, az]
"""
from scipy.integrate import solve_ivp
def cw_ode(t, X):
"""CW方程的ODE形式"""
x, y, z, vx, vy, vz = X
omega = self.omega
# 控制加速度
if control_func is not None:
ax, ay, az = control_func(t, X)
else:
ax, ay, az = 0, 0, 0
# CW方程的右端项
dxdt = vx
dydt = vy
dzdt = vz
dvxdt = 3*omega**2*x + 2*omega*vz + ax
dvydt = -omega**2*y + ay
dvzdt = -2*omega*vx + az
return [dxdt, dydt, dzdt, dvxdt, dvydt, dvzdt]
# 求解ODE
sol = solve_ivp(cw_ode, [0, max(t_eval)], X0,
t_eval=t_eval, rtol=1e-10, atol=1e-12)
return sol.y.T
# ========== 验证与比较 ==========
def verify_solutions(self, X0, t_end=600, n_points=100):
"""
验证解析解与数值解的一致性
"""
t = np.linspace(0, t_end, n_points)
# 解析解
X_analytical = self.analytical_solution(X0, t)
# 数值解
X_numerical = self.numerical_integration(X0, t)
# 计算误差
error = np.abs(X_analytical - X_numerical)
max_error = np.max(error)
rms_error = np.sqrt(np.mean(error**2))
print(f"最大绝对误差: {max_error:.2e}")
print(f"RMS误差: {rms_error:.2e}")
return X_analytical, X_numerical, error
# ========== 示例使用 ==========
def demonstrate_cw_solutions():
"""演示CW方程的各种解"""
# 轨道参数 (400km高度圆轨道)
Re = 6378.137 # 地球半径 (km)
h = 400 # 轨道高度 (km)
R = (Re + h) * 1000 # 轨道半径 (m)
mu = 3.986004418e14 # 地球引力常数
omega = np.sqrt(mu / R**3) # 轨道角速度
print(f"轨道高度: {h} km")
print(f"轨道角速度 ω: {omega:.6f} rad/s")
print(f"轨道周期: {2*np.pi/omega/60:.2f} 分钟")
# 创建求解器
cw = ClohessyWiltshireSolver(omega)
# 初始条件: 在V-bar后方100米,有微小径向速度
X0 = np.array([10, 5, -100, 0.1, 0.05, 0.2])
# 验证解析解与数值解
print("\n=== 验证解析解与数值解 ===")
t_end = 3000 # 约半个轨道周期
X_analytical, X_numerical, error = cw.verify_solutions(X0, t_end)
# 可视化比较
t = np.linspace(0, t_end, 100)
X_ana = cw.analytical_solution(X0, t)
X_num = cw.numerical_integration(X0, t)
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
# 位置比较
for i, (coord, label) in enumerate(zip(['x', 'y', 'z'], ['R-bar', 'H-bar', 'V-bar'])):
ax = axes[0, i]
ax.plot(t, X_ana[:, i], 'b-', label='解析解', linewidth=2)
ax.plot(t, X_num[:, i], 'r--', label='数值解', linewidth=1.5, alpha=0.7)
ax.set_xlabel('时间 (s)')
ax.set_ylabel(f'{label}位置 (m)')
ax.set_title(f'{label}方向位置')
ax.legend()
ax.grid(True)
# 速度比较
for i, (coord, label) in enumerate(zip(['vx', 'vy', 'vz'], ['R-bar', 'H-bar', 'V-bar'])):
ax = axes[1, i]
ax.plot(t, X_ana[:, i+3], 'b-', label='解析解', linewidth=2)
ax.plot(t, X_num[:, i+3], 'r--', label='数值解', linewidth=1.5, alpha=0.7)
ax.set_xlabel('时间 (s)')
ax.set_ylabel(f'{label}速度 (m/s)')
ax.set_title(f'{label}方向速度')
ax.legend()
ax.grid(True)
plt.tight_layout()
plt.show()
return cw, X0
# 运行演示
cw_solver, initial_state = demonstrate_cw_solutions()
4.2 典型初始条件的解分析
python
def analyze_initial_conditions():
"""分析不同初始条件的解"""
# 使用相同的轨道参数
omega = 0.00113 # rad/s
cw = ClohessyWiltshireSolver(omega)
t = np.linspace(0, 2*np.pi/omega, 1000) # 一个轨道周期
# 定义不同的初始条件
cases = [
{
"name": "纯径向偏移",
"X0": [100, 0, 0, 0, 0, 0],
"description": "x0=100m, 其他为零"
},
{
"name": "纯切向偏移",
"X0": [0, 0, -100, 0, 0, 0],
"description": "z0=-100m (后方), 其他为零"
},
{
"name": "径向速度",
"X0": [0, 0, 0, 0.1, 0, 0],
"description": "vx0=0.1m/s, 其他为零"
},
{
"name": "切向速度",
"X0": [0, 0, 0, 0, 0, 0.1],
"description": "vz0=0.1m/s, 其他为零"
},
{
"name": "混合情况",
"X0": [50, 20, -80, 0.05, 0.02, 0.1],
"description": "综合初始条件"
}
]
fig = plt.figure(figsize=(15, 12))
for idx, case in enumerate(cases):
X0 = case["X0"]
states = cw.analytical_solution(X0, t)
# 轨迹图
ax = fig.add_subplot(3, 2, idx+1, projection='3d')
ax.plot(states[:, 0], states[:, 1], states[:, 2], 'b-', linewidth=2)
ax.scatter([0], [0], [0], c='r', s=100, marker='o', label='目标')
ax.set_xlabel('R-bar (m)')
ax.set_ylabel('H-bar (m)')
ax.set_zlabel('V-bar (m)')
ax.set_title(f'{case["name"]}\n{case["description"]}')
ax.legend()
ax.grid(True)
# 添加轨迹特性分析
max_distance = np.max(np.sqrt(states[:, 0]**2 + states[:, 1]**2 + states[:, 2]**2))
final_z = states[-1, 2]
print(f"{case['name']}: 最大距离={max_distance:.1f}m, 最终z={final_z:.1f}m")
# 漂移分析
ax6 = fig.add_subplot(3, 2, 6)
# 研究径向偏移对漂移的影响
x0_values = np.linspace(-100, 100, 21)
drift_rates = []
for x0 in x0_values:
X0 = [x0, 0, 0, 0, 0, 0]
states = cw.analytical_solution(X0, [0, 1000])
# 近似漂移率: Δz/Δt
drift_rate = 6 * omega * x0
drift_rates.append(drift_rate)
ax6.plot(x0_values, drift_rates, 'b-', linewidth=2)
ax6.set_xlabel('初始径向位置 x0 (m)')
ax6.set_ylabel('漂移率 (m/s)')
ax6.set_title('径向位置引起的漂移率\n$\\dot{z}_{drift} = 6\\omega x_0$')
ax6.grid(True)
ax6.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax6.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.tight_layout()
plt.show()
analyze_initial_conditions()
五、工程意义与应用
5.1 交会对接中的应用
脉冲制导计算
利用解析解可以直接计算最优脉冲:
python
class CWGuidance:
"""基于CW解析解的制导算法"""
def __init__(self, omega):
self.omega = omega
self.cw = ClohessyWiltshireSolver(omega)
def two_impulse_rendezvous(self, X0, T):
"""
两脉冲交会制导
X0: 初始相对状态
T: 交会时间
返回: ΔV1, ΔV2, 总ΔV
"""
x0, y0, z0, vx0, vy0, vz0 = X0
# 状态转移矩阵在时间T
phi = self.cw.state_transition_matrix(T)
# 分块矩阵
phi_rr = phi[:3, :3]
phi_rv = phi[:3, 3:]
phi_vr = phi[3:, :3]
phi_vv = phi[3:, 3:]
r0 = np.array([x0, y0, z0])
v0 = np.array([vx0, vy0, vz0])
# 第一个脉冲
delta_v1 = -np.linalg.inv(phi_vv) @ (phi_vr @ r0 + phi_vv @ v0)
# 第一个脉冲后的速度
v1 = v0 + delta_v1
# 传播到时间T
r_T = phi_rr @ r0 + phi_rv @ v1
v_T = phi_vr @ r0 + phi_vv @ v1
# 第二个脉冲 (使最终相对速度为零)
delta_v2 = -v_T
total_delta_v = np.linalg.norm(delta_v1) + np.linalg.norm(delta_v2)
return delta_v1, delta_v2, total_delta_v
def multi_impulse_optimization(self, X0, Xf, time_steps, max_impulses=5):
"""
多脉冲优化制导
最小化总ΔV
"""
# 构建优化问题
# 目标: min Σ ||ΔV_i||
# 约束: 状态转移方程 + 最终状态约束
n_states = 6
n_controls = 3
# 决策变量: 每个时间步的ΔV
n_vars = max_impulses * n_controls
# 这里简化演示,实际需要使用优化库
print(f"多脉冲优化问题: {max_impulses}个脉冲,{len(time_steps)}个时间步")
# 返回简化结果
return np.zeros((max_impulses, 3)), 0.0
5.2 相对轨道设计
编队飞行构型
CW方程可以设计特定的相对轨道:
python
def design_formation_orbits(omega):
"""设计基于CW方程的编队轨道"""
formations = {
"along-track": {
"description": "沿航向编队,固定切向间隔",
"X0": [0, 0, -100, 0, 0, 0],
"characteristics": "z=常数,无漂移"
},
"projected-circle": {
"description": "投影圆编队",
"X0": [0, 50, 0, 0, 0, 0],
"characteristics": "在x-y平面投影为圆"
},
"elliptical": {
"description": "椭圆相对轨道",
"X0": [50, 0, 0, 0, 0, 0.1],
"characteristics": "平面内椭圆运动"
},
"drifting": {
"description": "漂移编队",
"X0": [20, 0, 0, 0, 0, 0],
"characteristics": "线性漂移,用于重访"
}
}
cw = ClohessyWiltshireSolver(omega)
t = np.linspace(0, 2*np.pi/omega, 100)
fig, axes = plt.subplots(2, 2, figsize=(12, 10), subplot_kw={'projection': '3d'})
for ax, (name, config) in zip(axes.flat, formations.items()):
states = cw.analytical_solution(config["X0"], t)
ax.plot(states[:, 0], states[:, 1], states[:, 2], 'b-', linewidth=2)
ax.scatter([0], [0], [0], c='r', s=50, marker='o')
ax.set_xlabel('R-bar')
ax.set_ylabel('H-bar')
ax.set_zlabel('V-bar')
ax.set_title(f'{name}\n{config["description"]}')
ax.grid(True)
plt.tight_layout()
plt.show()
return formations
# 示例:编队设计
omega = 0.00113
formations = design_formation_orbits(omega)
5.3 误差传播分析
python
def error_propagation_analysis(cw_solver, X0_nominal, covariance0, t):
"""
误差传播分析
covariance0: 初始协方差矩阵 (6x6)
"""
# 状态转移矩阵
phi = cw_solver.state_transition_matrix(t)
# 误差传播: P(t) = Φ(t) P0 Φ(t)^T
P_t = phi @ covariance0 @ phi.T
# 提取位置误差椭圆
position_cov = P_t[:3, :3]
# 特征值分解得到误差椭圆
eigenvalues, eigenvectors = np.linalg.eig(position_cov)
# 1σ误差椭球半径
sigma_radii = np.sqrt(eigenvalues)
return P_t, sigma_radii, eigenvectors
# 示例误差分析
omega = 0.00113
cw = ClohessyWiltshireSolver(omega)
# 初始协方差 (假设各向同性,1σ=10m位置误差,0.1m/s速度误差)
P0 = np.diag([100, 100, 100, 0.01, 0.01, 0.01]) # 方差
# 分析不同时间的误差传播
times = [0, 300, 600, 1800] # 0, 5, 10, 30分钟
print("误差传播分析:")
for t in times:
P_t, sigma_radii, _ = error_propagation_analysis(cw, np.zeros(6), P0, t)
print(f"时间 t={t}s: 位置误差椭球半径(1σ) = {sigma_radii}")
六、向量形式与解析形式的比较
6.1 对比总结
| 特性 | 向量形式 | 解析形式 |
|---|---|---|
| 表述方式 | 向量/张量运算 | 标量方程 |
| 数学复杂度 | 中等 | 较低 |
| 物理直观性 | 高(揭示本质) | 中等 |
| 计算便利性 | 需要坐标展开 | 直接代入计算 |
| 推广性 | 易于推广到其他坐标系 | 需要重新推导 |
| 控制设计 | 适合现代控制理论 | 适合经典控制 |
| 数值稳定性 | 矩阵运算稳定 | 三角函数可能累积误差 |
| 适用场景 | 理论研究、复杂系统 | 工程计算、快速分析 |
6.2 选择建议
- 理论研究、推导新方法:使用向量形式
- 快速工程计算、交会分析:使用解析形式
- 控制系统设计:使用状态空间(矩阵)形式
- 数值仿真:使用ODE数值积分
- 教学演示:结合使用,从向量到解析
七、扩展与展望
7.1 非线性扩展
当相对距离较大时,需要非线性模型:
r⃗¨+2ω⃗×r⃗˙+ω⃗×(ω⃗×r⃗)=−μ(R⃗t+r⃗∣R⃗t+r⃗∣3−R⃗t∣R⃗t∣3) \ddot{\vec{r}} + 2\vec{\omega} \times \dot{\vec{r}} + \vec{\omega} \times (\vec{\omega} \times \vec{r}) = -\mu\left(\frac{\vec{R}_t + \vec{r}}{|\vec{R}_t + \vec{r}|^3} - \frac{\vec{R}_t}{|\vec{R}_t|^3}\right) r ¨+2ω ×r ˙+ω ×(ω ×r )=−μ(∣R t+r ∣3R t+r −∣R t∣3R t)
7.2 摄动项加入
实际应用中需考虑各种摄动力:
r⃗¨+2ω⃗×r⃗˙+ω⃗×(ω⃗×r⃗)=Gr⃗+a⃗pert \ddot{\vec{r}} + 2\vec{\omega} \times \dot{\vec{r}} + \vec{\omega} \times (\vec{\omega} \times \vec{r}) = \mathbf{G}\vec{r} + \vec{a}_{pert} r ¨+2ω ×r ˙+ω ×(ω ×r )=Gr +a pert
其中a⃗pert\vec{a}_{pert}a pert包括:
- J2J_2J2摄动
- 大气阻力
- 太阳光压
- 第三体引力
7.3 现代应用
- 自主交会对接:结合机器视觉和CW方程
- 大规模星座:用于碰撞规避
- 在轨服务:非合作目标接近
- 深空探测:地月空间、火星轨道的相对运动
结论:完美结合的两种表述
Clohessy-Wiltshire方程的向量形式 和解析形式 不是相互竞争,而是互补的两种视角:
- 向量形式如交响乐的总谱,揭示结构和本质
- 解析形式如各个乐器的分谱,具体可执行
向量形式告诉我们为什么 相对运动会有这样的特性(科里奥利耦合、引力梯度),而解析形式告诉我们如何计算具体的轨迹。
在60多年的航天实践中,工程师们根据具体需求灵活选择:
- 初期任务分析用解析形式快速计算
- 控制系统设计用状态空间形式
- 理论研究用向量形式推导新方法
- 高精度任务用数值积分考虑非线性
这正是Clohessy-Wiltshire方程的持久魅力所在------它既深刻又实用,既严谨又灵活,为人类探索太空提供了坚实的数学基础。无论是阿波罗的历史性交会,还是今天的国际空间站补给,或是未来的火星任务,CW方程都将继续发挥其不可替代的作用。