プログラミング

MATLAB/simulink

MATLABで離散モデルに対しPID制御器を作りシミュレーションする

前回に続いてMATLABで離散モデルに対しPID制御器を構築する。与えられたモデルを離散化するには G=c2d(omega^2/(s^2+2*zeta*omega*s+omega^2),Ts); を使えばいい。例では二次遅れ系をサンプル時間...
MATLAB/simulink

MATLABでPID制御器を作りシミュレーションする

MATLABでPID制御器を作って実装する。MATLABにはモデルを与えればそれっぽくPID制御器を構築してくれる便利な関数pidtuneがあるので今回はこれを使う。pidtuneの構文は下記の通り。 = pidtune(G,'PID');...
C/C++/C#

C言語での多次元配列の渡し方

C言語で配列を宣言する場合 int mat; などとする。このように定義された配列を関数に渡すときは先頭のアドレスを渡せばよく、実際の関数の宣言は void func(int *mat) となる。 一方で多次元配列のこれが多次元になると話が...
MATLAB/simulink

極に着目した連続時間システムと離散時間システムの安定性判別

初めに連続時間システムの伝達関数の安定性を調べる。連続時間システムの伝達関数は \begin{align}P_1=\frac{ a_m s^m+a_{m-1} s^{m-1}+ \cdots + a_0}{ b_n s^n+b_{n-1} ...
MATLAB/simulink

離散化した伝達関数の応答をシミュレーションする

離散化した伝達関数の応答を調べる。今回はStep応答を調べた。 今プラントを\(G(z^{-1})\)、入力を\(r(t)\)とすると出力は \begin{align}y(t)=G(z^{-1}) r(t-1)\end{align} コード...
MATLAB/simulink

伝達関数の離散化と誤差

前回MATLABを使って伝達関数を離散時間モデルに変換した。前回の結果より \begin{align}G=\frac{10}{15s+1}\end{align} が \begin{align}\frac{0.6449}{z - 0.9355...
MATLAB/simulink

MATLABで作ったグラフ画像を高解像度で保存する

MATLABで作ったグラフ画像を高解像度で保存したい時がある。 普通にメニューバーからや saveas(gcf,'figname.png') で保存すると低解像度になってしまう。そういう時は print(gcf,'-djpeg','fign...
Manim

manimをインストールしてチュートリアルを動かす

manimは数学などの説明にあるいい感じの動画を作成できるpythonライブラリである。今回はmanimをインストールしてチュートリアルを動かしてみる。 インストールにはpipを使う。すでにpythonがインストールされている環境でコマンド...
MATLAB/simulink

MATLABでむだ時間を含む伝達関数を定義してシミュレーションをする

MATLABを使ってむだ時間を含む伝達関数を定義して一時遅れ系をシミュレーションする。むだ時間を含む一時遅れ系は \begin{align}G=\frac{K}{1+Ts} e^{-Ls}\end{align} で与えられるような系である。...
MATLAB/simulink

MATLABで伝達関数を定義してシミュレーションをする

MATLABを使って伝達関数を定義して一時遅れ系をシミュレーションする。一時遅れ系は \begin{align}G=\frac{K}{1+Ts}\end{align} で与えられるような系である。この系の微分方程式は一階の微分方程式になる。...
MATLAB/simulink

MATLABでシステム同定用のM系列信号を生成する

MATLABでシステム同定用のM系列信号を生成する。 ツールボックスがないと動かない可能性があるので注意。 結果がこんな感じ。 コード N = 350; u = idinput(N,'rbs'); figure plot(u) ylim()...
MATLAB/simulink

m-file内での関数呼び出し

matlabは外部に関数を用意する方法以外にm-file内部で関数を定義することもできる。 この場合、定義した関数は同一m-file内以外では使用することができないが、ちょっと試す場合に便利である。 こんな感じで使うことができる。 x=-1...
MATLAB/simulink

MATLABで簡易逆ガンマ関数を実装する

ガンマ関数を使えば階乗を一般化でき便利である。 \begin{align}\Gamma(n+1)=n!\end{align} 今回は\(n!\)となる\(x\)の値をmatlabを使って求める。 n=8256; f=@(x) abs(n-g...
MATLAB/simulink

状態空間モデルをMATLABでシミュレーションする

制御工学には古典制御で用いられる伝達関数とは別に、現代制御で用いられる状態空間モデルがある。状態空間モデルは次のようなものである。 \begin{align}\dot{x}&=Ax+Bu\\y&=Cx+Du\end{align} MATLA...
MATLAB/simulink

χ²分布をプロットしてみる

確率分布にはよく使われる正規分部の他に\(\chi^2\)分布というものもある。 \(\chi^2\)分布は\(x\)が負の実数の時は\(0\)となる。グラフを書くだけであれば\(x\)が正の実数を取るときの値を調べればいい。 これより計算...
MATLAB/simulink

正規分布とパラメータの意味

ガウス分布は正規分布とも呼ばれ\begin{align}f(x)=\dfrac{1}{ \sqrt{2 \pi \it{σ}^2 }} \exp \left ( - \frac{\left ( x-\it{μ} \right )^2}{2 ...
MATLAB/simulink

サンプリング周波数と信号波形

計算機を用いてグラフを描画する際は離散化された値で計算をするためサンプリング周波数は重要である。今回は一例として正弦波について異なるサンプリング周波数で信号の取得を行い、取得波形の確認を行う。 正弦波の式は \begin{align}y=\...
MATLAB/simulink

MATLABでナイキスト線図を書く

ナイキスト線図を使えば複雑なシステムの安定判別をより容易に行えるようになる場合がある。今回は細かいことを気にせずただナイキスト線図を描画する。正しく描けているかのチェックにはMATLABの関数「nyquist」を使用した。 いま開ループ伝達...
MATLAB/simulink

離散系の積分器

古典制御の範囲では制御対象や制御器を表現する場合にはラプラス変換を用いて\(s\)の関数として表した。例えばPID制御の一部である積分器は \begin{align}K_{i} \int_{0}^{t} e(\tau) d \tau\end...
MATLAB/simulink

一次遅れ系の伝達関数に含まれるパラメータを変更してそれぞれの係数の意味を理解する

一次遅れ系の伝達関数 \begin{align}G=\frac{K}{Ts+1}\end{align} について、係数の持つ意味を理解する。一般に\(K\)は比例ゲイン、\(T\)は時定数と呼ばれる。 次のグラフは比例ゲインを固定し、時定数...