最初のバージョンについて建設的なコメントを残したすべての人に感謝します。 これにより、問題の深さを理解できました。 kahi4 、 Ethril 、 Uriおよびlexasssのユーザーに感謝します
シミュレータが成長しました。 一般的な規則に従ってすべての物体が相互に影響を及ぼし、オイラー法は過去のものであり、シミュレーション用のシステムなどを選択できるようになりました。
次は、制御された装置で広大な宇宙を征服する時です。
軌跡がはっきりしている
フライトが終了すること
私たちはあなたを思い出し、嘆き悲しみます。
MCC。
泡
私たちの目標は共産主義です。 ロケット工場
そのため、 Spacesimスターシステムシミュレーターを使用すると、システムの初期状態を設定し、その動作をシミュレートできます。
今、古典的な完璧なシングルステージロケットロケットがあることを想像してください。
ロケットに乾燥質量mを持たせ、
燃料質量mfで満たされています
エンジン推力-z
と燃費-n
エンジンに無制限のリソースと無制限の開始を持たせてください。
ロケットが質量Mおよび半径Hの惑星の表面にあると仮定します。主なタスクは、ロケットを惑星の周りの円形軌道に発射することです。
天国
円形軌道に打ち上げる前に、ロケットを垂直に上向きに打ち上げ、その動きを観察します。
2つの力がロケットに作用します。
1.エンジンの推力(上昇):F = n * z
2.惑星の重力(下):F = G * M *(m + mf)/ r ^ 2、m + mf-ロケットの総質量、r-ロケットから惑星の中心までの距離。
以下では、G = 1に設定します
ロケットに作用する結果の力は次のようになります:n * z-G * M *(m + mf)/ r ^ 2
ここから、ロケットの加速を見つけることができます。
a = n * z /(m + mf)-M / r ^ 2
これで、惑星重力の影響下でロケットの動きを垂直方向に簡単に計算できます
オイラーの方法:
H=409.0 #Start level above sea t=0 m=2 #Mass of equipment mf=9 #Mass of Fuel M=600000 #Planet mass y=H + 1 #Initial position a=0 #accel v=0 #speed f=0 #engine accel n=1 #Fuel consumption z=40.0 #Fuel impulse cnt = 0 #Step count dt = .1 maxy = 0 while(y > H and cnt < 300000000): if mf > 0: f = n*z/(m + mf) #Engine gives acceleration to mf -= dt*n #Fuel goes down else: f = 0 #Out of fuel a = f - M/y**2 #Total = engine - gravity v += dt*a #new speed y += dt*v #new altitude maxy = max(maxy, y) print("Step: ", cnt, " Height: ", y, " VSpeed: ", v) cnt += 1 print(dt ,maxy)
ルンゲクッタ法
H=409.0 #Start level above sea t=0 m=2 #Mass of equipment mf=9 #Mass of Fuel M=600000 #Planet mass x=H + 1 #Initial position a=0 #accel v=0 #speed f=0 #engine accel n=1 #Fuel consumption z=40.0 #Fuel impulse cnt = 0 #Step count dt = .1 maxy = 0 def f(t, x, v): global m,mf,n,z if mf > 0: f = n*z/(m + mf) #Engine gives acceleration to else: f = 0 #Out of fuel a = f - M/x**2 #Total = engine - gravity #We'll use Runge-Kutta method return a #new speed def g(t, x, v): return v while(x > H and cnt < 30000): maxy = max(maxy, x) k1 = dt * f(t, x, v) q1 = dt * g(t, x, v) k2 = dt * f(t + dt/2, x + q1/2, v + k1/2) q2 = dt * g(t + dt/2, x + q1/2, v + k1/2) k3 = dt * f(t + dt/2, x + q2/2, v + k2/2) q3 = dt * g(t + dt/2, x + q2/2, v + k2/2) k4 = dt * f(t + dt, x + q3, v + k3) q4 = dt * g(t + dt, x + q3, v + k3) v1 = v + (k1 + 2*k2 + 2*k3 + k4)/6 x1 = x + (q1 + 2*q2 + 2*q3 + q4)/6 print("Step: ", cnt, " Height: ", x1, " Speed: ", v1) cnt += 1 t += dt v = v1 x = x1 if mf > 0: mf -= dt*n #Fuel goes down print(dt ,maxy)
ご覧のとおり、結果は非常に正確に一致しています
すべてをまとめる
それで、ジェットエンジンを始動して垂直に離陸する方法を学びました。
また、最後の部分のシミュレーターもあります。このシミュレーターでは、重力の影響下で物体が互いに相対的に移動します。
それらを組み合わせてください! ロケットをシミュレーターに追加します。
プログラムを実行しているオンボードコンピューターをロケットに追加します。
循環軌道に入るには、このアルゴリズムに従って動作します:
1.エンジンを始動すると、ロケットが飛び始めます。
2.エンジンを停止します。 ロケットが慣性を飛ばす
3.ロケット本体を90度回転させます。
4.垂直速度がゼロになった瞬間に、エンジンをオンにします
5.しばらくして、エンジンを停止します。
そして、これは実装がどのように見えるかです:
class EarthOrbiter(Rocket): def flightProgram(self): #Take off and turn 90" right if self.mode == 0: self.engineOn() self.mode = 1 if self.t > 12.0 and self.mode == 1: self.engineOff() self.setHead(90) self.mode = 2 #Go to round orbit if self.t > 20 and self.mode == 2: self.engineOn() self.mode = 3 if self.t >= 27 and self.mode == 3: self.engineOff() self.mode = 4
ロケットのイベントは、飛行時間と以前の状態に応じて発生します。
ビンゴ! フライトは正常です。 軌道は安定しています。
短い最初のフライトのアイデアは次のとおりです。
フライトビデオ1
フライトビデオ2
月に飛びます!
次のステップは、システムに月を追加して、そこに飛ぶことです。
また、計画には多段ミサイルがあります。
ソース-ここ
Update1:月へのフライトが追加されました。
惑星にミサイルを着陸させる機能を追加しました。
Update2:2つの宇宙船をドッキングする機能が追加されました。