Skip to content
YukiOrigane edited this page Dec 1, 2022 · 2 revisions

SwarmSystemSimulator_2のwiki

  • 基本的な書き方
  • クラスとメソッド
  • あまりみないMATLABの関数について

基本的な書き方

シミュレータを記述するクラスSampleSimulatorを「SampleSimulator.m」に書き,SampleSimulatorを使った実行ファイルを「simulation.m」に記述するとする. \ ひな形は以下の通り

SampleSimulator.m

classdef SampleSimulator< Simulator
% 時空間のシミュレータ
    properties
        % システムの変数を記載
        % t_vec   % 固有時刻ベクトル
        % x       % 状態変数 
    end

    methods
        function obj = SampleSimulator()
            % コンストラクタ(宣言時に呼ばれる)
            obj@Simulator();    % 親クラスのコンストラクタも呼び出す
            obj = obj.setDefaultParameters();       % パラメタのデフォルト値を設定
        end

        function obj = setDefaultParameters(obj)
            % パラメータとデフォルト値を設定
            %%%%%%%% シミュレータの基本情報 %%%%%%%
            % obj.param.dt = 0.05;    % 刻み時間
            % obj.param.Nt = 400;    % 計算するカウント数
            % obj.param.Na = 3;       % エージェント数
            %%%%%%%% システムパラメータ %%%%%%%%
            % obj.param.K = 1;       % ゲイン
            %%%%%%%%%%%%%% 初期値 %%%%%%%%%%%%%
            % obj.param.x_0 = [-1; 0; 1];
        end
        
        function obj = initializeVariables(obj)
            % 各種変数を初期化.シミュレーションをやり直す度に必ず呼ぶこと
            % 状態変数の定義と初期値の代入を行うこと
            % obj.t_vec = 0:obj.param.dt:obj.param.dt*(obj.param.Nt-1); % 時刻ベクトルの定義
            % obj.x(:,:) = zeros(obj.param.Na, obj.param.Nt);    % 状態変数の定義
            % obj.x(:,1) = obj.param.x_0;   % 初期値の代入
        end

        function obj = defineSystem(obj)
            % システムの定義が必要な場合はここ.シミュレーションをやり直すたびに呼ぶこと

        end

        function obj = simulate(obj)
            % シミュレーション本体
            disp("シミュレーションを開始します...")
            tic
            for t = 1:obj.param.Nt
                % ループ毎の更新をここに
                % u = obj.param.K*obj.x(:,t);
                % obj.x(:,t+1) = obj.x(:,t) + obj.param.dt*u;
            end % for
            toc
        end % simulate

        function obj = plot(obj)
            % 各種プロット
            disp("描画を開始します...")

            % figure  % 生値プロット
            % plot(obj.t_vec, obj.x(:,:));
            % title("状態の時間変化")
            % xlabel("時刻 t [s]")
            % legend(["1","2","3"])
        end

        function obj = subplot(obj)
            % 一括描画用の最低限プロット
            % plot(obj.t_vec, obj.x(:,:));
            % xlabel("時刻 t [s]")
            % legend(["1","2","3"])
        end

    end % methods
end % class

simulation.m

% こちらのファイルを実行する
% 一発実施する

%% 最初に1回だけ回すもの.おまじない
addpath(genpath("../../../SwarmSystemSimulator_2/"))    % パスを通す
simulation = SampleSimulator();                         % オブジェクトの定義
simulation.setFigureProperty("large");                  % 描画の基本設定を変更

%% シミュレーションの実施
simulation = simulation.setParam("K",2);   % パラメタ変更
simulation = simulation.initializeVariables();  % 初期値の計算
simulation = simulation.simulate(); % シミュレーションの実施
simulation = simulation.plot();% 描画

% save results.mat simulation % 保存

説明

おまじない

simulation.mの前3行についてもう一度抜き出すと

addpath(genpath("../../../SwarmSystemSimulator_2/"))    % パスを通す
simulation = SampleSimulator();                         % オブジェクトの定義
simulation.setFigureProperty("large");                  % 描画の基本設定を変更

になる.

パス

まず1行目ではSwarmSystemSimulator_2がどこにあるかを教えている."../"は今あるフォルダから1階層上に上がることを意味している.
自分で書き直すときには,simulation.mから何階層上に上がったところにSwarmSystemSimulator_2フォルダが存在するかにより,"../"の回数を変えること.

また,このパスの書き方は相対パスと呼ばれるが,絶対パスという通し方もある.
相対パスで上手く行かない場合には試してみると良い.

オブジェクトの定義
simulation = SampleSimulator(); 

これを書くことにより,SampleSimulator内に記述したsimulate等の関数を,simulation.hogehoge()などと書くことで呼び出せるようになる.
シミュレーションを記述したクラス名が変わる場合は,当然ここも変わるので注意.

描画の基本設定を変更
simulation.setFigureProperty("large"); 

MATLABの標準設定では文字が小さく線が細い.また,図中のグリッドも出てくれていた方がうれしい場合が多い.
そのあたりの初期設定を一括で書き換えているのがこの行である.
自分で図を整備する場合にはこの行は書かない.
また,デフォルト設定に戻したい!という場合は

simulation.setFigureProperty("default"); 

とすることでMATLABの初期設定に戻せる.

コンストラクタ

おまじないの2つ目である

simulation = SampleSimulator(); 

を呼んだ際には,SampleSimulator内の

function obj = SampleSimulator()
   % コンストラクタ(宣言時に呼ばれる)
   obj@Simulator();    % 親クラスのコンストラクタも呼び出す
   obj = obj.setDefaultParameters();       % パラメタのデフォルト値を設定
end

が呼び出される.このクラス名と同名の関数をコンストラクタと呼び,オブジェクトの生成時に必ず呼ばれる部分である.
ここではmaster内に記載のある,Simulatorクラスのコンストラクタを呼び出し,かつsetDefaultParameters関数を呼び出す.

標準パラメタの設定

function obj = setDefaultParameters(obj) % パラメータとデフォルト値を設定 %%%%%%%% シミュレータの基本情報 %%%%%%% % obj.param.dt = 0.05; % 刻み時間 % obj.param.Nt = 400; % 計算するカウント数 % obj.param.Na = 3; % エージェント数 %%%%%%%% システムパラメータ %%%%%%%% % obj.param.K = 1; % ゲイン %%%%%%%%%%%%%% 初期値 %%%%%%%%%%%%% % obj.param.x_0 = [-1; 0; 1]; end