| 分類:[C#]
2011/01/05(Wed) 20:22:03 編集(投稿者) 2011/01/05(Wed) 20:21:37 編集(投稿者) 2011/01/05(Wed) 20:21:18 編集(投稿者)
<pre><pre>この掲示板の使い方がよく解らない。 自分なりにやってみます。ありがとうございました。
皆さんへ!!!!! 人工衛星の打ち上げシュミレーションプログラムを作成中、Cは少し理解できるのですが、RV2ELは、以下ソースの逆を行うプログラムですが、Cは少し理解できるのですが、ベクトル演算のようです。
Private Sub Form_Load()
A = 7278.165905 'km E = 0.000444115 Inc = 99.114282 '(度) Peri = 284.209888 '(度) Node = 272.722924 '(度) Ma = 168.026666 '(度) End sub
Private Sub Command1_Click() CalcKeplar 'TLE→Pos,Vel RVel Pos, Vel'Pos,Vel→TLE End Sub
’標準モジュール Public A#, B#, Inc#, E#, Peri#, Node#, Ma#, MMo#
'ケプラリアン軌道要素からPos、Velを求める。 Public Sub CalcKeplar()
Dim Rad#, Pi# Pi = 3.14159265358979 Rad = 0.0174532925
Dim Mk#, Ek#, Ec#
Mk = Ma * Rad '衛星軌道面の離心近点角の計算 Ek (rad) 'ケプラーの方程式 Mk = Ek - E * SIN(Ek) Ec = Mk + E * Sin(Mk) KepLoop: Ek = Mk + E * Sin(Ec) If Abs(Ec - Ek) > 0.000000000001 Then Ec = Ek GoTo KepLoop End If
Dim CosEk#, SinEk# CosEk = Cos(Ek) SinEk = Sin(Ek)
'衛星軌道面の真近点角の計算 Dim VK# VK = Atn((1 - E ^ 2) ^ 0.5 * Sin(Ek) / (Cos(Ek) - E)) If (Cos(Ek) - E) < 0 Then VK = VK + Pi End If If VK < 0 Then VK = 2 * Pi + VK End If
'離心近点角Ekから動径Pkを求める(動径Rkは地球重心から衛星までの距離) Dim Rk# Rk = A * (1 - E * Cos(Ek)) '動径Rkと真近点角Vkから衛星のxy座標を求める '衛星軌道面の位置直交座標の計算 ' Xk,Yk (m) Dim Xk As Double, Yk As Double Xk = Rk * Cos(VK) Yk = Rk * Sin(VK)
Form1.List2.Clear Form1.List2.AddItem "離心近点角(度): " & Ek / Rad Form1.List2.AddItem "真近点角(度): " & VK / Rad Form1.List2.AddItem "動径(km): " & Rk Form1.List2.AddItem "x座標(km): " & Xk Form1.List2.AddItem "y座標(km): " & Yk
B = A * Sqr(1 - E ^ 2) '軌道短半径計算 Dim AXNSL#, AYNSL#, XL# AXNSL = E * Cos(Peri * Rad) AYNSL = E * Sin(Peri * Rad)
'INTERMEDIATE QUANTITIES(中間値) Dim ECosE#, ESinE#, EL2#, PL#, PL2# ECosE = AXNSL * CosEk + AYNSL * SinEk ESinE = AXNSL * SinEk - AYNSL * CosEk EL2 = AXNSL * AXNSL + AYNSL * AYNSL PL = A * (1# - EL2) PL2 = PL * PL Dim R#, Rdot#, RVdot# R = A * (1# - ECosE) Rdot = XKE * Sqr(A) / R RVdot = XKE * Sqr(PL) / R Dim NodeK#, IncK# NodeK = Node * Rad IncK = Inc * Rad '*Orientation VECTORS Dim SinUK#, CosUK#, SinNoK#, CosNoK#, SinIK#, CosIK#
SinUK = Sin(VK) CosUK = Cos(VK)
SinNoK = Sin(NodeK) CosNoK = Cos(NodeK)
SinIK = Sin(IncK) CosIK = Cos(IncK)
Dim XMX#, XMY#, XMZ# XMX = -SinNoK * CosIK XMY = CosNoK * CosIK XMZ = SinIK
Form1.List2.AddItem "" Form1.List2.AddItem "XMX: " & XMX Form1.List2.AddItem "XMY: " & XMY Form1.List2.AddItem "XMZ: " & XMZ
Dim UX#, UY#, UZ# UX = XMX * SinUK + CosNoK * CosUK UY = XMY * SinUK + SinNoK * CosUK UZ = SinIK * SinUK
Dim VX#, VY#, VZ# VX = XMX * CosUK - CosNoK * SinUK VY = XMY * CosUK - SinNoK * SinUK VZ = SinIK * CosUK
'*POSITION AND VELOCITY Dim x#, y#, z#, Xdot#, Ydot#, Zdot#
x = Rk * UX '* Xkmper y = Rk * UY '* Xkmper z = Rk * UZ '* Xkmper
Xdot = Rdot * UX Ydot = Rdot * UY Zdot = Rdot * UZ
Xdot = RVdot * VX + Xdot Ydot = RVdot * VY + Ydot Zdot = RVdot * VZ + Zdot
Form1.List2.AddItem "" Form1.List2.AddItem "x: " & x Form1.List2.AddItem "y: " & y Form1.List2.AddItem "z: " & z Pos(0) = x Pos(1) = y Pos(2) = z
Form1.List2.AddItem "" Form1.List2.AddItem "Vx: " & Xdot Form1.List2.AddItem "Vy: " & Ydot Form1.List2.AddItem "Vz: " & Zdot Vel(0) = Xdot Vel(1) = Ydot Vel(2) = Zdot
End Sub </pre></pre> |