1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Simulink入門: 動的システムのモデリングとシミュレーション実践ガイド

Last updated at Posted at 2025-07-29

Simulink入門: 動的システムのモデリングとシミュレーション実践ガイド

目次

前提条件

この記事を試すための前提です。事前に準備してください。

  • 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]

モデル構成

  1. 力の入力: Step ブロック(ステップ入力)
  2. 加速度の計算: $\ddot{x} = \frac{1}{m}(F - c\dot{x} - kx)$
  3. 速度の計算: Integrator ブロック($\dot{x} = \int \ddot{x} dt$)
  4. 位置の計算: Integrator ブロック($x = \int \dot{x} dt$)
  5. フィードバック: ばね力とダンパ力の計算

シミュレーション設定

シミュレーションを実行します。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モデルの構築手順

  1. 電気系のモデリング: 電圧から電流を計算、Transfer Functionブロック使用。
  2. 機械系のモデリング: トルクから角速度を計算、負荷考慮。
  3. フィードバック結合: 逆起電力の計算とフィードバック。

伝達関数の実装

伝達関数を定義します。

% 電気系の伝達関数
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での実装

  1. 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));
    
  2. 閉ループシステムの構築: Reference → PID → Plant → Output、Outputをフィードバック。
  3. 性能評価: ステップ応答を解析。
    % ステップ応答の解析
    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。継続的な実践でスキルを磨きましょう。この記事で不明点があればコメントください! 皆さんの実践例も共有をお待ちしています。

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?