111 代数計算機を用いた逆ラプラス変換

モジュールの読み込み

In [1]:
import sympy as sy
sy.init_printing()

import numpy as np

import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

import warnings
warnings.filterwarnings("ignore")

変数の定義

In [2]:
s = sy.Symbol('s')
t = sy.Symbol('t', real=True)
T_p, K_p, T_i = sy.symbols('T_p K_p T_i', positive=True)

式の定義

In [3]:
tf_dict = {}
tf_dict['step'] = 1/s
tf_dict['plant'] =  1/ ((T_p*s)+1)
tf_dict['p_controller'] = K_p
tf_dict['pi_controller'] = K_p*(1+1/(T_i*s))
tf_dict['p_controller_plant'] = tf_dict['p_controller'] * tf_dict['plant']
tf_dict['pi_controller_plant'] = tf_dict['pi_controller'] * tf_dict['plant']
tf_dict['fb_p_controller_plant'] = tf_dict['p_controller_plant'] / (1 + tf_dict['p_controller_plant'])
tf_dict['fb_pi_controller_plant'] = tf_dict['pi_controller_plant'] / (1 + tf_dict['pi_controller_plant'])

逆ラプラス変換

In [4]:
res_dict = {}
t_dict = {}
for key, value in tf_dict.items():
    print('Processing ... {}'.format(key))
    var_list = [t]
    if key in ['step']:
        res_dict[key] = sy.inverse_laplace_transform(tf_dict[key], s, t, )
        t_dict[key] = sy.Lambda(var_list, res_dict[key])
        continue
    elif key in ['plant']:
        var_list.append(T_p)
    elif key in ['p_controller']:
        var_list.append(K_p)
    elif key in ['pi_controller']:
        var_list.append(K_p)
        var_list.append(T_i)
    elif key in ['p_controller_plant', 'fb_p_controller_plant']:
        var_list.append(T_p)
        var_list.append(K_p)
    elif key in ['pi_controller_plant', 'fb_pi_controller_plant']:
        var_list.append(T_p)
        var_list.append(K_p)
        var_list.append(T_i)
    else:
        import sys
        sys.exit('ERROR: something worng {}'.format(key))
    res_dict[key] = sy.inverse_laplace_transform(tf_dict[key]*tf_dict['step'], s, t, plane=0)
    t_dict[key] = sy.Lambda(var_list, res_dict[key])
Processing ... step
Processing ... plant
Processing ... p_controller
Processing ... pi_controller
Processing ... p_controller_plant
Processing ... pi_controller_plant
Processing ... fb_p_controller_plant
Processing ... fb_pi_controller_plant

S領域・T領域それぞれにおける関数の表示

In [5]:
for key, value in tf_dict.items():
    print(key)
    display(value)
    if key == 'fb_pi_controller_plant':
        continue
    display(t_dict[key])
step
$$\frac{1}{s}$$
$$\left( t \mapsto \theta\left(t\right) \right)$$
plant
$$\frac{1}{T_{p} s + 1}$$
$$\left( \left ( t, \quad T_{p}\right ) \mapsto \theta\left(t\right) - e^{- \frac{t}{T_{p}}} \theta\left(t\right) \right)$$
p_controller
$$K_{p}$$
$$\left( \left ( t, \quad K_{p}\right ) \mapsto K_{p} \theta\left(t\right) \right)$$
pi_controller
$$K_{p} \left(1 + \frac{1}{T_{i} s}\right)$$
$$\left( \left ( t, \quad K_{p}, \quad T_{i}\right ) \mapsto \frac{K_{p} \theta\left(t\right)}{T_{i}} \left(T_{i} + t\right) \right)$$
p_controller_plant
$$\frac{K_{p}}{T_{p} s + 1}$$
$$\left( \left ( t, \quad T_{p}, \quad K_{p}\right ) \mapsto K_{p} \theta\left(t\right) - K_{p} e^{- \frac{t}{T_{p}}} \theta\left(t\right) \right)$$
pi_controller_plant
$$\frac{K_{p} \left(1 + \frac{1}{T_{i} s}\right)}{T_{p} s + 1}$$
$$\left( \left ( t, \quad T_{p}, \quad K_{p}, \quad T_{i}\right ) \mapsto \frac{K_{p} \theta\left(t\right)}{T_{i}} \left(T_{i} e^{\frac{t}{T_{p}}} - T_{i} - T_{p} e^{\frac{t}{T_{p}}} + T_{p} + t e^{\frac{t}{T_{p}}}\right) e^{- \frac{t}{T_{p}}} \right)$$
fb_p_controller_plant
$$\frac{K_{p}}{\left(\frac{K_{p}}{T_{p} s + 1} + 1\right) \left(T_{p} s + 1\right)}$$
$$\left( \left ( t, \quad T_{p}, \quad K_{p}\right ) \mapsto \frac{K_{p} \theta\left(t\right)}{K_{p} + 1} \left(e^{\frac{t}{T_{p}} \left(K_{p} + 1\right)} - 1\right) e^{- \frac{t}{T_{p}} \left(K_{p} + 1\right)} \right)$$
fb_pi_controller_plant
$$\frac{K_{p} \left(1 + \frac{1}{T_{i} s}\right)}{\left(T_{p} s + 1\right) \left(\frac{K_{p} \left(1 + \frac{1}{T_{i} s}\right)}{T_{p} s + 1} + 1\right)}$$

システム状態の時間発展

In [6]:
param_dict = {'T_p':7.05, 'K_p':2.0, 'T_i':1.0}

T_MIN = -5
T_MAX = 30
OFFSET = 5
trange = np.linspace(T_MIN, T_MAX, 100)
for key, value in t_dict.items():
    var_list = []
    if key in ['step']:
        pass
    elif key in ['plant']:
        var_list.append(param_dict['T_p'])
    elif key in ['p_controller']:
        var_list.append(param_dict['K_p'])
    elif key in ['pi_controller']:
        var_list.append(param_dict['K_p'])
        var_list.append(param_dict['T_i'])
    elif key in ['p_controller_plant', 'pi_controller_plant']:
        continue
    elif key in ['fb_p_controller_plant']:
        var_list.append(param_dict['T_p'])
        var_list.append(param_dict['K_p'])
    elif key in ['fb_pi_controller_plant']:
        var_list.append(param_dict['T_p'])
        var_list.append(param_dict['K_p'])
        var_list.append(param_dict['T_i'])
    else:
        import sys
        sys.exit('ERROR: something worng {}'.format(key))
    plt.plot(trange, [value(tt, *var_list).evalf(chop=True)+OFFSET for tt in trange], label = '{}'.format(key)) #桁落ち対応 evalf(chop=True)

plt.xlabel('Time  s')
plt.ylabel('y(t)  V')
plt.ylim(-1+OFFSET, 5+OFFSET)
plt.xlim(T_MIN, T_MAX)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=10)
plt.grid()
plt.show()
../_images/materials_111_algebra_calculation_12_0.png