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()