Previous Page Next Page

12.7 Procédures et fonctions formelles

Avec l'introduction du concept de type procédural il est possible de déclarer des procédures et des fonctions ayant pour paramètres des procédures ou des fonctions.

Exemple 1: Approximation numérique du maximum d'une fonction mathématique

Supposons que l'on se voit confronté au problème suivant: Concevoir une fonction Turbo-Pascal permettant de déterminer le maximum d'une fonction continue f (au sens mathématique du terme) dans un intervalle fermé [ a, b ].

Undisplayed Graphic

Figure 12.6 Approximation du maximum d'une fonction f

définie sur un intervalle fermé [ a, b ]

Un principe de résolution est le suivant:

Evaluer l'expression f(x) de la fonction f aux points équidistants

x0, x1, x2, . . . , xn Î [ a, b ] tels que

x0 = a,

x1 = a + h,

. . .

xn = a + nh,

avec

Undisplayed Graphic,

h est appelé le pas de la méthode.

Il s'agit donc d'approcher la fonction f sur l'intervalle [ a, b ] en l'évaluant aux points xk tels que:

Undisplayed Graphic, k = 0, 1, . . . , n.

Si fk (k = 0, 1, . . . , n) désignent les valeurs correspondantes de la fonction aux points xk, il s'agit d'en calculer le maximum.

D'après cette méthode de résolution, la fonction cherchée peut s'écrire en particulier pour

Undisplayed Graphic

sous la forme:

FUNCTION FMax ( A, B: Real; N: Integer ): Real;

{Détermine le maximum de la fonction f( x ) = x*x*(x-1)

dans l'intervalle [ A, B ].}

VAR K: 1..N;

XK, FK, Max, Step: Real;

BEGIN

Step := (B - A)/N;

XK := A;

Max := Sqr( XK )*( XK - 1 );

FOR K:=1 TO N DO

BEGIN

XK := XK + Step;

FK := Sqr( XK )*( XK - 1 );

IF FK>Max THEN Max := FK

END;

FMax := Max

END; {-- FMax}

L'inconvénient est que la fonction FMax n'est valable que pour une fonction f bien précise. Elle n'est donc pas générale. Pour remédier à cet inconvénient, on peut déclarer en Turbo-Pascal une fonction comme paramètre formel de la fonction FMax.

En utilisant la définition de type procédural

TYPE MathFunction = FUNCTION ( X: Real ): Real;

la fonction FMax va s'écrire:

FUNCTION FMax ( F: MathFunction; A, B: Real; N: Integer ): Real;

{Détermine le maximum d'une fonction f( x ) dans l'intervalle [ A, B ].}

VAR K: 1..N;

XK, FK, Max, Step: Real;

BEGIN

Step := (B - A)/N;

XK := A;

Max := F( XK );

FOR K:=1 TO N DO

BEGIN

XK := XK + Step;

FK := F ( XK );

IF FK>Max THEN Max := FK

END;

FMax := Max

END; {-- FMax}

Pour la fonction

FUNCTION F ( X: Real ): Real; Far;

BEGIN

F := Sqr( X )*( X - 1 )

END; {-- F}

le maximum cherché peut être obtenu par exemple par l'affectation:

Maximum := FMax( F, 0, 20, 100 );

Evidemment faut-il que la fonction F soit déclarée en mode Far.

Cette technique de programmation est largement exploitée dans les programmes de calculs scientifiques. En général, le concept de type procédural est particulièrement intéressant si une certaine action commune doit être exécutée pour un ensemble de procédures et de fonctions.

Exemple 2: Une méthode d'intégration numérique: la méthode des trapèzes

On désire écrire une fonction qui calcule l'intégrale définie d'une fonction F( X ) entre les bornes réelles A et B:

Géométriquement, la fonction Int( X ) représente la surface délimitée par la courbe d'équation Y = F( X ), l'axe des abscisses et les droites d'équations respectives X = A et X = B. Cette surface peut être approximée en divisant l'intervalle [ A, B ] en N intervalles de diamètre h = (B - A)/N chacun et en calculant la somme des surfaces des trapèzes ainsi représentés dans la figure 12.7 ci-dessous.

Undisplayed Graphic

Figure 12.7 Approximation d'une intégrale définie par la méthode des trapèzes

L'approximation s'écrit de la manière suivante:

Undisplayed Graphic » Undisplayed Graphic.

En reprenant la définition de type procédural de l'exemple 1, on écrit sans peine le schéma de fonction suivant:

FUNCTION Int ( F: MathFunction; A, B: Real; N: Integer): Real;

{Calcule l'intégrale définie d'une fonction F( X ) définie sur l'intervalle

[ A, B ] d'après la méthode des trapèzes.}

<définitions et déclarations locales>

BEGIN

<calcul approché de Undisplayed Graphic>

END; {-- Int}

Si nous choisissons à titre d'exemple les deux intégrales suivantes:

Undisplayed Graphic avec F( X ) = Sin( X )

Undisplayed Graphic avec G( X ) = XeX

alors un programme Turbo-Pascal réalisant cette tâche peut s'écrire comme suit:

PROGRAM Integral;

Uses Crt;

CONST Pi = 3.14159;

TYPE MathFunction = FUNCTION ( X: Real ): Real;

FUNCTION Int ( F: MathFunction; A, B: Real; N: Integer): Real;

{Calcule l'intégrale définie d'une fonction F (X) définie sur l'intervalle

[ A, B ] d'après la méthode des trapèzes.}

VAR H, {pas}

Sum: Real;

BEGIN

H := ( B - A )/N;

Sum := 0;

WHILE A<B DO

BEGIN

Sum := Sum + F( A ) + F(A+H);

A := A + H

END; {WHILE, A>=B}

Int := (H/2)*Sum

END; {-- Int}

FUNCTION F ( X: Real ): Real; Far;

BEGIN

F := Sin( X )

END; {-- F}

FUNCTION G ( X: Real ): Real; Far;

BEGIN

G := X*Exp( X )

END; {-- G}

BEGIN {main}

ClrScr;

Writeln ( 'Intégrale de F( X ) entre 0 et PI/2: ', Int( F, 0, PI/2, 100 ) );

Writeln ( 'Intégrale de G( X ) entre 2 et 3: ', Int( G, 2, 3, 100 ) )

END. {-- Integral}

Previous Page Next Page


© Aflo Informatique , 2003-2004