Simulink入門: 動的システムのモデリングとシミュレーション実践ガイド
目次
- 前提条件
- 実例1: 質点-ばね-ダンパシステム
- 実例2: DCモータの制御システム
- 実例3: PID制御器の設計
- 高度な機能とテクニック
- デバッグとトラブルシューティング
- ベストプラクティス
- まとめ
- 参考資料
前提条件
この記事を試すための前提です。事前に準備してください。
- MATLAB/Simulink(R2023a以上推奨)がインストール済み。
- 新規モデルファイル(例: 'my_model.slx')を作成。
- Control System Toolboxが利用可能(伝達関数tf()使用のため)。
これで基本的な実行が可能です。次に、実例から始めましょう。
実例1: 質点-ばね-ダンパシステム
システムの説明
質量$m$の物体がばね定数$k$のばねと減衰係数$c$のダンパで支持されたシステムです。運動方程式: $$m\ddot{x} + c\dot{x} + kx = F(t)$$。
Simulinkモデルの構築
パラメータと初期条件を定義します。
% パラメータの定義
m = 1.0; % 質量 [kg]
k = 10.0; % ばね定数 [N/m]
c = 0.5; % 減衰係数 [N·s/m]
% 初期条件
x0 = 0.1; % 初期位置 [m]
v0 = 0; % 初期速度 [m/s]
モデル構成
- 力の入力: Step ブロック(ステップ入力)
- 加速度の計算: $\ddot{x} = \frac{1}{m}(F - c\dot{x} - kx)$
- 速度の計算: Integrator ブロック($\dot{x} = \int \ddot{x} dt$)
- 位置の計算: Integrator ブロック($x = \int \dot{x} dt$)
- フィードバック: ばね力とダンパ力の計算
シミュレーション設定
シミュレーションを実行します。ode45ソルバーで正確な積分を実現。
% シミュレーション時間の設定
sim_time = 10; % 10秒間
% ソルバーの設定
set_param('my_model', 'Solver', 'ode45');
set_param('my_model', 'StopTime', num2str(sim_time));
% シミュレーション実行
sim('my_model');
試してみよう: このコードを実行し、Scopeブロックで位置の変化を確認。
次に、DCモータの実例に移ります。
実例2: DCモータの制御システム
システムの説明
DCモータのモデル: 電気系 $L\frac{di}{dt} + Ri + K_e\omega = V$、機械系 $J\frac{d\omega}{dt} + B\omega = K_t i - T_L$。ここで $V$: 入力電圧、$i$: 電流、$\omega$: 角速度、$T_L$: 負荷トルク。
パラメータ設定
物理パラメータを定義します。
% DCモータのパラメータ
R = 1.0; % 電機子抵抗 [Ω]
L = 0.5; % 電機子インダクタンス [H]
Kt = 0.01; % トルク定数 [N·m/A]
Ke = 0.01; % 逆起電力定数 [V·s/rad]
J = 0.01; % 慣性モーメント [kg·m²]
B = 0.001; % 粘性摩擦係数 [N·m·s/rad]
Simulinkモデルの構築手順
- 電気系のモデリング: 電圧から電流を計算、Transfer Functionブロック使用。
- 機械系のモデリング: トルクから角速度を計算、負荷考慮。
- フィードバック結合: 逆起電力の計算とフィードバック。
伝達関数の実装
伝達関数を定義します。
% 電気系の伝達関数
num_elec = 1;
den_elec = [L R];
% 機械系の伝達関数
num_mech = 1;
den_mech = [J B];
試してみよう: これをTransfer Functionブロックに適用し、シミュレーションを実行。
次に、PID制御の実例です。
実例3: PID制御器の設計
PID制御器の基本
PIDの伝達関数: $$C(s) = K_p + \frac{K_i}{s} + K_d s$$。比例、積分、微分でシステムを制御(初心者向け注: Pで即応、Iで誤差除去、Dで予測)。
制御システムの構築
プラントと初期値を定義します。
% 制御対象(プラント)の伝達関数
s = tf('s');
plant = 1/(s^2 + 10*s + 20);
% PIDパラメータの初期値
Kp = 100;
Ki = 200;
Kd = 10;
Simulinkでの実装
-
PID Controllerブロックの使用: パラメータを設定。
% PIDブロックのパラメータ設定 pid_block = 'my_model/PID Controller'; set_param(pid_block, 'P', num2str(Kp)); set_param(pid_block, 'I', num2str(Ki)); set_param(pid_block, 'D', num2str(Kd));
- 閉ループシステムの構築: Reference → PID → Plant → Output、Outputをフィードバック。
-
性能評価: ステップ応答を解析。
% ステップ応答の解析 sim('my_model'); % 性能指標の計算 info = stepinfo(output.Data, output.Time); rise_time = info.RiseTime; overshoot = info.Overshoot; settling_time = info.SettlingTime;
PIDチューニング
自動チューニングを実行(中級者向け)。
% 自動チューニング機能の使用
pidTuner(plant, 'PID');
% または、MATLABコードでの最適化
opts = pidtuneOptions('DesignFocus', 'reference-tracking');
[C, info] = pidtune(plant, 'PID', opts);
試してみよう: pidTunerでゲインを調整し、応答を比較。
次に、高度な機能に移ります。
高度な機能とテクニック
1. サブシステムの活用
モデルをモジュール化。中級者向け: 大規模モデルで有効。
% サブシステムの作成
add_block('built-in/Subsystem', 'my_model/MySubsystem');
% マスクの作成(カスタムブロック化)
mask = Simulink.Mask.create('my_model/MySubsystem');
mask.addParameter('Name', 'gain_value', 'Prompt', 'Gain Value');
2. S-Functionの使用
カスタム微分方程式を定義。中級者向け: 非線形システムに。
function [sys,x0,str,ts] = my_sfun(t,x,u,flag,param1)
switch flag
case 0 % 初期化
sizes = simsizes;
sizes.NumContStates = 1;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sys = simsizes(sizes);
x0 = 0;
str = [];
ts = [0 0];
case 1 % 微分方程式
sys = -param1*x + u;
case 3 % 出力
sys = x;
otherwise
sys = [];
end
end
3. コード生成
Cコードを生成。組み込みシステム向け。
% Simulink Coderを使用したCコード生成
slbuild('my_model');
% 生成されたコードの確認
coder.report('my_model');
4. リアルタイムシミュレーション
リアルタイム実行を設定。HILテストに。
% Real-Time Workshopの設定
set_param('my_model', 'RTWSystemTargetFile', 'grt.tlc');
set_param('my_model', 'RTWGenerateCodeOnly', 'off');
% ビルドと実行
rtwbuild('my_model');
試してみよう: これで生成したコードをハードウェアでテスト。
次に、デバッグのテクニックです。
デバッグとトラブルシューティング
1. 代数ループの解決
ループを検出・解決。
% 代数ループの検出
algebraic_loops = find_system('my_model', 'AlgebraicLoopSolver', 'on');
% Unit Delayブロックの挿入で解決
add_block('simulink/Discrete/Unit Delay', 'my_model/Unit Delay');
2. シミュレーション速度の改善
速度を最適化。
% 固定ステップソルバーの使用
set_param('my_model', 'Solver', 'FixedStepDiscrete');
set_param('my_model', 'FixedStep', '0.001');
% アクセラレータモードの使用
set_param('my_model', 'SimulationMode', 'accelerator');
3. 信号の監視とログ
信号をログ・プロット。
% 信号のログ設定
set_param('my_model/signal_line', 'DataLogging', 'on');
set_param('my_model/signal_line', 'DataLoggingName', 'my_signal');
% シミュレーション後のデータ取得
sim('my_model');
plot(logsout.get('my_signal').Values);
試してみよう: ログデータを分析してモデルをデバッグ。
次に、ベストプラクティスです。
ベストプラクティス
1. モデルの構造化
- 機能ごとにサブシステムを作成
- 信号名とブロック名を明確に
- 色分けによる視覚的な整理
2. パラメータ管理
ワークスペースで管理。
% モデルワークスペースの使用
hws = get_param('my_model', 'ModelWorkspace');
hws.assignin('Kp', 100);
hws.assignin('Ki', 200);
hws.assignin('Kd', 10);
3. バージョン管理
- Simulink Projectsの活用
- モデル参照による大規模システムの分割
- 要求仕様とのリンク(Simulink Requirements)
これらを実践してモデルを洗練しましょう。
まとめ
Simulinkは動的システムのモデリングに最適です。この記事で基本から実例、高度機能までを学びました。重要なポイント: ブロック線図の直感性、物理表現、制御統合、コード生成。次のステップ: Stateflow、Simscape、HDL Coder、Design Optimization。継続的な実践でスキルを磨きましょう。この記事で不明点があればコメントください! 皆さんの実践例も共有をお待ちしています。