good approx model

This commit is contained in:
2018-10-04 15:19:34 +02:00
parent fa00a1ef25
commit c19f588450
2 changed files with 102 additions and 59 deletions

View File

@@ -61,20 +61,25 @@ class MXTuning(Tuning):
def bode_model_plot(self, mot,base):
self.bode_full_plot(mot,base)
fig=plt.gcf()
_N=1.#E-3 # normalization factor: -> moves 3 decades to right but has factors around 1
# s -> ms
# Hz -> kHz
# rad/s -> rad/ms
if mot==1:
db_mag1=17.3 #dB
mag1=10**(db_mag1/20)
f1=6.5 #Hz
w1=f1*2*np.pi #rad/sec
#identify matlab: k:0.671226 w0:134.705 damp:0.191004
mag1=0.671226 #10**(db_mag1/20)
db_mag1=20*np.log10(mag1)#dB
w1=134.705*_N #rad/sec
f1=w1/2/np.pi; # ca. 6.5Hz
T1=1/w1
d1=.7 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
d1=0.19 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
num1=np.poly1d([mag1])
den1 = np.poly1d([T1**2,2*T1*d1,1])
#first resonance frequency
f2=np.array([197,199])
d2=np.array([.02,.02])#daempfung
w2=f2*2*np.pi #rad/sec
w2=f2*2*np.pi*_N #rad/sec
T2=1/w2
num2 = np.poly1d([T2[0]**2,2*T2[0]*d2[0],1])
den2 = np.poly1d([T2[1]**2,2*T2[1]*d2[1],1])
@@ -83,34 +88,36 @@ class MXTuning(Tuning):
#current loop 2nd order approx
f4=900.
d4=1 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
w4=f4*2*np.pi #rad/sec
T4=1/w4
num4 = np.poly1d([1.])
den4 = np.poly1d([T4**2,2*T4*d4,1])
#mdl= signal.lti(num4, den4) #num denum
#bode(mdl)
#identification with matlab: k=1, w0=8725, d=0.75
dc=.75 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
wc=8725.*_N # rad/sec
#...but phase lag seems to have earlier effect -> reduce wc
wc*=.5 # rad/sec
fc=wc/2/np.pi # ca 1388Hz
Tc=1/wc
numc = np.poly1d([1.])
denc = np.poly1d([Tc**2,2*Tc*dc,1])
num=num1*num2*num4#*num3
den=den1*den2*den4#*den3
num=num1*num2*numc#*num3
den=den1*den2*denc#*den3
mdl= signal.lti(num, den) #num denum
print num,den
print num
print den
print mdl
elif mot==2:
# basic 1/s^2 system with damping an d resonance
db_mag1=17.3 #dB
mag1=10**(db_mag1/20)
f1=4.5 #Hz
w1=f1*2*np.pi #rad/sec
d1=.3 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
#identify matlab: k:1.7282 w0:51.069 damp:0.327613
mag1=1.7282 #10**(db_mag1/20)
db_mag1=20*np.log10(mag1)#dB
w1=51.069*_N #rad/sec
f1=w1/2/np.pi; # ca. 6.5Hz
T1=1/w1
num1 = np.poly1d([mag1])
d1=0.32 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
num1=np.poly1d([mag1])
den1 = np.poly1d([T1**2,2*T1*d1,1])
#first resonance frequency
#resonance frequency
f2=np.array([57.8,61.8])
d2=np.array([.05,.055])#daempfung
d2=np.array([.08,.095])#daempfung
w2=f2*2*np.pi #rad/sec
T2=1/w2
num2 = np.poly1d([T2[0]**2,2*T2[0]*d2[0],1])
@@ -118,9 +125,9 @@ class MXTuning(Tuning):
mdl= signal.lti(num2, den2) #num denum
#bode(mdl)
#second resonance frequency
f3=np.array([138,151])
d3=np.array([.04,.03])#daempfung
#resonance frequency
f3=np.array([136,148])
d3=np.array([.05,.05])#daempfung
w3=f3*2*np.pi #rad/sec
T3=1/w3
num3 = np.poly1d([T3[0]**2,2*T3[0]*d3[0],1])
@@ -128,9 +135,9 @@ class MXTuning(Tuning):
#mdl= signal.lti(num3, den3) #num denum
#bode(mdl)
#second resonance frequency
#resonance frequency
f4=np.array([410,417])
d4=np.array([.015,.02])#daempfung
d4=np.array([.015,.015])#daempfung
w4=f4*2*np.pi #rad/sec
T4=1/w4
num4 = np.poly1d([T4[0]**2,2*T4[0]*d4[0],1])
@@ -138,8 +145,9 @@ class MXTuning(Tuning):
#mdl= signal.lti(num3, den3) #num denum
#bode(mdl)
f5=np.array([228,230])
d5=np.array([.03,.03])#daempfung
#resonance frequency
f5=np.array([230,233])
d5=np.array([.04,.04])#daempfung
w5=f5*2*np.pi #rad/sec
T5=1/w5
num5 = np.poly1d([T5[0]**2,2*T5[0]*d5[0],1])
@@ -147,18 +155,22 @@ class MXTuning(Tuning):
#current loop 2nd order approx
fc=900.
dc=1 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
wc=fc*2*np.pi #rad/sec
#identification with matlab: k=1, w0=8725, d=0.75
dc=.75 # daempfung =1 -> keine resonanz -> den1= np.poly1d([T1,1])**2
wc=8725.*_N # rad/sec
#...but phase lag seems to have earlier effect -> reduce wc
wc*=.5 # rad/sec
fc=wc/2/np.pi # ca 1388Hz
Tc=1/wc
numc = np.poly1d([1.])
denc = np.poly1d([Tc**2,2*Tc*dc,1])
#mdl= signal.lti(num4, den4) #num denum
#bode(mdl)
num=num1*num2*num3*num4*num5*numc
den=den1*den2*den3*den4*den5*denc
mdl= signal.lti(num, den) #num denum
print num
print den
print mdl
bode(mdl)
w=np.logspace(0,np.log10(2000),1000)*2*np.pi
w,mag,phase = signal.bode(mdl,w)