1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| def Coordinate_Classic(R, V, miu): # 经典坐标:将速度和位置转换为轨道因素 # miu:中心天体的 GM # data:对于椭圆和双曲线:a;e;i;w;W;fai 的转移轨道 # %a:半长轴;e:离心率;i:倾角; # %w:近地点幅角;W:升交点经度;fai:真近点角。 # 对于抛物线:p;i;w;W;fai 的转移轨道 # %p:半矩形矩;i:倾角;w:近地点幅角; # %W:升交点经度;fai:真近点角。 # 对于圆:a;i;u;W; 的转移轨道 # %a:半径;i:倾角;u:纬度参数; # %W:升交点经度; # 坐标:位置 # V:速度 # 计算位置矢量的模长 r = np.sqrt(np.dot(R, R)) # 如果速度矢量的模长与两倍位置矢量的模长之差不为零 if 2/r - np.dot(V, V)/miu != 0: # 计算椭圆轨道的半长轴 a = 1/abs(2/r - np.dot(V, V)/miu) else: a = None # 计算能量矢量 E = (np.dot(V, V)/miu - 1/r) * R - np.dot(R, V)/miu * V # 计算轨道离心率 e = np.sqrt(np.dot(E, E)) # 计算角动量矢量 H = np.cross(R, V) # 计算角动量的模长 h = np.linalg.norm(H) # 计算抛物线轨道的半矩形矩 p = h**2 / miu Z = np.array([0, 0, 1]) X = np.array([1, 0, 0]) Y = np.array([0, 1, 0]) N = np.cross(Z, H) # 计算升交点赤经的单位矢量 n = np.linalg.norm(N) # 计算倾角 i = np.arccos(np.dot(Z, H)/h) # 如果轨道离心率不为零 if e != 0: # 计算近地点幅角 w = np.arccos(np.dot(N, E)/n/e) if np.dot(Z, E) < 0: w = 2*np.pi - w else: # 计算纬度参数 u = np.arccos(np.dot(N, R)/n/r) if np.dot(R, Z) < 0: u = 2*np.pi - u # 计算升交点赤经 W = np.arccos(np.dot(X, N)/n) if np.dot(Y, N) < 0: W = 2*np.pi - W # 如果轨道离心率不为零 if e != 0: # 计算真近点角 fai = np.arccos(np.dot(E, R)/e/r) if np.dot(R, V) < 0: fai = 2*np.pi - fai # 如果速度矢量的模长与两倍位置矢量的模长之差不为零 if 2/r - np.dot(V, V)/miu != 0: # 如果轨道离心率不为零 if e != 0: data = [a, e, i, w, W, fai] else: data = [a, i, u, W] else: data = [p, i, w, W, fai] return data
|