Ingénierie numérique Intégration numérique But : écrire les fonctions rectangles(f,a,b,n) et trapezes(f,a,b,n) réalisant l’intégration numérique d’une fonction f(x) entre les points a et b (n est le nombre de rectangles ou de trapèzes). Algorithmes : ils sont basés sur les schémas ci-dessous. Vérification : from scipy.integrate import quad # Taper ?quad dans le shell pour l'aide. Rappel : fonctions lambda Il est possible de définir une fonction « à la volée » en utilisant la syntaxe suivante : lambda x:2*x (pour définir une fonction anonyme qui à x associe 2x). Exemple 1 : rectangles(lambda x:2*x,0,1,10) (entré directement dans le shell). Exemple 2 : fct=eval(input('Fonction : ')) (dans le fichier) et on entre dans le shell : lambda x:2*x. Méthode des rectangles Méthode des trapèzes PCSI – IPT G. Monod Ingenierie_numerique.docx 1/4 Ingénierie numérique Méthode de Newton But : écrire une fonction Newton(f,der,f,a,b,x0) permettant de rechercher le zéro d’une fonction f dérivable sur un intervalle donné [a,b] (on cherche la valeur α telle que f(α) = 0) en utilisant la méthode de Newton (x0 est la valeur de départ dans l’intervalle et der est la dérivée de f(x) fournie explicitement). Algorithme : la relation de récurrence entre xn et xn+1 est déduite du schéma ci-dessous (à partir de l’équation de la tangente en un point d’abscisse xn). Le critère d’arrêt peut porter sur la valeur de |f(xn)| ou/et sur |xn+1 – xn| ou/et sur le nombre d’itérations. Perfectionnements : - vérifier à chaque étape que xn est bien dans l’intervalle ; - que la dérivée ne s’annule pas (attention, du fait de la représentation des flottants sur un nombre fini de bits, un test de la forme if f’(x) == 0; n’a pas de sens). Vérification : import scipy.optimize as sp # Taper ?sp.newton, ?sp.fsolve, ?sp.root dans le shell pour l'aide Tester les commandes suivantes : sp.newton(fct,x,der) sp.newton(fct,x) sp.fsolve(fct,x) sp.root(fct,x).x Méthode de Newton PCSI – IPT G. Monod Ingenierie_numerique.docx 2/4 Méthode d’Euler Ingénierie numérique Intégration d’une équation différentielle d’ordre 1 Problème de Cauchy Recherche de la fonction y(t) telle que : y ′( t ) = f ( t , y ( t ) ) . y ( t 0 ) = y0 y de classe C1 sur [t0, tf ]. La 1ère condition exprime que y’ est une fonction connue de t et y. La 2nde condition est une condition initiale. But : écrire une fonction Euler(f,t0,y0,tf,h) retournant deux listes Lt et Ly contenant respectivement les valeurs des instants ti et les valeurs yi correspondants (h = tn+1 – tn est le pas de discrétisation, les autres paramètres sont définis ci-dessus). Algorithme : la relation de récurrence entre yn et yn+1 est déduite du schéma ci-dessous (à partir de l’équation de la tangente en un point d’abscisse tn). Vérification : from scipy.integrate import odeint # Taper ?odeint dans le shell pour l'aide y = odeint(f,[y0,t0],t) où t est une liste de valeurs (cf. ci-dessous rappels numpy). Rappel : tracés avec matplotlib import matplotlib.pyplot as plt plt.plot(liste1, liste2) plt.show() (liste1 = abscisses et liste2 = ordonnées) Rappel : construction de listes de valeurs (flottants) avec numpy import numpy as np np.arange(debut,fin,pas) ou np.linspace(debut,fin,nombre) (voir l’aide). Voir aussi np.zeros(n) et np.ones(n). Méthode d’Euler PCSI – IPT G. Monod Ingenierie_numerique.docx 3/4 Intégration d’une équation différentielle d’ordre 2 – Pendule simple (d’après concours) 2 En l’absence de frottements, l’équation du pendule simple est : θɺɺ = −ω0 sin(θ ) où θ est l’angle entre la verticale et le fil du pendule. On simule le système sur l’intervalle de temps [0, τ]. Schéma numérique Le temps est discrétisé avec un pas h = τ où N est un entier. N On construit alors un tableau à deux indices de taille (2, N+1) : les cases d’indices [0, k] contiennent les valeurs θ(kh) et celles d’indices [1, k] contiennent les valeurs θɺ( kh ) . (1) θ ( kh + h) = θ ( kh ) + h θɺ(kh) Le système discrétisé s’écrit sous la forme : . (2) θɺ( kh + h) = θɺ( kh ) + h θɺɺ( kh) Dans l’équation (2), la dérivée seconde est donnée par l’équation physique du mouvement. Objectifs 1/ Comparer (graphiquement) les solutions des équations linéarisées et non linéarisées du pendule simple. Écrire deux fonctions : - penduleExact(N, tau, theta0, thetaPoint0, omega0) retournant le tableau des θ(kh) ; - penduleLinearise(N, tau, theta0, thetaPoint0, omega0) (solution lorsque l’approximation sin(θ ) ≈ θ est effectuée). 2/ Observer l’influence des frottements. Modifier ces fonctions pour tenir compte d’un moment résistant proportionnel à la vitesse angulaire : 2 θɺɺ = − aθɺ − ω sin(θ ) . 0 On pourra prendre 2000 points (à ajuster) sur 20 secondes, θ 0 = 1 rad, ω0 = 1 rad/s et a = 0.1 s-1. Rappel numpy Initialisation d’un tableau à deux indices de N+1 valeurs : zeros((2,N+1)). Vérification scipy.integrate (cf. odeint). La syntaxe est de la forme odeint(systeme, conditionsInitiales, t) où : - systeme(theta, t) est une fonction de la variable theta = [θ , θɺ] (tableau à deux indices défini comme ci-dessus) et du temps retournant la dérivée de theta, c'est-à-dire [θɺ, θɺɺ] ou encore, dans notre exemple, [theta[1], -a*theta[1] -w0**2*np.sin(theta[0])] ; - conditionsInitiales est de la forme [theta0, thetaPoint0] ; - t = linspace(debut, fin, nbrePoints) (cf. aide). odeint renvoie un tableau de tableaux de la forme [… [θ , θɺ] …] correspondant aux différents instants. PCSI – IPT G. Monod Ingenierie_numerique.docx 4/4