-
Notifications
You must be signed in to change notification settings - Fork 0
Home
- 基本的な書き方
- クラスとメソッド
- あまりみないMATLABの関数について
シミュレータを記述するクラスSampleSimulatorを「SampleSimulator.m」に書き,SampleSimulatorを使った実行ファイルを「simulation.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% こちらのファイルを実行する
% 一発実施する
%% 最初に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