In [1]:
%run matt_startup
%run -i matt_utils
button_qtconsole()
#import other needed modules in all used engines
#with dview.sync_imports():
# import os
In [2]:
filename = 'FIWT_Exp052_20150616144645.dat.npz'
def loadData():
# Read and parse raw data
global exp_data
exp_data = np.load(filename)
# Select colums
global T_cmp, da1_cmp, da2_cmp, da3_cmp , da4_cmp
T_cmp = exp_data['data33'][:,0]
da1_cmp = exp_data['data33'][:,3]
da2_cmp = exp_data['data33'][:,5]
da3_cmp = exp_data['data33'][:,7]
da4_cmp = exp_data['data33'][:,9]
global T_rig, phi_rig
T_rig = exp_data['data44'][:,0]
phi_rig = exp_data['data44'][:,2]
loadData()
In [3]:
text_loadData()
In [4]:
V = exp_data['data44'][:,13]
%matplotlib inline
plt.plot(T_rig, V*1.05)
plt.ylim((28,32))
Out[4]:
Click 'Check data' button to show the raw data.
Click on curves to select time point and push into queue; click 'T/s' text to pop up last point in the queue; and click 'Output' text to print time sequence table.
In [5]:
def checkInputOutputData():
#check inputs/outputs
fig, ax = plt.subplots(2,1,True)
ax[0].plot(T_cmp,da1_cmp,'r', T_cmp,da2_cmp,'g',
T_cmp,da3_cmp,'b', T_cmp,da4_cmp,'m',
picker=1)
ax[1].plot(T_rig,phi_rig, 'b', picker=2)
ax[0].set_ylabel('$\delta \/ / \/ ^o$')
ax[1].set_ylabel('$\phi \/ / \/ ^o/s$')
ax[1].set_xlabel('$T \/ / \/ s$', picker=True)
ax[0].set_title('Output', picker=True)
fig.canvas.mpl_connect('pick_event', onPickTime)
fig.show()
display(fig)
button_CheckData()
In [6]:
# Pick up focused time ranges
time_marks = [
[18.8573202878,137.312699085,"ramp cmp4 u"],
[141.408935166,260.27090166,"ramp cmp4 d"],
[265.592177186,384.456691192,"ramp cmp3 u"],
[391.487466737,509.969548357,"ramp cmp3 d"],
[518.478950349,638.264844453,"ramp cmp2 u"],
[644.71182051,763.983487372,"ramp cmp2 d"],
[770.300044567,889.812031944,"ramp cmp1 u"],
[895.995020394,1014.85848293,"ramp cmp1 d"],
[1022.19234822,1141.45367229,"ramp cmp4 d"],
[1145.14958662,1265.23165475,"ramp cmp4 u"],
[1279.28149733,1397.62176653,"ramp cmp3 u"],
[1411.53843282,1530.01180295,"ramp cmp2 d"],
[1536.98628003,1657.06650374,"ramp cmp2 u"],
[1671.68321255,1792.31335791,"ramp cmp1 d"],
[1798.33449076,1918.9341565,"ramp cmp1 u"],
]
# Decide DT,U,Z and their processing method
DT=0.2
process_set = {
'U':[(T_cmp, da1_cmp,0),
(T_cmp, da2_cmp,0),
(T_cmp, da3_cmp,0),
(T_cmp, da4_cmp,0),],
'Z':[(T_rig, phi_rig,1),],
'cutoff_freq': 1 #Hz
}
U_names = ['$\delta_{a1,cmp} \, / \, ^o$',
'$\delta_{a2,cmp} \, / \, ^o$',
'$\delta_{a3,cmp} \, / \, ^o$',
'$\delta_{a4,cmp} \, / \, ^o$']
Y_names = Z_names = ['$\phi_{a,rig} \, / \, ^o$']
display_data_prepare()
For each section,
In [7]:
resample(True);
In [19]:
%%px --local
#update common const parameters in all engines
angles = range(-40,41,5)
angles[0] -= 1
angles[-1] += 1
del angles[angles.index(0)]
angles_num = len(angles)
#problem size
Nx = 0
Nu = 4
Ny = 1
Npar = 4*angles_num+1
#reference
S_c = 0.1254 #S_c(m2)
b_c = 0.7 #b_c(m)
g = 9.81 #g(m/s2)
#static measurement
m_T = 9.585 #m_T(kg)
l_z_T = 0.0416 #l_z_T(m)
V = 30 #V(m/s)
#previous estimations
F_c = 0.06 #F_c(N*m)
Clda_cmp = -0.2966 #Clda_cmp(1/rad)
#for short
qbarSb = 0.5*1.225*V*V*S_c*b_c
_m_T_l_z_T_g = -(m_T*l_z_T)*g
def obs(Z,T,U,params):
s = T.size
k1 = np.array(params[0:angles_num])
k2 = np.array(params[angles_num:angles_num*2])
k3 = np.array(params[angles_num*2:angles_num*3])
k4 = np.array(params[angles_num*3:angles_num*4])
phi0 = params[-1]
Clda1 = scipy.interpolate.interp1d(angles, Clda_cmp*0.00436332313*k1*angles,assume_sorted=True)
Clda2 = scipy.interpolate.interp1d(angles, Clda_cmp*0.00436332313*k2*angles,assume_sorted=True)
Clda3 = scipy.interpolate.interp1d(angles, Clda_cmp*0.00436332313*k3*angles,assume_sorted=True)
Clda4 = scipy.interpolate.interp1d(angles, Clda_cmp*0.00436332313*k4*angles,assume_sorted=True)
moments_a = qbarSb*(Clda1(U[:s,0])+Clda2(U[:s,1])
+Clda3(U[:s,2])+Clda4(U[:s,3]))
phi = phi0+np.arcsin(np.clip(-moments_a/_m_T_l_z_T_g, -1, 1))
return (phi*57.3).reshape((-1,1))
In [20]:
display(HTML('<b>Constant Parameters</b>'))
table = ListTable()
table.append(['Name','Value','unit'])
table.append(['$S_c$',S_c,'$m^2$'])
table.append(['$b_c$',b_c,'$m$'])
table.append(['$g$',g,'$m/s^2$'])
table.append(['$m_T$',m_T,'$kg$'])
table.append(['$l_{zT}$',l_z_T,'$m$'])
table.append(['$V$',V,'$m/s$'])
table.append(['$F_c$',F_c,'$Nm$'])
table.append(['$C_{l \delta a,cmp}$',Clda_cmp,'$rad^{-1}$'])
display(table)
In [21]:
#initial guess
param0 = [1]*(4*angles_num)+[0]
param_name = ['k_{}_{}'.format(i/angles_num+1, angles[i%angles_num]) for i in range(4*angles_num)] + ['$phi_0$']
param_unit = ['1']*(4*angles_num) + ['$rad$']
NparID = Npar
opt_idx = range(Npar)
opt_param0 = [param0[i] for i in opt_idx]
par_del = [0.001]*(4*angles_num) + [0.0001]
bounds = [(0,1.5)]*(4*angles_num) +[(-0.1, 0.1)]
display_default_params()
#select sections for training
section_idx = range(14)
display_data_for_train()
#push parameters to engines
push_opt_param()
In [22]:
# select 4 section from training data
#idx = random.sample(section_idx, 4)
idx = section_idx[:]
interact_guess();
In [23]:
display_preopt_params()
if False:
InfoMat = None
method = 'trust-ncg'
def hessian(opt_params, index):
global InfoMat
return InfoMat
dview['enable_infomat']=True
options={'gtol':1}
opt_bounds = None
else:
method = 'L-BFGS-B'
hessian = None
dview['enable_infomat']=False
options={'ftol':1e-6,'maxfun':400}
opt_bounds = bounds
cnt = 0
tmp_rslt = None
T0 = time.time()
print('#cnt, Time, |R|')
%time res = sp.optimize.minimize(fun=costfunc, x0=opt_param0, \
args=(opt_idx,), method=method, jac=True, hess=hessian, \
bounds=opt_bounds, options=options)
In [24]:
display_opt_params()
# show result
idx = [0,1, 8,9,
2,3,10,
4,5,11,12,
6,7,13,14,]
display_data_for_test();
update_guess();
In [25]:
res_params = res['x']
params = param0[:]
for i,j in enumerate(opt_idx):
params[j] = res_params[i]
k1 = np.array(params[0:angles_num])
k2 = np.array(params[angles_num:angles_num*2])
k3 = np.array(params[angles_num*2:angles_num*3])
k4 = np.array(params[angles_num*3:angles_num*4])
Clda_cmp1 = Clda_cmp*0.00436332313*k1*angles
Clda_cmp2 = Clda_cmp*0.00436332313*k2*angles
Clda_cmp3 = Clda_cmp*0.00436332313*k3*angles
Clda_cmp4 = Clda_cmp*0.00436332313*k4*angles
print('angeles = ')
print(angles)
print('Clda_cmpx = ')
print(np.vstack((Clda_cmp1,Clda_cmp2,Clda_cmp3,Clda_cmp4)))
%matplotlib inline
plt.figure(figsize=(12,8),dpi=300)
plt.plot(angles, Clda_cmp1, 'r')
plt.plot(angles, Clda_cmp2, 'g')
plt.plot(angles, Clda_cmp3, 'b')
plt.plot(angles, Clda_cmp4, 'm')
plt.xlabel('$\delta_{a,cmp}$')
plt.ylabel('$C_{l \delta a,cmp}$')
plt.show()
In [ ]:
In [ ]:
toggle_inputs()
button_qtconsole()