【入門】状態空間モデルをPID制御(Julia)【数値計算】

【入門】状態空間モデルをPID制御(Julia)【数値計算】 数値計算
【入門】状態空間モデルをPID制御(Julia)【数値計算】

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに

の、
MATLAB,Python,Scilab,Julia比較 その79【PID制御⑧】

を書き直したもの。

DCモータの状態空間モデルは作成したが、
そこにPID制御器を追加。
これをJuliaで実現する話。

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

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はメンバ変数が更新可能な構造体になる。

よって、今回はmutableを使用している。

シミュレーション結果

そしてシミュレーション結果は以下となる。

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

ATLAB、Python、Scilabと同じ結果となり、
JuliaでのシミュレーションもOKと言える。

まとめ

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

MATLAB、Python、Scilab、Julia比較ページはこちら

コメント

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