「磁石で物を浮かせる」——子供の頃、誰もが一度は夢見たことがあるんじゃないでしょうか。でも実は、永久磁石だけでは物体を空中で安定させることができません。これは物理法則で証明されている事実なんです。
一方で、リニアモーターカーは実際に浮上して時速500km以上で走っています。なぜリニアモーターカーは浮いていられるのか? その秘密は「PID制御」という仕組みにあります。
この記事では、ブラウザで動く磁気浮上シミュレーターを題材に、数式・コード・実践を交えながら、磁気浮上の原理を徹底的に解説します。最後まで読めば、自分でPIDゲインを調整して安定浮上を実現できるようになりますよ。
「永久磁石だけじゃダメ」——アーンショーの定理という壁
まず、なぜ永久磁石だけでは物体を安定して浮かせられないのか。これを理解するために、アーンショーの定理という物理法則を紹介します。
この定理をざっくり言うと:
静磁場(時間変化しない磁場)だけでは、すべての方向で安定な浮上点は作れない
つまり、上下方向で反発させて浮かせようとすると、横方向では引き寄せられてしまうんです。まるで「風船を押すと横に逃げる」ような感じですね。
シミュレーターで試してみましょう。「磁力定数K」を大きくして永久磁石モードにすると、物体が一瞬浮いたかと思うと、すぐに横にずれて落下します。これがアーンショーの定理の現れです。
では、どうすれば安定浮上を実現できるのか? 答えは 「能動的な制御」 です。つまり、磁力をリアルタイムで調整しながら、物体の位置を常に監視して補正し続けるんですね。
ざっくり本質——「見ながら調整する」仕組み
磁気浮上制御の本質は、人間がコップの上のボールをバランスするのと似ています。
- コップの上にボールを置こうとしても、そのままでは落ちる(=永久磁石だけでは不安定)
- しかし、手で支えながら、ボールの位置を目で見て、手の力を微調整すれば、バランスを保てる
この「目で見る」「判断する」「手を動かす」の3ステップを、機械が自動でやってくれるのがPID制御です。
「センサーで位置を計測 → 目標との差を計算 → 電磁石の電流を調整」の無限ループ
このループを1秒間に何千回も繰り返すことで、安定浮上が実現するんですね。
数式で理解する——磁気浮上の物理とPID制御
磁気吸引力のモデル
まず、電磁石が物体を引き付ける力を数式で表します。シミュレーターでは以下のモデルを使っています:
F_m = K \cdot \frac{I^2}{x^2}
ここで:
- $F_m$:磁気吸引力 [N]
- $K$:磁力定数(電磁石の強さを決める係数)
- $I$:コイル電流 [A]
- $x$:電磁石と物体のギャップ [m]
この式が示すのは、ギャップが小さくなるほど磁力が急激に強くなるという性質。これが制御を難しくする原因でもあります。
運動方程式
物体の運動はニュートンの第二法則で記述します:
m \cdot \frac{d^2x}{dt^2} = mg - F_m + F_{ext}
- $m$:物体の質量 [kg]
- $g$:重力加速度 [m/s²]
- $F_{ext}$:外部から加わる力 [N]
右辺は「重力」−「磁気吸引力」+「外力」。この釣り合いが崩れると物体が動きます。
PID制御の式
目標ギャップを $x_{ref}$、現在のギャップを $x(t)$ とすると、誤差 $e(t)$ は:
e(t) = x_{ref} - x(t)
この誤差をもとに、電磁石の電流を次のPID則で決定します:
I(t) = K_p \cdot e(t) + K_i \cdot \int e(t) dt + K_d \cdot \frac{de(t)}{dt}
各項の役割は:
- 比例項(P):現在の誤差に比例した力を出す。応答を速くする。
- 積分項(I):過去の誤差を蓄積し、定常偏差(ずっと残る誤差)をゼロに近づける。
- 微分項(D):誤差の変化速度を見て、振動を抑制する(ダンピング効果)。
この3つのゲイン($K_p, K_i, K_d$)を適切に調整することが、安定浮上の鍵です。
コードで実装する——シミュレーションの核心を再現
それでは、実際にシミュレーションの計算ロジックをJavaScriptで再現してみましょう。以下のコードは、シミュレーターの1ステップ分の計算を抜き出したものです:
// 磁気浮上シミュレーションの1ステップ
function simulationStep(state, dt, params) {
// パラメータを展開
const { m, g, K, Kp, Ki, Kd, x_ref, F_ext } = params;
let { x, v, integral, I_prev } = state;
// 1. 誤差を計算
const error = x_ref - x;
// 2. 積分項(アンチワインドアップ付き)
integral += error * dt;
// 積分値が大きくなりすぎないように制限
const integral_max = 100;
integral = Math.max(-integral_max, Math.min(integral_max, integral));
// 3. 微分項(後退差分法)
const derivative = (error - I_prev) / dt;
// 4. PID制御で電流を計算
const I = Kp * error + Ki * integral + Kd * derivative;
// 5. 磁気吸引力を計算(電流は0以下にならないように)
const I_clamped = Math.max(0, I);
const F_m = K * (I_clamped * I_clamped) / (x * x + 0.001); // ゼロ割防止
// 6. 加速度を計算(運動方程式)
const a = g - (F_m / m) + (F_ext / m);
// 7. 速度と位置を更新(オイラー法)
v += a * dt;
x += v * dt;
// 8. 状態を更新して返す
return {
x: x,
v: v,
integral: integral,
I_prev: error // 次の微分計算用
};
}
// 使用例:1ステップ進める
const state = {
x: 0.010, // 現在のギャップ [m](10mm)
v: 0.0, // 速度 [m/s]
integral: 0.0, // 積分値の累積
I_prev: 0.0 // 前回の誤差
};
const params = {
m: 0.1, // 質量 [kg]
g: 9.81, // 重力加速度 [m/s²]
K: 0.005, // 磁力定数
Kp: 500, // 比例ゲイン
Ki: 10, // 積分ゲイン
Kd: 50, // 微分ゲイン
x_ref: 0.008, // 目標ギャップ [m](8mm)
F_ext: 0.0 // 外力 [N]
};
const dt = 0.001; // 時間刻み [s](1ms)
const newState = simulationStep(state, dt, params);
このコードのポイントは:
- アンチワインドアップ:積分値が発散しないように上限を設定
- ゼロ割防止:ギャップが0になっても計算が破綻しないように微小値を加算
- 電流の下限:電流が負にならないようにクランプ
実際のシミュレーターではさらに細かい処理(グラフ描画、衝突判定など)が入りますが、制御の核心はこの20行に集約されています。
数値例で確かめる——実際に計算してみよう
それでは、具体的な数値を使って1ステップの計算を追ってみましょう。
設定値:
- 質量 $m = 0.1$ kg
- 重力加速度 $g = 9.81$ m/s²
- 磁力定数 $K = 0.005$
- 目標ギャップ $x_{ref} = 0.008$ m(8mm)
- 現在のギャップ $x = 0.010$ m(10mm)→ 2mm下がっている
- 速度 $v = 0$ m/s
- 外力 $F_{ext} = 0$ N
- PIDゲイン:$K_p = 500, K_i = 10, K_d = 50$
- 時間刻み $\Delta t = 0.001$ s
Step1:誤差の計算
e = 0.008 - 0.010 = -0.002 \text{ m}
物体が目標より2mm下がっているので、誤差は負の値。
Step2:積分項(初回なので積分値は0と仮定)
\int e dt \approx 0 + (-0.002) \times 0.001 = -2.0 \times 10^{-6}
Step3:微分項(前回の誤差も0と仮定)
\frac{de}{dt} \approx \frac{-0.002 - 0}{0.001} = -2.0 \text{ m/s}
Step4:PID制御で電流を計算
I = 500 \times (-0.002) + 10 \times (-2.0 \times 10^{-6}) + 50 \times (-2.0)
I = -1.0 - 0.00002 - 100 = -101.0 \text{ A}
でも、電流は負になれないので $I = 0$ A にクランプされます。
Step5:磁気吸引力
F_m = 0.005 \times \frac{0^2}{(0.010)^2 + 0.001} = 0 \text{ N}
Step6:加速度
a = 9.81 - \frac{0}{0.1} + \frac{0}{0.1} = 9.81 \text{ m/s}^2
Step7:速度と位置の更新
v = 0 + 9.81 \times 0.001 = 0.00981 \text{ m/s}
x = 0.010 + 0.00981 \times 0.001 = 0.01000981 \text{ m}
物体は重力でさらに下がりました。でも、次のステップでは誤差が大きくなり、微分項がさらに大きな制御信号を生み出します。このループを繰り返すうちに、電磁石が十分な吸引力を発揮する電流値に達し、物体は目標位置に向かって引き上げられていきます。
この計算からわかるのは、最初のうちは重力に負けて落下するが、制御が追いついて浮上を開始するという過渡的な挙動です。
シミュレーターで遊ぶ——3つの実験で体感しよう
実際にシミュレーターを開いて、以下の実験を試してみてください。
実験1:Pゲインだけを大きくするとどうなる?
操作: 比例ゲイン $K_p$ を 500 → 2000 に上げてみる($K_i=0, K_d=0$)
結果: 応答は速くなるが、物体が目標位置を行き過ぎて激しく振動(ハンチング) する。これは比例制御だけでは「行き過ぎを止める力」が足りないから。
なぜ? P制御は「今の誤差」にしか反応しない。誤差が小さくなると電流も小さくなるので、慣性で行き過ぎてしまう。これが 「過制御」 の状態です。
実験2:Dゲインで振動を抑える
操作: $K_p=2000, K_d=0$ で振動している状態から、$K_d$ を 50 → 200 に上げる
結果: 振動が収まり、滑らかに目標位置に収束する。まるでダンパーが効いたような動き。
なぜ? 微分項は「誤差の変化速度」を見ている。物体が目標に近づく速度が速いほど、ブレーキをかけるように電流を減らす方向に働く。これがダンピング効果です。
実験3:外力を加えてみる
操作: 安定浮上中($K_p=500, K_i=10, K_d=50$)に「外力 $F_{ext}$」を 2N に設定する
結果: 物体が一瞬押し下げられるが、PID制御が即座に電流を増やして元の高さに戻す。外力を0に戻すと、少しオーバーシュートしてから再び安定。
なぜ? 積分項が「外力によって生じた定常誤差」を蓄積し、それを打ち消す方向に電流を調整する。ただし、積分ゲインが大きすぎると、外力がなくなった後に「積分ワインドアップ」が発生して大きく行き過ぎることも。
現場でハマるポイント——実機で泣かないための注意点
シミュレーターで遊んで「簡単じゃん」と思ったあなた。実機では以下の落とし穴が待っています。
1. 「Pゲインを上げれば速くなる」は大間違い
確かに $K_p$ を上げれば応答は速くなります。でも、ある閾値を超えると制御系が発振します。実機ではコイルが過熱したり、制御装置が故障する原因に。
実務の目安: 振動が収まるギリギリ手前の値が「最適ゲイン」の第一歩。シミュレーターでいうと、$K_p$ を少しずつ上げて、振動し始めたら10%戻す、という調整が王道です。
2. 「Dゲインは大きければ大きいほど良い」も危険
微分項は誤差の「変化速度」を見ているので、センサーのノイズを極端に増幅します。例えば、ギャップ測定値に0.01mmのノイズが乗っていたら、$K_d$ が大きいとそれが巨大な制御信号の乱れに変わってしまう。
実務の対策: 「不完全微分」という手法を使います。微分項にローパスフィルタをかけて、高周波ノイズの影響を抑えるんです。
3. 「Iゲインは最初から大きくしておこう」が一番危険
積分項は過去の誤差をずっと蓄積します。急に外力がかかった後などに、誤差は解消されたのに蓄積した値(積分ワインドアップ)が残り、制御が大きくオーバーシュートする原因に。
実務の対策: 「アンチワインドアップ」が必須。シミュレーターのコードでも実装したように、積分値の上限を設定するのが基本です。
これらの問題は、シミュレーターで $K_i$ を大きくしてから外力を加えたり、$K_d$ を大きくしてノイズを模擬してみると体感できます。
まとめ——3つの要点
- 永久磁石だけでは安定浮上できない(アーンショーの定理)。能動的な制御が必要。
- PID制御は「P(比例)で応答、D(微分)で制振、I(積分)で定常偏差除去」 の3役。この順番で調整するのがセオリー。
- 実機ではゲインの限界とノイズ対策が重要。シミュレーターで安全に試行錯誤できるのが最大のメリット。
最後に、この記事で使ったシミュレーターを改めて紹介します。
▶ 磁気浮上シミュレーター(PID制御) — ブラウザで即動作、登録不要
スライダーを動かすだけでPIDゲインを調整でき、リアルタイムで浮上の様子が観察できます。リニアモーターカーや磁気軸受の原理を、手を動かしながら学べる優れたツールです。
NovaSolverでは、この他にも700以上の工学シミュレーターを無料公開しています。
「理論と実践の橋渡し」——それがシミュレーターの力です。ぜひ遊んでみてください。