MATLAB,Python,Scilab,Julia比較 その80【PID制御⑨】

MATLAB,Python,Scilab,Julia比較 その80【PID制御⑨】 数値計算
MATLAB,Python,Scilab,Julia比較 その80【PID制御⑨】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia-backnumber/

はじめに

前回は、ScilabによるDCモータ状態空間モデルをPID制御のシミュレーションを実施。
MATLABと同様の結果は取得でき、問題無く動作確認はできた。
構造体の定義もMATLABと一緒ではあるが、Scilabの構造体の実装方法は連想配列になっているらしい。

今回は、これのJulia版を作成する。
そして一旦この回でシリーズの区切りを入れる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

【再掲】PID制御器のブロック線図と全体構成

太郎くん
太郎くん

今回はJulia版。
おなじみのPID制御器のブロック線図と全体構成を確認しておこう。

フクさん
フクさん

(手馴れて来たな。)

PID制御器(変形式)ブロック線図、目標値、実値、1/zは前回値保持の意、Ki、Kp、Kd、T1、ΔT、e(t)、u(t)
PID制御器を加味した構成図、指令器0~1の範囲で出力、指令器、制御器、PID制御器、DCモータ、状態空間モデル、target(t)、actual(t)、E(t)、u(t)、ω(t)

Juliaコード

フクさん
フクさん

Juliaコードは以下となる。

using PyPlot

function statespacemodel(A,B,C,D,u,dt,x)
    # 状態方程式
    x = x + (A*x + B*u) * dt;
    
    # 出力方程式
    y = C*x + D*u;
   
    return x,y;
end

mutable struct PID_state
    pzi::Float64
    izi::Float64
    dzi::Float64
end

function PIDController(state, target, actual, Kp, Ki, Kd, dt, t1)
    e_i = target - actual;
    e_p = (t1/dt)*(e_i - state.pzi);
    e_d = (t1/dt)*(e_p - state.dzi);
    u = (dt/t1)*(e_p*Kp + e_i*Ki + e_d*Kd) + state.izi;

    state.pzi = e_i;
    state.dzi = e_p;
    state.izi = u;
    
    return state, u;
end


function statespacemodel_pid()
    K=0.016;
    J=0.000000919;
    R=1.34;
    L=0.00012;

    A=[0 1 0 ; 0 0 K/J ; 0 -K/L -R/L];
    B=[0 ; 0; 1/L];
    C=[1.0 0 0; 0 1.0 0; 0 0 1.0];
    D=[0.0 ; 0.0 ; 0.0];
    
    dt = 0.0001;
    t = range(0, 1.0-dt, step=dt); # 時間(横)軸
    u = zeros(1,10000);          # 入力信号生成
    u[1,5000:10000].=1.0;       # 0.5秒後に0から1へ
    y = zeros(3,length(t));
    x = zeros(3,1);
    
    state = PID_state(0.0, 0.0, 0.0);
    ratio = 1/60;
    Kp = 0.80;
    Ki = 0.45;
    Kd = 0.0;
    t1 = 0.005;
    
    omega = 0;
    uPID = zeros(1,length(t));
    
    for i = 1:length(t)
        state,uPID[1,i] = PIDController( state, u[:,i][1], omega*ratio, Kp, Ki, Kd, dt, t1 );
        x,y[:,i] = statespacemodel(A,B,C,D,reshape(uPID[:,i],1,1),dt,x);
        omega = y[2,i];
    end
    subplot(3,1,1);
    plot(t,uPID',color="r");plot(t,u',color="b", linestyle="--");
    xlim([0,1]);ylim([-0.1,1.1]);
    subplot(3,1,2);
    plot(t,y[1:2,:]');
    xlim([0,1]);ylim([-5,65]);
    subplot(3,1,3);
    plot(t,y[3,:]);
    xlim([0,1]);ylim([-0.1,1]);
    
    return;
end

statespacemodel_pid();
太郎くん
太郎くん

おおよそMATLABと一緒だけど、
構造体がmutableってので定義するんだね。

フクさん
フクさん

Juliaも構造体定義としてstructというキーワードはあるが、
structだと内部のメンバ変数の更新ができない
対して、mutableはメンバ変数が更新可能な構造体になる。

太郎くん
太郎くん

ほう。
そんな仕様があるのか。

シミュレーション結果

フクさん
フクさん

そしてシミュレーション結果

DCモータ状態空間モデルをPID制御(Julia)、target(t)、u(t)、ω(t)、θ(t)、I(t)
太郎くん
太郎くん

これもOKだね。

今回が最終回?

フクさん
フクさん

一通り確認できたところで、ここいらで一区切りとしよう。

太郎くん
太郎くん

一区切り?
終了じゃなくて?

フクさん
フクさん

ベクトル、行列を扱うネタはまだまだ大量にあるからな。

太郎くん
太郎くん

じゃー、別に区切りとか無いじゃん・・・。

フクさん
フクさん

あまり1シリーズで記事数が増えるとバックナンバーのページが重くなるんだよね。

太郎くん
太郎くん

あー、1シリーズで300記事オーバーとかもあったもんね。
あのページは確かに重すぎる・・・。

フクさん
フクさん

というわけで、ある程度区切りの良いところでシリーズを分けようと思って。
つまり、次回からは第2章が始まるって感じ。

太郎くん
太郎くん

ちなみに何章まで行くつもり?

フクさん
フクさん

うーん、結構行き当たりばったりで進めてるから正確なことは言えないが、
4章は固いかな。

太郎くん
太郎くん

(まじかよ。どんだけネタ持ってんだよ)

フクさん
フクさん

というわけで本シリーズは一旦終了!
次回は第2章!

まとめ

フクさん
フクさん

まとめだよ。

  • JuliaでDCモータ状態空間モデルをPID制御シミュレーション。
  • Juliaも構造体を定義できるが、structだと更新不可になる。よってmutableを使って更新可能な構造体にする必要がある。
  • シミュレーション結果は他のツール言語と同じ結果が得られた。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました