「え、磁石で浮かせるだけなら簡単じゃないの?」
そう思ったあなた。実は磁気浮上は、何もしなければ絶対に安定しないんです。電磁石で鉄球を空中に浮かべようとしても、普通にやれば一瞬で吸い付くか、ポトッと落ちます。これ、物理の宿命なんですよね。
でも大丈夫。PID制御という仕組みを正しく設計すれば、物体は空中でピタリと静止します。しかも、その「なぜ安定するのか」を数式とコードで完全に理解できるツールがあるんです。
今回使うのはこちら▼
▶ 磁気浮上安定性解析シミュレーター
ブラウザだけで動くので、インストール不要。スライダーを動かしながら「なぜ振動するのか」「なぜ落ちるのか」をリアルタイムで体感できます。
ざっくり本質 — 「自転車に乗る」と同じ理屈
磁気浮上の安定化って、自転車に乗るのとまったく同じなんです。
自転車は止まっていると倒れる(=本質的に不安定)。でも、ペダルをこぎながらハンドルを微調整すれば、ピタッと直立して走れる。磁気浮上も同じで、常にセンサーで位置を監視し、電流をリアルタイムで調整することで、初めて安定が成り立つんです。
「静的な磁力だけでは釣り合わない。動的な制御こそが鍵である」
これが今回の核心です。
数式で理解する — 吸引力の正体
まず、電磁石が鉄球を引っ張る力 $F_{em}$ は、次の式で決まります。
F_{em} = \frac{\mu_0 N^2 A i^2}{2 x^2}
ここで:
- $\mu_0$:真空の透磁率($4\pi \times 10^{-7}$ H/m)
- $N$:コイルの巻数
- $A$:磁極の断面積(m²)
- $i$:コイルに流れる電流(A)
- $x$:電磁石と浮上体のギャップ(m)
ポイントは $x^2$ で割っているところ。ギャップが小さくなると、力が急激に増大します。これが「吸い付き」の原因です。
一方、重力は $mg$ で一定。釣り合い位置 $x_0$ では次の関係が成り立ちます。
\frac{\mu_0 N^2 A i_0^2}{2 x_0^2} = mg
ここから「目標ギャップを保つには、どのくらいの電流が必要か」が計算できます。
そして、この釣り合いの周りで微小な変動が起きたときの線形化モデルが、制御設計の出発点になります。これがPID制御で補償する対象です。
コードで実装する ★最重要★
では、実際にシミュレーターのコアロジックをJavaScriptで再現してみましょう。ブラウザのコンソールでも動きます。
// 磁気浮上シミュレーター(1自由度・PID制御)
// 物理パラメータ(シミュレーターの初期値に対応)
const params = {
mu0: 4 * Math.PI * 1e-7, // 真空透磁率 [H/m]
N: 200, // コイル巻数
A: 0.001, // 極面積 [m²]
m: 0.05, // 浮上体質量 [kg]
g: 9.81, // 重力加速度 [m/s²]
x0: 0.01, // 目標ギャップ [m](10mm)
i0: 0.5 // 平衡電流 [A](初期値)
};
// PIDゲイン(スライダーで調整する値)
let Kp = 500; // 比例ゲイン
let Ki = 1; // 積分ゲイン
let Kd = 50; // 微分ゲイン
// 状態変数
let x = 0.012; // 現在のギャップ [m](初期は目標より少し下)
let dx = 0; // 速度 [m/s]
let integral = 0; // 積分項
// 吸引力計算
function calcForce(i, x) {
return (params.mu0 * params.N ** 2 * params.A * i ** 2) / (2 * x ** 2);
}
// 1タイムステップ更新(Δt = 0.001秒)
function step(dt = 0.001) {
// 1. 偏差を計算
const error = params.x0 - x;
// 2. PID制御で電流指令値を計算
const P = Kp * error;
integral += error * dt;
const I = Ki * integral;
const D = Kd * (-dx); // 速度の符号に注意(位置の微分)
const i = params.i0 + P + I + D;
// 3. 吸引力を計算
const Fem = calcForce(i, x);
// 4. 運動方程式(ニュートンの第二法則)
const acceleration = (Fem - params.m * params.g) / params.m;
// 5. 状態更新(半陰的オイラー法)
dx += acceleration * dt;
x += dx * dt;
return { x, dx, Fem, i };
}
// シミュレーション実行(1000ステップ = 1秒)
function simulate(duration = 1.0) {
const dt = 0.001;
const steps = Math.floor(duration / dt);
const results = [];
for (let t = 0; t < steps; t++) {
const state = step(dt);
results.push({
time: t * dt,
gap: state.x * 1000, // mmに変換
velocity: state.dx,
force: state.Fem,
current: state.i
});
}
return results;
}
// 使ってみる
const data = simulate(1.0);
console.log('最終ギャップ:', data[data.length-1].gap.toFixed(3), 'mm');
console.log('最終速度:', data[data.length-1].velocity.toFixed(5), 'm/s');
このコードがやっていることは、たったの5ステップ:
- 偏差を測る:目標ギャップと現在のギャップの差
- PIDで電流を決める:P(比例)で引き戻し、I(積分)で定常偏差を消し、D(微分)でブレーキ
- 吸引力を計算する:上記の数式そのまま
- 加速度を求める:吸引力 − 重力
- 位置と速度を更新する:物理の運動方程式
たったこれだけで、磁気浮上のダイナミクスが再現できるんです。
数値例で確かめる
実際に数値を入れて計算してみましょう。
条件:
- $N = 200$, $A = 0.001$ m², $m = 0.05$ kg
- 目標ギャップ $x_0 = 10$ mm(0.01 m)
- 平衡電流 $i_0 = 0.5$ A
- PIDゲイン:$K_p = 500$, $K_i = 1$, $K_d = 50$
ステップ1:平衡状態の確認
吸引力を計算します。
F_{em} = \frac{4\pi \times 10^{-7} \times 200^2 \times 0.001 \times 0.5^2}{2 \times 0.01^2}
計算すると:
F_{em} = \frac{4\pi \times 10^{-7} \times 40000 \times 0.001 \times 0.25}{2 \times 0.0001}
F_{em} = \frac{1.2566 \times 10^{-5}}{2 \times 0.0001} = \frac{1.2566 \times 10^{-5}}{2 \times 10^{-4}} = 0.06283 \text{ N}
重力は $mg = 0.05 \times 9.81 = 0.4905$ N。あれ?吸引力が小さすぎる?
そうです。これがミソです。 平衡電流 $i_0$ は、重力と釣り合う値に設定しなければなりません。
正しい平衡電流を計算し直します:
i_0 = \sqrt{\frac{2mg x_0^2}{\mu_0 N^2 A}} = \sqrt{\frac{2 \times 0.4905 \times 0.0001}{1.2566 \times 10^{-5}}} = \sqrt{7.807} \approx 2.79 \text{ A}
この値が、シミュレーターの「平衡電流」として内部で自動計算されているんです。だから、質量やギャップを変えると平衡電流も変わるんですね。
ステップ2:制御が効いている場合の応答
上のコードでシミュレーションすると、初期ギャップ12mmからスタートして、約0.3秒で目標の10mmに収束します。最終速度もほぼゼロ。ちゃんと安定しています。
ステップ3:微分ゲインをゼロにした場合
Kd = 0 にしてみましょう。すると、物体は目標位置を行き過ぎては戻り、を行き過ぎては戻り…を繰り返し、発振します。これが「Kd(ブレーキ)が無いと安定しない」理由です。
シミュレーターで遊ぶ — 3つの実験
実際にシミュレーターを開いて試してみましょう。
実験1:Kdをゼロにして「振動地獄」を体験
- 操作:微分ゲインKdを0にする
- 結果:グラフがサイン波のように振動し続ける。物体がカタカタと音を立てて暴れるイメージ
- 理由:比例ゲインKpだけで引き戻そうとすると、目標を通り過ぎて反対側に振られ、また強く引き戻される…のループ。減衰(ダンパー)が無いから止まれない
実験2:質量を2倍にして「落ちる」を体験
- 操作:質量を0.05kg → 0.10kgに変更
- 結果:物体が落ちる(ギャップが急増して発散)
- 理由:質量が増えたのに、吸引力(コイル巻数・極面積)を変えていない。重力に勝てずに落下する
- 対策:コイル巻数Nを200→300に増やすと、再び浮上する
実験3:「理想的なゲイン」を探す
- 操作:Kp=800, Kd=100, Ki=5 に設定
- 結果:立ち上がりが速く、オーバーシュートも少なく、定常偏差もゼロに収束
- ポイント:Kpは大きいほど応答が速いが、発振しやすくなる。Kdでその発振を抑える。Kiは最終的な「ズレ」を消すための微調整
現場でハマるポイント — シミュレーターと実機のギャップ
このシミュレーターは優秀ですが、実機設計にそのまま使えるわけではありません。以下の3点が大きな落とし穴です。
1. 実機は「3次元」で動く
シミュレーターは1自由度(上下のみ)。でも実際の浮上体は回転(ピッチ・ロール) もします。リニアモーターカーでは、左右の電磁石のバランスが崩れると車体が傾く。これを補正するには、複数のセンサーとアクチュエーターが必要です。
2. センサーにはノイズがある
シミュレーターのギャップ値は完璧。でも実機のセンサー(渦電流式や光学式)には必ずノイズが乗ります。このノイズが微分項Kdを増幅して、かえって不安定になることがあります。実機ではKdを控えめに設定するのが鉄則です。
3. アンプの応答速度
シミュレーターでは電流が瞬間的に変化します。でも実際のパワーアンプには応答遅れがあり、指令通りの電流をすぐに出せません。この遅れが位相をずらし、高ゲインで発振の原因になります。
現場の教訓:
シミュレーターで完璧なゲインを見つけたら、実機ではその半分からスタートして、少しずつ上げていく。これがプロのやり方です。
まとめ — 3つの要点
- 磁気浮上は「本質的に不安定」 — 静的な磁力だけでは釣り合わない。PID制御による動的な補償が必須
- 吸引力はギャップの2乗に反比例 — 近づくと急激に強くなる非線形性が、制御を難しくしている
- Kp(剛性)とKd(減衰)のバランスが全て — 強すぎると発振、弱すぎると応答が遅い。理想を探すのがエンジニアの腕の見せどころ
そして、この理解を実際に手を動かして確かめられるのが、今回のシミュレーターの最大の価値です。
▶ 磁気浮上安定性解析シミュレーター — ブラウザで即動作、登録不要
「理論はわかったけど、実際に動かすとどうなるの?」という疑問に、リアルタイムで答えてくれます。パラメータをガチャガチャ動かして、「なぜ落ちるのか」「なぜ振動するのか」を体感してください。
NovaSolverでは700以上の工学シミュレーターを無料公開中 👉 一覧はこちら