# ------------------------------------------------------------------------- # # PYTHON for DUMMIES 23-24 # Problème 7 # # Calcul de la zone de stabilité d'une méthode de Gear # Vincent Legat # # ------------------------------------------------------------------------- # import numpy as np from numpy import * # ============================================================ # FONCTIONS A MODIFIER [begin] # # -1- La zone de stabilité de Gear d'ordre un (qui est la méthode # d'Euler implicite :-) vous est offerte gracieusement # par les descendants de la famille Gear ! # # Evidemment, c'est plus compliqué pour les autres ordres ! # def stabilityGear(x,y,order): # # A COMPLETER / MODIFIER [begin] # z = x + 1j*y gain = abs(1/(1-z)) coeff = ones(2) # # A COMPLETER / MODIFIER [end] # return gain,coeff # # FONCTIONS A MODIFIER [end] # ============================================================ # # ------------------------------------------------------------------------------------ # # Script de test # # # -1- Choix de l'ordre et de la précision de la carte de stabilité # # ------------------------------------------------------------------------------------ def main() : order = 3 n = 100 x,y = np.meshgrid(np.linspace(-8,8,n),np.linspace(-8,8,n)) gain,coeff = stabilityGear(x,y,order) # # -2- Impression des coefficients de la méthode de Gear # Observer l'utilisation du module "fractions" qui permet # d'écrire des nombres en virgule flottante sous la forme de fractions ! # # Retirer la ligne np.set_printoptions # Noter aussi les astuces dans les paramètres :-) # Merci à : https://stackoverflow.com/questions/42209365/numpy-convert-decimals-to-fractions # # import fractions np.set_printoptions(formatter={'all':lambda x: str(fractions.Fraction(x).limit_denominator())}) print("==== Coefficients of Gear's method for order = %d ========== " % order) print(" ",end='') print(coeff) # # -3- Faire le joli plot # import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['toolbar'] = 'None' plt.rcParams['figure.facecolor'] = 'lavender' plt.rcParams['axes.facecolor'] = 'lavender' plt.figure("Stability of Gear's method : order = %d" % order) plt.contourf(x,y,gain,np.arange(0,1.1,0.1),cmap=plt.cm.jet_r) plt.contour(x,y,gain,np.arange(0,1.1,0.1),colors='black',linewidths=0.5) ax = plt.gca() ax.axhline(y=0,color='r') ax.axvline(x=0,color='r') ax.yaxis.grid(color='gray',linestyle='dashed') ax.xaxis.grid(color='gray',linestyle='dashed') ax.set_aspect('equal', 'box') plt.show() main()