gearSoluce.py

# -------------------------------------------------------------------------
#
# PYTHON for DUMMIES 
# Probleme 7
#
# Solution detaillée
#  Vincent Legat
#
# -------------------------------------------------------------------------

from numpy import *

def stabilityGear(x,y,order):

#
#  -1- Coefficients des méthodes de Gear
#
#  Source pour les coefficients : 
#  http://en.wikipedia.org/wiki/Backward_differentiation_formula
#
#  C'est bien juste : les calculs savants de quelques tuteurs
#  donnent les memes valeurs :-)
#  Moralité : ne recalcule pas ce qui a deja été fait :-)
#

  if (order > 6) :
    return zeros(order+1),zeros(shape(x))

  coeffs = {}
  coeffs[1] = array([ -1,   -1,                             ])/1   
  coeffs[2] = array([ -2,   -4,    1,                       ])/3
  coeffs[3] = array([ -6,  -18,    9,   -2,                 ])/11
  coeffs[4] = array([-12,  -48,   36,  -16,    3,           ])/25
  coeffs[5] = array([-60, -300,  300, -200,   75,  -12,     ])/137
  coeffs[6] = array([-60, -360,  450, -400,  225,  -72,  10 ])/147

  coeff = -coeffs[order]

#
# -2- Calcul des racines du polynôme de stabilité
#     Le gain est le maximum des modules des racines obtenues
#
   
  z = x + 1j*y
  gain = zeros(shape(z))
  for i in range(shape(z)[0]) :
    for j in range(shape(z)[1]) :
       gain[i,j] = max(abs(roots([(coeff[0]*z[i,j] -1),*coeff[1:]])))

  return gain,coeff