def test_initialization(self): # Check that all initializations work dt = 0.05 s = ZerosPolesGain(1, 1, 1, dt=dt) s = ZerosPolesGain([1], [2], 1, dt=dt) s = ZerosPolesGain(np.array([1]), np.array([2]), 1, dt=dt) s = ZerosPolesGain(1, 1, 1, dt=True)
def test_conversion(self): #Check the conversion functions s = ZerosPolesGain(1, 2, 3) assert_(isinstance(s.to_ss(), StateSpace)) assert_(isinstance(s.to_tf(), TransferFunction)) assert_(isinstance(s.to_zpk(), ZerosPolesGain)) # Make sure copies work assert_(ZerosPolesGain(s) is not s) assert_(s.to_zpk() is not s)
def test_properties(self): # Test setters/getters for cross class properties. # This implicitly tests to_ss() and to_tf() # Getters s = ZerosPolesGain(0, 1, 1, dt=0.05) with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) assert_equal(s.num, [1, 0]) assert_equal(s.den, [1, -1]) assert_equal(s.A, 1) assert_equal(s.B, 1) assert_equal(s.C, 1) assert_equal(s.D, 1) # state space setters s2 = ZerosPolesGain([2], [6], 3, dt=0.05) with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) s2.A = 1 s2.B = 1 s2.C = 1 s2.D = 1 self._compare_systems(s, s2) # tf setters s2 = ZerosPolesGain([2], [5], 3, dt=0.05) with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) s2.num = [1, 0] s2.den = [1, -1] self._compare_systems(s, s2)
def test_conversion(self): # Check the conversion functions s = ZerosPolesGain(1, 2, 3, dt=0.05) assert_(isinstance(s.to_ss(), StateSpace)) assert_(isinstance(s.to_tf(), TransferFunction)) assert_(isinstance(s.to_zpk(), ZerosPolesGain)) # Make sure copies work assert_(ZerosPolesGain(s) is not s) assert_(s.to_zpk() is not s)
def convert_forward_euler(pa, Tsampling=0.01): # if isintance(pa, TransferFunction): if isinstance(pa, lti): #reviso primero el valor final s = Symbol('s') pa_sympy = lti_to_sympy(pa) final_value_analog = pa_sympy.subs(s, 0).evalf() # print (' Final value: ' + str(final_value_analog)) #convierto backward euler num_d, den_d, td = cont2discrete((pa.num, pa.den), Tsampling, method='euler') zd, pd, kd = tf2zpk(num_d, den_d) #agrego zeros infinitos while (np.shape(zd) < np.shape(pd)): zd = np.append(zd, [-1]) #normalizo los zeros planta_d = ZerosPolesGain(zd, pd, kd) planta_d = planta_d.to_tf() zd, pd, kd = tf2zpk(planta_d.num, planta_d.den) #convierto a sympy para evaluar el valor final y ajustarlo planta_d_sympy = lti_to_sympy(planta_d) z = Symbol('z') planta_d_sympy = planta_d_sympy.subs(s, z) final_value_d = planta_d_sympy.subs(z, 1).evalf() #ahora ajusto la ganancia para que me coincidan los dos valores finales kd = kd * final_value / final_value_d # print ('Ceros digital: ' + str(zd)) # print ('Polos digital: ' + str(pd)) # print ('K digital: ' + str(kd)) #normalizo por ultima vez planta_d, ya agregue los zeros #y ajuste la ganancia con los valores finales planta_d = ZerosPolesGain(zd, pd, kd) planta_d = planta_d.to_tf() # print ('planta_d ' + str(planta_d)) #muestro el valor final planta_d_sympy = lti_to_sympy(planta_d) z = Symbol('z') planta_d_sympy = planta_d_sympy.subs(s, z) final_value_d = planta_d_sympy.subs(z, 1).evalf() # print ('planta_d final value: ' + str(final_value_d)) #reconvierto planta_d a dlti planta_d = dlti(planta_d.num, planta_d.den, dt=td) return planta_d else: raise ValueError('planta_analog is not instance of TransferFunction!')
def test_initialization(self): # Check that all initializations work s = ZerosPolesGain(1, 1, 1) s = ZerosPolesGain([1], [2], 1) s = ZerosPolesGain(np.array([1]), np.array([2]), 1)
print('Denominador Digital planta out 1 ' + str(den_d1)) planta_d1 = lti(num_d1, den_d1) planta_d1_zpk = planta_d1.to_zpk() print('Ceros Digitales ' + str(planta_d1_zpk.zeros)) print('Polos Digitales ' + str(planta_d1_zpk.poles)) print('Gain Digital ' + str(planta_d1_zpk.gain)) # convierto a planta_d2 ajusto al sistema digital 2 zeros en infinito y corrijo la ganancia zd2, pd2, kd2 = tf2zpk(num_d1, den_d1) while (np.shape(zd2) < np.shape(pd2)): zd2 = np.append(zd2, [-1]) #normalizo planta_d2 = ZerosPolesGain(zd2, pd2, kd2) planta_d2 = planta_d2.to_tf() zd2, pd2, kd2 = tf2zpk(planta_d2.num, planta_d2.den) #convierto a sympy para evaluar el valor final y ajustarlo planta_d2_sympy = lti_to_sympy(planta_d2) z = Symbol('z') planta_d2_sympy = planta_d2_sympy.subs(s, z) final_value_d2 = planta_d2_sympy.subs(z, 1).evalf() #ahora ajusto la ganancia para que me coincidan los dos valores finales kd2 = kd2 * final_value / final_value_d2 print('Ceros digital: ' + str(zd2)) print('Polos digital: ' + str(pd2)) print('K digital: ' + str(kd2))
# num_d1, den_d1, td = cont2discrete((planta.num, planta.den), Tsampling, method='zoh') # num_d1, den_d1, td = cont2discrete((planta.num, planta.den), Tsampling, method='backward_diff') # num_d1, den_d1, td = cont2discrete((planta.num, planta.den), Tsampling, method='bilinear') print('Numerador Digital planta: ' + str(num_d1)) print('Denominador Digital planta: ' + str(den_d1)) #busco zeros polos y ganancia # despues ajusto zeros y ganancia, por ultimo normalizo e imprimo zd, pd, kd = tf2zpk(num_d1, den_d1) while (np.shape(zd) < np.shape(pd)): zd = np.append(zd, [-1]) #normalizo planta_d = ZerosPolesGain(zd, pd, kd) planta_d = planta_d.to_tf() zd, pd, kd = tf2zpk(planta_d.num, planta_d.den) #convierto a sympy para evaluar el valor final planta_d_sympy = lti_to_sympy(planta_d) z = Symbol('z') planta_d_sympy = planta_d_sympy.subs(s, z) print(planta_d_sympy) final_value_d = planta_d_sympy.subs(z, 1).evalf() print('final value digital: ' + str(final_value_d)) #ahora ajusto la ganancia para que me coincidan los dos valores finales kd = kd * final_value / final_value_d print('Ceros digital: ' + str(zd)) print('Polos digital: ' + str(pd))