In [ ]:
%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_Exp050_20150612160930.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()
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 [4]:
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 [5]:
# Pick up focused time ranges
time_marks = [
[28.4202657857,88.3682684612,"ramp cmp1 u"],
[90.4775063395,150.121612502,"ramp cmp1 d"],
[221.84785848,280.642700604,"ramp cmp2 u"],
[283.960460465,343.514106772,"ramp cmp2 d"],
[345.430891556,405.5707005,"ramp cmp3 u"],
[408.588176529,468.175897568,"ramp cmp3 d"],
[541.713519906,600.757388552,"ramp cmp4 u"],
[604.040332533,663.913079475,"ramp cmp4 d"],
[677.817484542,778.026124493,"ramp cmp1/3 d"],
[780.09665253,879.865190551,"ramp cmp1/3 u"],
[888.075513916,987.309008866,"ramp cmp2/4 d"],
[989.75879072,1088.99649253,"ramp cmp2/4 u"],
[1101.9320102,1221.45089264,"ramp cmpall u"],
[1240.32935658,1360.72513252,"ramp cmpall d"],
]
# 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 [6]:
resample(True);
In [14]:
%%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 = 25 #V(m/s)
#previous estimations
F_c = 0.06 #F_c(N*m)
Clda_cmp = -0.2966 #Clda_cmp(1/rad)
kFbrk = 1.01
shuffle = 0.01
#other parameters
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[1:s,0])+Clda2(U[1:s,1])
+Clda3(U[1:s,2])+Clda4(U[1:s,3]))
phi = Z[0,0]*0.0174533
phi_rslt = [phi]
for t,m_a in itertools.izip(T[1:],moments_a):
moments_cg = _m_T_l_z_T_g*math.sin(phi-phi0)
if moments_cg + m_a > F_c*kFbrk:
k = ( F_c-m_a)/_m_T_l_z_T_g
if k > 1:
k = 1
elif k < -1:
k = -1
phi = phi0+math.asin(k)
elif moments_cg + m_a < -F_c*kFbrk:
k = (-F_c-m_a)/_m_T_l_z_T_g
if k > 1:
k = 1
elif k < -1:
k = -1
phi = phi0+math.asin(k)
else :
phi += (moments_cg + m_a)/(F_c*kFbrk)*shuffle/57.3
phi_rslt.append(phi)
return (np.array(phi_rslt)*57.3).reshape((-1,1))
In [15]:
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 [16]:
#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(8)
del section_idx[3]
display_data_for_train()
#push parameters to engines
push_opt_param()
In [17]:
# select 4 section from training data
#idx = random.sample(section_idx, 4)
idx = section_idx[:]
interact_guess();
In [18]:
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 [19]:
display_opt_params()
# show result
idx = range(len(time_marks))
display_data_for_test();
update_guess();
In [20]:
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 [ ]:
toggle_inputs()
button_qtconsole()