From: Ryan K. <rk...@si...> - 2013-06-06 19:36:41
|
poly1d makes it naturally vectorize so that the __call__ method could also be used in Bode-type calculations: In [16]: w = arange(1,5,0.5) In [17]: control.freqresp(test,w) Out[17]: (array([[[ 0.31622777, 0.2981424 , 0.2773501 , 0.25607376, 0.23570226, 0.21693046, 0.2 , 0.18490007]]]), array([[[-0.32175055, -0.46364761, -0.5880026 , -0.69473828, -0.78539816, -0.86217005, -0.92729522, -0.98279372]]]), array([ 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])) In [18]: s_vect = 1.0j*w In [18.5]: test(s_vect) Out[18.5]: array([ 0.30000000-0.1j , 0.26666667-0.13333333j, 0.23076923-0.15384615j, 0.19672131-0.16393443j, 0.16666667-0.16666667j, 0.14117647-0.16470588j, 0.12000000-0.16j , 0.10256410-0.15384615j]) In [19]: freq_test = test(s_vect) In [20]: abs(freq_test) Out[20]: array([ 0.31622777, 0.2981424 , 0.2773501 , 0.25607376, 0.23570226, 0.21693046, 0.2 , 0.18490007]) In [21]: angle(freq_test) Out[21]: array([-0.32175055, -0.46364761, -0.5880026 , -0.69473828, -0.78539816, -0.86217005, -0.92729522, -0.98279372]) -- Ryan Krauss, Ph.D. Associate Professor Mechanical Engineering Southern Illinois University Edwardsville On Thu, Jun 6, 2013 at 2:31 PM, Ryan Krauss <rk...@si...> wrote: > FYI, I made this change in my local checkout code and ran a simple test > and it is working: > > In [8]: test = control.TransferFunction(1,[1,3]) > > In [9]: s1 = -1+2.0j > > In [10]: test(s1) > Out[10]: (0.25-0.25j) > > In [11]: 1.0/(s1+3) > Out[11]: (0.25-0.25j) > > Nothing too fancy, but solves my issue. > > > -- > Ryan Krauss, Ph.D. > Associate Professor > Mechanical Engineering > Southern Illinois University Edwardsville > > > On Thu, Jun 6, 2013 at 1:47 PM, Ryan Krauss <rk...@si...> wrote: > >> I would like to submit some minor patches over the course of the summer >> to help me completely get rid of my old controls module and switch over to >> python-control for everything. My most immediate need is for a __call__ >> method. This method might not make any sense for a state-space system, but >> for certain aspects of my modeling work, I need to evaluate transfer >> functions at certain numerical values of s. >> >> I would propose something like this: >> >> def __call__(self, s): >> """Evaluate a transfer function at s.""" >> N_poly = poly1d(squeeze(self.num)) >> D_poly = poly1d(squeeze(self.den)) >> return N_poly(s)/D_poly(s) >> >> >> It could also include a check that self is SISO and possibly throw an >> exception if it is not (pretty sure that poly1d will throw one if we pass >> in a vector of coefficients that isn't 1d). >> >> Would this be welcome? Is there anything I should tweak? >> >> Thanks, >> >> Ryan >> >> -- >> Ryan Krauss, Ph.D. >> Associate Professor >> Mechanical Engineering >> Southern Illinois University Edwardsville >> > > |