粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

伝達関数の配列とplot ②

この記事は以下の記事を前提として書いています。ご参考までに。

伝達関数の配列とplot ① - 粗大メモ置き場

MATLABでevalを用いる(sprintfを用いる) - 粗大メモ置き場


さてさて前回伝達関数の配列を用意して格納するところまでやったので
これをplotしたいと思う。


plotに関しては各回においてholdをしながら順次for文を回せば良いのだが,
今回は凡例即ちlegendも自動化したいと思う。


目標としては
文字列の配列stringを用意し,

legend(string);

と打てば良いようにstringに各々の変数を代入していく。

これにはいろいろ試した結果「 セル配列 」というものを用いるのが丸そうである。
簡潔に言うとどんな変数でも格納できる配列と思っていただければいい。

その初期化宣言と代入方法は次の通り。

% セル配列の初期化
string = cell(1,10);

for k=1:10
  % 変数名(文字列)の作成
  current_legend = sprintf('num = %d',k);

  %セル配列への代入
  string(1,k) = cellstr(current_legend);
end

まず初期化は普通のゼロ行列を作成する手順と同じ。
次にsprintfを用いて変数名を作成しているが
k番目の凡例の名前を 「 num = k 」というものにしたいためである。


セル配列への代入もただ入れるだけではなく
cellstrという関数を介して代入できるようである。



というわけで
今までのを全部まとめた結果,例えば次のようなコードが書ける。

H = tf(zeros(1,1,20)); 
strings = cell(1,20);


s = tf('s');                                             
for k=1:20
    p_zero = 11-k; 
    if p_zero >=0
        p_zero = p_zero+1;
    end
	H(:,:,k) = (1/1.2/p_zero*s+1)/(0.25*s^2+0.6*s+1);
	
    currentlegend = sprintf('a = %d',p_zero);
    strings(1,k) = cellstr(currentlegend);
    
    step(H(:,:,k)); 
    hold on;
end

grid on;
legend(strings);


これを実行するとおそらく次の図が表示されることであろう。

f:id:ossyaritoori:20151117010328p:plain


内容的は制御工学において,ゼロ点がある場合の応答の違いを示している。
凡例の色のチョイスは改善の余地があるが,この手の図を綺麗にプロットできるっていうのはなかなかに気持ちがいい。


なんとも自己満な記事であったが参考になれば幸いである。