コンテンツにスキップ

08. Goddard問題・区間分割

例題07では、推力がゼロへ急に切り替わるところを1本の多項式で表そうとして、推力のグラフが波打ちました。 切り替わる時刻で時間を2つに分け、それぞれを別の多項式で表すと、この振動は消えます。 物理の問題は例題07とまったく同じで、変わるのは「時間の分け方」だけです。

項目内容
状態高度 hh、速度 vv、質量 mm
制御推力 TT
目的最終高度 h(tf)h(t_f) を最大にする
区間2区間(各25ノード)、境目は t=0.075t = 0.075 に固定、終了時刻は自由
新しく学ぶこと区間に分ける(ノット)ことで、不連続な制御を表す

状況は例題07と同じです。鉛直に上がるロケットを、決まった量の推進剤で最も高く上げます。 空気抵抗のため、最適な推力は「最大推力 → 中間の推力(特異弧)→ ゼロ」と変わります。

例題07の答えでは、推進剤を使い切る時刻はおよそ 0.077 でした。そこで今回は、時間を

  • 区間1:0≤t≤0.0750 \le t \le 0.075(推進剤を燃やす区間)
  • 区間2:0.075≤t≤tf0.075 \le t \le t_f(推力ゼロで惰性で上がる区間)

の2つに分け、区間ごとに別々の多項式で状態と推力を表します。区間の境目をノット(knot)と呼びます。 推力は区間の境目で不連続に変わってかまいません。量はすべて例題07と同じ無次元量です。

両方の区間で、例題07と同じ式を使います。

h˙=vv˙=T−D(h,v)m−g(h)m˙=−Tc\begin{aligned} \dot{h} &= v \\[2pt] \dot{v} &= \frac{T - D(h, v)}{m} - g(h) \\[2pt] \dot{m} &= -\frac{T}{c} \end{aligned} D(h,v)=Dc v2exp⁡ ⁣(−Hc h−h0h0),g(h)=g0(h0h)2D(h, v) = D_c\, v^2 \exp\!\left(-H_c\,\frac{h - h_0}{h_0}\right), \qquad g(h) = g_0 \left(\frac{h_0}{h}\right)^{2}

DD は空気抵抗(速度の2乗に比例し、高度とともに急に小さくなる)、gg は重力(地球中心からの距離の2乗に反比例)、 cc は排気速度です。各項の意味は例題07を参照してください。

区間1の終わりの時刻を t1t_1 とし、次の等式で固定します。

t1=0.075t_1 = 0.075

境目では、高度・速度・質量がすべてつながる(連続である)条件を課します。

h(1)(t1)=h(2)(t1)v(1)(t1)=v(2)(t1)m(1)(t1)=m(2)(t1)\begin{aligned} h^{(1)}(t_1) &= h^{(2)}(t_1) \\[2pt] v^{(1)}(t_1) &= v^{(2)}(t_1) \\[2pt] m^{(1)}(t_1) &= m^{(2)}(t_1) \end{aligned}

上付きの (1),(2)(1), (2) は区間の番号です。ロケットの位置や速度が瞬間的に跳ぶことはないので、状態は連続です。 一方、推力 TT には接続条件をつけません。区間1の最後と区間2の最初で推力が違ってよいので、 「吹かしていた推力が急にゼロになる」ことを表せます。

h(0)=1,v(0)=0,m(0)=1,v(tf)=0,m(tf)=0.6h(0) = 1,\quad v(0) = 0,\quad m(0) = 1, \qquad v(t_f) = 0,\quad m(t_f) = 0.6

例題07と同じです。地表で静止した状態から出発し、推進剤を使い切って上昇が止まった瞬間を終端とします。

0≤T≤3.5,h≥1,v≥00.6≤m≤1,t1≥0.05,tf≥0.1\begin{aligned} &0 \le T \le 3.5, \qquad h \ge 1, \qquad v \ge 0 \\[2pt] &0.6 \le m \le 1, \qquad t_1 \ge 0.05, \qquad t_f \ge 0.1 \end{aligned}

推力・高度・速度・質量の範囲は例題07と同じです。区間の時刻にも下限をつけています(t1t_1 は等式で 0.075 に固定しているので、 t1≥0.05t_1 \ge 0.05 は実際には効きません)。

J=−h(tf)J = -h(t_f)

最終高度を最大にするため、マイナスをつけて最小化します。

記号意味値
h0, g0, m0h_0,\ g_0,\ m_0初期高度・地表の重力・初期質量1
DcD_c抵抗の係数310
HcH_c空気が薄くなる速さ500
cc排気速度0.5
Tmax⁡T_{\max}最大推力3.5
mfm_f推進剤を使い切ったときの質量0.6
t1t_1区間の境目の時刻0.075

区間の時刻は [0,0.1][0, 0.1] と [0.1,0.3][0.1, 0.3] から始めます(t1t_1 は解く過程で 0.075 に移ります)。

  • 高度は全体で 1 から 1.01 へなめらかに変わる3次式、速度は 0。
  • 質量は区間1で 1 から 0.6 へ直線的に減り、区間2では 0.6 のまま。
  • 推力は区間1で最大推力 3.5、区間2で 0。

「区間1で燃やし、区間2で惰性」という答えの形を、初期推定の段階で区間に割り当てています。

高度・速度・質量・推力の時間履歴。青が区間1、橙が区間2です。点は各区間25個のノードでの値、線は区間ごとの多項式、縦の破線は区間の境目 t = 0.075、赤い点線は燃料切れの質量 0.6 と最大推力 3.5 です。
高度・速度・質量・推力の時間履歴。青が区間1、橙が区間2です。点は各区間25個のノードでの値、線は区間ごとの多項式、縦の破線は区間の境目 t = 0.075、赤い点線は燃料切れの質量 0.6 と最大推力 3.5 です。
上昇の様子。左の軌跡は区間1を青、区間2を橙で描いています。右は速度と推力の時間変化で、縦の破線が区間の境目、縦の黒線が現在の時刻です。
  • 最高到達高度は 1.0128 で、例題07の 1.0128 とほぼ同じです。
  • 推力は区間1の終わりまで出ていて、区間2では最初からゼロに保たれます。境目で推力が不連続に落ちています。
  • 区間1の終わりの質量は 0.6000 で、推進剤はほぼ区間1で使い切られています。
  • 最高点に達する時刻は 0.200 です。

擬スペクトル法は、区間全体を1本の多項式で表します。 多項式はなめらかな関数なので、推力が急にゼロになる「段差」をうまく表せず、その前後で値が波打ちます(例題07)。

区間を分けると、段差は区間1の最後のノードと区間2の最初のノードの間に置かれます。各区間の中では推力はなめらかに変わるので、 それぞれ1本の多項式で無理なく表せます。区間2の推力がすべてのノードでほぼ 0 に保たれているのはこのためです。

例題07と比べると、区間1の中の推力の波打ちも小さくなっています。これは推力が「最大推力 → 中間の推力」と変わる部分を、 25ノードの多項式だけで表せば済むようになったためです。

この例題では、境目を例題07の結果を見て t1=0.075t_1 = 0.075 に固定しました。例題07の燃焼終了時刻 0.079 より少し早いので、推進剤を少し早めに燃やし切ることになり、 最終高度は例題07よりわずかに低くなります(差は小数第5位)。区間1の終わりで推力が再び最大推力近くまで上がっているのも、 残りの推進剤を 0.075 までに燃やし切ろうとするためと考えられます。

本来、燃焼終了の時刻は答えを見るまで分かりません。等式 t1=0.075t_1 = 0.075 を外せば、境目の時刻も最適化の変数として決められます。 ただしそのときは、区間1の終わりで推進剤を使い切るといった条件を加えないと、境目が燃焼終了と一致する保証はありません。

  • 境目の時刻の等式(result.equal(ts0, 0.075))の 0.075 を 0.06 や 0.09 に変える。0.06 では推進剤を早く燃やし切る必要があり最終高度が下がるか、0.09 では区間1の中に推力の段差が入り再び振動が出るかを確かめる。
  • 各区間のノード数(Problem(..., [25, 25], ...))を [15, 10] などに減らし、例題07で 50 ノード使ったときと精度を比べる。
  • 等式 result.equal(ts0, 0.075) を消し、境目の時刻を自由にすると、どこに落ち着くか、推力がどう変わるかを見る。
ターミナルウィンドウ
uv run python examples/08_goddard_1knot.py

examples/08_goddard_1knot.py を GitHub で見る