シューティング法シミュレーター 戻る
数値解析

シューティング法シミュレーター

区間の両端で条件が決まった境界値問題を「シューティング(射撃)法」で解くツールです。左端の初期勾配を当て推量しては右端まで積分し、目標値からの外れ量を見て撃ち直す——大砲で的を狙う過程をリアルタイムで可視化します。

パラメータ設定
微分方程式の係数 c(y'' = c·y)
c>0 で双曲線型(指数的)、c<0 で振動型の解になる
区間の長さ L
境界値問題を解く区間 [0, L]
左端の境界値 y(0)
区間左端で固定する解の値 A
右端の境界値 y(L)
区間右端で固定する目標値 B(射撃の的)
最大反復回数
射撃を繰り返す上限。線形問題は2回で収束
計算結果
必要な初期勾配 y'(0)
到達した右端値 y(L)
端点の誤差
反復(射撃)回数
中点値 y(L/2)
収束判定
射撃の様子 — 軌道アニメーション

左端の境界点から発射し、初期勾配を変えて何度も撃つ様子です。アンダーシュート(橙)・オーバーシュート(赤)・収束した解(青・太線)が描かれ、青い軌道だけが右端の的を正確に貫きます。

収束した解 y(x)
射撃ごとの軌道
理論・主要公式

$$y''=c\,y,\quad y(0)=A,\ y(L)=B$$

解くべき境界値問題。区間 [0, L] の両端で解の値 A・B が指定される。1階の連立系 $y'=v,\ v'=c\,y$ に変換して積分する。

$$s^\star=s_0+\frac{B-y_{end}(s_0)}{y_{end}(s_1)-y_{end}(s_0)}\,(s_1-s_0)$$

初期勾配のセカント更新式。$y_{end}(s)$ は初期勾配 s で右端に到達した値、$s_0,s_1$ は試行勾配。線形の常微分方程式では $y_{end}(s)$ が s の1次式になるため、2回の射撃と1回の補間だけで境界条件に厳密に的中する。

シューティング法とは

🙋
「境界値問題」って、微分方程式の一種ですよね?普通に解くのと何が違うんですか?
🎓
ざっくり言うと、条件をどこで与えるかが違うんだ。投げたボールの軌道みたいに「最初の位置と速度」を一点でまとめて与えるのが初期値問題。一方、境界値問題は「左端で y はこの値、右端で y はあの値」というふうに、区間の両端に条件を分けて置く。例えば両端を壁に固定した梁のたわみや、両端の温度が決まった棒の定常熱伝導が境界値問題だね。両端で押さえられているのがミソだよ。
🙋
両端で決まっているなら、左端から普通にルンゲ・クッタ法で積分すればいいんじゃ…?
🎓
そこが落とし穴なんだ。ルンゲ・クッタ法のような進行型ソルバーは、出発点で「値」と「勾配」の両方がそろって初めて一歩を踏み出せる。でも境界値問題では左端で y(0) は分かっても、y'(0)、つまり初期勾配が分からない。代わりに右端の条件があるけど、それは左端から積分を始める役には立たない。出発に必要な情報が片端だけでは足りないんだよ。
🙋
なるほど…じゃあ足りない y'(0) はどうするんですか?
🎓
そこでシューティング法だ。アイデアは単純で、足りない y'(0) を「とりあえず当て推量」してしまう。勝手な勾配 s を決めれば、左端で値も勾配もそろうから、もう普通の初期値問題。ルンゲ・クッタ法で右端までズドンと積分できる。すると右端で y がある値に到達する。それが目標値 B からどれだけ外れているか——それが「外れ量(ミス)」だ。大砲で遠くの的を狙って、外れ具合を見てまた撃つ。だからシューティング(射撃)法と呼ばれるんだよ。
🙋
何度も撃ち直すと聞くと大変そうですが…左のツールだと反復回数が「2」のまま動きません。なぜですか?
🎓
いい質問だ。実はこのツールが扱う y''=c·y は s について「線形」なんだ。線形だと、右端の到達値 y_end(s) は s の1次式になる。1次式は2点を通せば一本に決まるよね。だから s=0 で1回、s=1 でもう1回撃って端点の値を測り、その2点を結ぶ直線から目標 B を通す勾配 s* を逆算する——これがセカント補間だ。3回目はいらない。端点誤差はほぼゼロ、機械精度まで的中する。だから反復回数が2なんだ。
🙋
じゃあ非線形の問題だと、もっと何度も撃つことになるんですね?
🎓
その通り。非線形だと y_end(s) が曲がった関数になって、2点の直線では当たらない。そこで「外れ量 F(s)=y_end(s)−B をゼロにする方程式を解く」と考えて、セカント法やニュートン法を反復する。各反復で1回ずつ積分して、外れ量が十分小さくなるまで撃ち続ける。境界層を含む流体の方程式みたいな硬い問題だと、初期勾配の推量が悪いと解が発散することもあって、その対策として区間を分けて撃つ「多重シューティング法」も実務ではよく使われるよ。

よくある質問

シューティング法は、区間の両端で条件が指定された境界値問題(BVP)を、片端の足りない情報を「当て推量」して初期値問題(IVP)に変換し、反復で解く数値解法です。境界値問題 y''=c·y, y(0)=A, y(L)=B では、左端の初期勾配 y'(0) が未知です。これを s と仮定してルンゲ・クッタ法で右端まで積分し、得られた y(L) が目標値 B からどれだけ「外れたか」を見て s を修正します。大砲で遠くの的を狙うように、撃っては当て直すのでシューティング(射撃)法と呼ばれます。
y''=c·y のように方程式が初期勾配 s について線形であれば、右端で到達する値 y_end(s) は s のアフィン関数(1次式)になります。1次式は2点を通れば一意に決まるため、s0=0 で1回、s1=1 でもう1回射撃して y_end を測れば、線形補間(セカントステップ)で目標値 B に的中する勾配 s* を厳密に求められます。3回目以降の反復は不要で、端点誤差は機械精度(1e-12 程度以下)まで小さくなります。
非線形問題では y_end(s) が s の1次式にならないため、2回の射撃では的中しません。この場合は端点の「外れ量」F(s)=y_end(s)−B をゼロにする非線形方程式とみなし、セカント法やニュートン法を反復適用します。各反復で1回ずつ積分を行い、外れ量が許容誤差以下になるまで繰り返します。本ツールは線形方程式を扱うため2回で収束しますが、最大反復回数のスライダーは非線形の一般手順を意識した設定になっています。
ルンゲ・クッタ法のような時間進行型のソルバーは、ある1点で「値」と「勾配」が両方そろって初めて積分を始められます。ところが境界値問題では、左端で y(0) は分かっても y'(0) が分からず、右端の条件 y(L) が代わりに与えられます。つまり片端だけでは積分の出発に必要な情報が足りません。シューティング法は欠けている y'(0) を仮定することでこの不足を埋め、境界値問題を通常の初期値問題の積分に帰着させます。

実世界での応用

構造力学の梁・はりのたわみ:両端を支持された梁の曲げ問題は、たわみ w(x) に関する境界値問題です。両端でたわみや傾きが拘束されており、初期値問題のソルバーではそのまま解けません。シューティング法を使えば、片端で未知の反力モーメントや剪断力を「当て推量」し、もう片端の境界条件を満たすまで調整することで、解析的に解きにくい変断面はりや弾性支持の梁も数値的に扱えます。

定常熱伝導と化学反応拡散:両端の温度が固定された棒の定常熱伝導、触媒粒子内の反応拡散方程式などは、典型的な境界値問題です。発熱項や温度依存の物性を含むと非線形になり、解析解が得られません。シューティング法で片端の未知の熱流束を仮定して積分し、もう片端の温度に合わせることで、温度分布や反応率の分布を求められます。

流体力学の境界層方程式:平板上の層流境界層を記述するブラジウス方程式 f'''+f·f''/2=0 は、壁面と無限遠の両方で条件をもつ非線形境界値問題です。壁面での未知のせん断応力 f''(0) をシューティング法で当て、無限遠の条件 f'→1 を満たす値を反復探索します。航空機やタービン翼まわりの摩擦抵抗・熱伝達の見積もりに直結する古典的な応用例です。

量子力学の固有値問題:1次元シュレーディンガー方程式で束縛状態のエネルギー固有値を求める計算も、両端で波動関数がゼロに減衰する境界値問題です。エネルギーをパラメータとして波動関数を片端から積分し、もう片端での値がゼロになるエネルギーをシューティング法で探します。固有値の探索とシューティング法が組み合わさる代表的なケースです。

よくある誤解と注意点

まず最大の落とし穴が、「線形問題で2回当たるから非線形でもすぐ収束する」と思い込むことです。本ツールが扱う y''=c·y は初期勾配 s について線形なので、端点到達値 y_end(s) が s の1次式となり、2回の射撃と1回の補間で厳密に的中します。しかし非線形の境界値問題では y_end(s) が曲がった関数になり、2点の直線では当たりません。初期推量が悪いと反復が振動したり、まったく収束しないこともあります。線形・非線形の区別を意識し、非線形ではセカント法・ニュートン法の反復を最後まで回す必要があります。

次に、「初期値問題の積分が発散する不安定な方程式では、シューティング法は使えない」という見落とし。係数 c が大きく正の双曲線型方程式では、解に指数的に増大する成分が含まれます。片端から積分すると、わずかな初期勾配の誤差がこの成長成分で爆発的に拡大し、端点で巨大な数値や桁あふれを起こします。区間が長いほど深刻です。実務ではこの問題を避けるため、区間を複数の小区間に分け、各区間を別々に撃って境界で接続する「多重シューティング法(multiple shooting)」が使われます。単純シューティングは万能ではないと心得てください。

最後に、「射撃の精度は補間アルゴリズムだけで決まる」という誤解。シューティング法の最終的な解の精度は、外れ量をゼロにする補間(セカント法など)だけでなく、内側で使う初期値問題ソルバーの精度にも依存します。本ツールは4次ルンゲ・クッタ法を約400ステップで用いており、線形問題では端点誤差は機械精度に達します。しかしステップ数が少なすぎたり、低次のオイラー法を使ったりすると、補間が完璧でも積分そのものに離散化誤差が残り、解はその精度より良くなりません。シューティング法は「補間」と「積分」の二段構えであり、両方の精度を確保して初めて信頼できる解が得られます。

使い方ガイド

  1. 区間長L、常微分方程式の係数を「シミュレーション条件」で設定します。例えば、熱伝導方程式 d²T/dx² + c·T = 0 の場合、係数cを入力します
  2. 左端y(0)と右端y(L)の境界条件を「左端値」「右端値」に指定します。初期勾配y'(0)は未知なため、シミュレーターが自動探索します
  3. 「シミュレーション実行」をクリックすると、異なる初期勾配で何度も積分を繰り返し、右端値が目標に一致するまで「射撃」を続けます。反復過程と誤差の減少をグラフで確認できます

具体的な計算例

梁のたわみ方程式 d²y/dx² = M(x)/EI の例:区間長L=2m、左端y(0)=0、右端y(2)=0(両端固定)、係数c=0.5。シューティング法は初期勾配y'(0)=−0.8 rad/mで試行→右端到達値y(2)=−0.05m→目標0mと乖離→y'(0)=−0.6で再試行という過程を3~5回繰り返し、最終的にy'(0)=−0.707 rad/m、中点値y(1.0)=−0.25mに収束します

実務での注意点