Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

Embed Size (px)

Citation preview

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    1/82

    CALCULS NUMERIQUES RESOLUS EN

    LANGAGE CRappels de Cours, Exercices corrigs, Algorithmes, et leurs Codes C

    Auteur : Dr . Hatem MOKHTARI, Matre de Confrences

    Universit de Constantine, Facult des Sciences de Lingnieur, Dpartement

    dElectronique

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    2/82

    2/82

    Prambule

    Dans un monde o les quations ne peuvent avoir de solutions analytiques par le calcul direct,

    intervient lanalyse et le calcul numrique qui permettent justement de palier cette lacune et

    de proposer une solution approche au problme. Les domaines dapplication sont trsdiversifis et pour chaque problme ses conditions aux limites qui dictent le comportement de

    la solution (signal lectrique, pression, temprature, etc .).

    Lobjectif de ce polycopi est de donner une base de calcul avec un bref rappel de la thorie

    mais en insistant plus sur laspect pratique que le formalisme thorique. Afin de ne pas

    surcharger le document de thorie et dinterminables dmonstrations, nous avons prfr la

    procdure suivante : poser le problme, rappeler les principes fondamentaux de la mthode

    numrique en question, et daborder directement des applications concrtes. Nous navons

    nanmoins pas nglig laspect algorithmique qui est la base mme dune programmation

    exacte et russie. Cest la raison pour laquelle nous avons propos, avant chaque code en C du

    problme en question, lalgorithme qui permet justement dcrire le programme de faon

    lisible et comprhensible. Le code C est bien document avec des commentaires sur les lignes

    juges essentielles au traitement dinstructions ou de boucles permettant lexcution du

    programme. A travers ce document, le lecteur peut se rendre compte du ct applicatif qui est

    mis en exergue avec des problmes classiques souvent rencontr en lectronique, en

    lectromagntisme, en chimie ou en physique de faon gnrale.

    Finalement, ce document a pour vocation et objectif de donner ltudiant ou au chercheur un

    code C qui a t test et dont lalgorithme peut tre adapt dautres problmes en effectuant

    de simples modifications.

    Limagination est plus importante que le savoir .Albert Einstein

    Dr. Hatem MOKHTARI | Calculs Numriques rsolus en Langage C

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    3/82

    3/82

    Table des Matires

    Chapitre I : Rsolution dEquations Algbriques Non Linaires

    Mthode de la Bissection, Mthode de Newton,

    Mthode du Point Fixe

    Chapitre II : Rsolution des systmes dquations de forme matricielle A.x = b

    Mthode du Pivot de Gauss

    Mthode de Jacobi

    Mthode de Gauss-Seidel

    Mthode de Newton-Raphson

    Chapitre III : Rgression Linaire au sens des Moindres Carrs

    Approximation de donnes exprimentales par : y = a.x + b

    Chapitre IV : Interpolations Polynomiales

    Mthode de Lagrange

    Mthode de Newton

    Chapitre V : Mthodes dIntgration Numrique

    Mthode des Rectangles

    Mthode des Trapzes

    Mthode de Simpson

    Mthode de Quadrature de Gauss-Legendre

    Chapitre VI : Rsolution dquations diffrentielles ordinaires

    Mthode dEuler

    Mthode de Runge-Kutta

    Rfrences Bibliographiques

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    4/82

    4/82

    CHAPITRE I

    Rsolution dEquations Algbriques Non Linaires

    Mthodes Etudies :

    Bissection, Newton,

    Point Fixe

    I.1. Introduction

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    5/82

    5/82

    I .2. La mthode de la bissection

    Une fonction change de signe au voisinage de la racine. Une racine se trouve dans lintervalle

    [a,b] sif(a) etf(b) ont des signes opposs. Toutefois un changement de signe peut tre d non

    pas seulement une racine mais aussi une singularit. Alors la mthode est utilise pour

    trouver des solutions initiales.

    Algorithme de la Bissection

    Initialisationa(0) = a,b(0) = b, etx(0) = [a(0)+b(0)]/2

    Boucle

    Pour k 0 et tant que = |b(k) a(k)| >

    Si f(x(k))f(a(k)) < 0 a(k+1) = a(k), b(k+1) = x(k)

    Si f(x(k))f(b(k)) < 0 a(k+1) = x(k), b(k+1) = b(k)

    x(k+1) = a(k+1)+b(k+1)

    Afficher x(k)

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    6/82

    6/82

    Fin

    Code C de la mthode de la bissection// Le but est de trouver la solution de lquation Ln(x) = 0 (i.e. vrifier que x = 1.0 comme

    solution)

    // lintervalle est [0,5]

    Nom de fichier : BISSECTION.CPP

    #include #include #include

    #define A 0.0 // Borne Infrieure#define B 5.0 // Borne Suprieure#define N 100 // Nombre d'itrations

    #define EPS 1.0e-15 // Prcision demande

    double f(double x){

    return log(x); // fonction tester Ln(x) = 0 dans [0, 5]}

    void main(){

    double *a, *b, *x;

    a = (double *)calloc(N,sizeof(double));b = (double *)calloc(N,sizeof(double));x = (double *)calloc(N,sizeof(double));

    a[0] = A; // Initialisation du pointeur *ab[0] = B; // Initialisation du pointeur *bx[0] = (a[0]+b[0])/2.0; // Initialisation du pointeur *x

    int k=0;

    while( k>=0 &&fabs(b[k] - a[k]) > EPS ) // Arrt si un des deux critres est faux

    {if( f(x[k])*f(a[k]) < 0 ){

    a[k+1] = a[k];b[k+1] = x[k];

    }

    if( f(x[k])*f(b[k]) < 0 ){

    a[k+1] = x[k];b[k+1] = b[k];

    }

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    7/82

    7/82

    x[k+1] = (a[k+1]+b[k+1])/2.0;

    printf("K = %d \t X = %18.16g\n", k, x[k]);// Impression du nombre d'itrations, et la solution Ln(x) = 0k++;

    }delete [] a; // Libration de la mmoiredelete [] b; // Libration de la mmoiredelete [] x; // Libration de la mmoire

    }

    Le rsultat est rsum par la fentre ci-dessous. La mthode converge aprs 57 itrations

    donnant 1 comme solution Ln(x) = 0

    I.3. La mthode de Newton

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    8/82

    8/82

    On utilise cette mthode lorsque lon peut calculer les drives def(x) de faon analytique. Le

    principe de cette mthode consiste tracer la tangente enxi et de chercher lintersectionxi+1avec laxe horizontal et ainsi de suite.

    Algorithme de la Mthode de NewtonDonnes : N, x, , f(xi) et f(xi)BouclePour i=1,NOn calculera :

    = ()()Si | |< alors est une racineSinon on continue les itrations (cad i = i+1)

    Code C de la mthode de Newton

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    9/82

    9/82

    // Dans lexemple ci-dessous nous cherchons la racine de lquation Ln(x) = 0 dans

    lintervalle ]0, +[ avec x0 comme valeur initiale choisie par lutilisateur

    Nom de fichier :Newton.cpp

    #include

    #include #include

    #define EPS 1.0e-15 // Prcision voulue#define N 1000 // Nombre maximal d'itrations

    double f(double x){return log(x); //Ln(x) comme test

    }

    double df(double x){

    return 1.0/x; // Drive de Ln(x)}

    voidmain(){

    double x0; // Valeur Initialedouble *x; // tableau des valeurs Xi

    x = (double *)calloc(N,sizeof(double));

    printf("entrer la valeur initiale X0: \n");scanf("%lf",&x0);//L'utilisateur choisi une valeur de dpart

    x[0] = x0;

    for(int i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    10/82

    10/82

    Remarque : La commande exit (0) ;permet de sortir du programme et darrter dimprimer

    les valeurs dei et x[i+1]

    Le rsultat est rsum par la fentre ci-dessous. La mthode converge aprs 6 itrations

    donnant 1 comme solution Ln(x) = 0

    Application de la mthode de Newton : Circuit RL avec diode de redressement

    Le circuit ci-dessous prsente un redresseur simple alternance sur une charge inductive RL.

    La rsolution de lquation diffrentielle :()= + (1)lorsque la tension ()= ()on dmontre [1] que le courant dans la charge R L :

    (2)

    Avec

    (3)

    (4)

    (5)

    Pour que le courant i(t)sannule, il faut trouver la solution de lquation

    (6)

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    11/82

    11/82

    Il est clair quil ny a pas de solution analytique lquation (6). Nous nous proposons donc

    dutiliser la mthode de Newton vu quil existe une drive de la fonction

    ()= ( ) + (7)La drive de f(t) est :

    ()= ( ) (8)/*Le programme en C de la rsolution de lquation (6) et utilisant la Mthode de Newton est

    donn ci-dessous. Pour le calcul nous avons pris les valeurs numriques suivantes :L = 0.01 H

    R = 5

    f = 50 Hz ou T = 0.02 sec (= 314.159 rd/s)

    = L/R = 0.002 secLa prcision EPS = 10

    -15

    */

    Nom de fichier :Newton_CircuitRL.cpp

    #include #include #include

    #define EPS 1.0e-15 // Prcision voulue

    #define N 1000 // Nombre maximal d'itrations#define Omega 314.159#define L 1.0e-2#define R 5.0#define Tau 2.0e-3#define phi atan(L*Omega/R)#define T 0.02

    double f(double t) // la fonction f(t) = 0 dont il faut chercher les racines{

    return sin(Omega*t - phi) + sin(phi)*exp(-t/Tau); // fonction test

    }

    double df(double t) // la driv de f(t){

    return Omega*cos(Omega*t - phi) - (sin(phi)*exp(-t/Tau))/Tau;}

    voidmain(){

    double *x; // tableau des valeurs Xi

    x = (double *)calloc(N,sizeof(double));

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    12/82

    12/82

    x[0] = T/2; // on initialise t T/2 vu que le courant s'annule aprs cette valeur

    for(int i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    13/82

    13/82

    #define EPS 1.0e-15 // Prcision voulue

    double g(double x){

    return exp(-x); // fonction test

    }

    voidmain(){

    double x0,*x;x = (double *)calloc(N,sizeof(double)); // allocation dynamique

    printf("Entrez une valeur initiale X0:");scanf("%lf",&x0);

    x[0] = x0; // Initialisation de la valeur de dpart

    int k=0;do{

    x[k+1] = g(x[k]); // calcul des termes de la srie x(k+1)

    if(fabs(x[k+1] - x[k]) EPS );// continuer les calcul tant que le critre n'est

    pas atteind

    delete [] x;}

    Le rsultat est rsum par la fentre ci-dessous avec x0 = 0.5 comme valeur initiale

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    14/82

    14/82

    CHAPITRE II

    Rsolution des systmes dquations de forme Matricielle A.x = b

    Mthodes tudies :

    Pivot de Gauss,

    Jacobi,

    Gauss-Seidel,

    Newton-Raphson

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    15/82

    15/82

    II.1. Introduction

    II.2. Mthode du Pivot Gauss

    Il sagit de trouver les racines de lquation matricielle A .x = b avec x comme vecteur

    inconnue,Aune matrice et bvecteur donn (connu).

    Cette mthode est la plus simple et la plus classique, elle correspond exactement ce que lonfait " la main" :

    de la premire quation, on exprime la premire inconnue x1en fonction des autresinconnues, puis on substitue cette expression dans les autres quations du systme, faisant

    apparatre ainsi un sous-systme dans lequelx1nintervient pas,

    on itre le mme schma jusqu ce que la matrice du systme devienne triangulaire

    suprieure (toute la partie infrieure de la matrice sous la diagonale est remplie de zros),

    une fois la triangularisation termine, on calculexn, puisxn-1, et ainsi de suite jusqux1;lesdiffrentes solutions sont ainsi calcules de proche en proche.

    Le principe de triangularisation permet ainsi de transformer le systme initial

    par un systme triangulaire quivalent de la forme

    Pour liminer x1de la premire quation, on divise par le coefficient a11de la matrice ; ce

    coefficient sappelle le pivot. Il est clairement indispensable que ce coefficient ne soit pas nul.

    Nanmoins, ce critre, parfaitement acceptable mathmatiquement, nest pas suffisant

    numriquement. En effet, ce coefficient peut tre trs faible, entranant ainsi lapparition de

    trs grandes valeurs, et donc de grands risques dimprcisions et derreurs numriques.

    En fait, la mthode du pivot de Gauss est rigoureuse mathmatiquement, mais elle conduit

    gnralement de nombreux calculs ; la mthode est donc assez sensible aux erreurs

    numriques, en particulier pour les systmes de grande taille.

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    16/82

    16/82

    Une implmentation de cette mthode doit donc imprativement mettre en oeuvre une

    stratgie de choix du pivot, consistant recherche le plus grand pivot en valeur absolue ou en

    module si lon utilise une matrice valeurs complexes. On a pour cela plusieurs possibilits :

    la premire mthode, la plus simple, consiste observer que lon peut indiffremment

    inverser lordre des quations, sans changer le systme ni sa solution ; on recherche donc lepivot dfini par || pour 1 et on permute les quations si ncessaire : larecherche du plus grand pivot se fait donc par colonne,

    la deuxime mthode consiste rechercher le plus grand pivot par ligne plutt que par

    colonne ; on recherche donc le pivot dfini par ||pour 1 linconvnient majeur de cette mthode est quelle ne conserve pas le systme initial, mais

    quil faut obligatoirement tenir compte dun ragencement des solutions ; cette mthode est

    donc plus complique que la prcdente puisque le programme doit mmoriser toute la

    squence de ragencements successifs afin de pouvoir remettre les solutions dans le bon

    ordre,

    la troisime mthode consiste mixer les deux mthodes prcdentes, et donc chercherle

    pivot dfini parmax(||,||) pour 1 ; la recherche se fait donc sur lignes etcolonnes : cettemthode a gnralement les mmes inconvnients que la prcdente.

    Le code C ci-dessous illustre une implmentation de cette mthode de rsolution ; il est

    constitu des blocs suivants :

    les quatre premires fonctions al l oc_vect eur , f r ee_vect eur , al l oc_mat r i ceetf r ee_mat r i cesont des fonctions gnrales permettant de grer dynamiquement lestockage des matrices et vecteurs ; ces fonctions sont utilises ici, mais ne font pas partie de

    lalgorithme du pivot de Gauss,

    les fonctions t r ouve_pi vot , per mut e_l i gnesetgauss correspondent larsolution par le pivot de Gauss,

    la fonction cont r ol enest l que pour vrifier que la solution trouve satisfait bien lesystme initial,

    enfin, les fonctions r andometmai n permettent de tester avec un exemple particulier.

    Nom de fichier : PivotGauss.cpp

    #include

    #include #include #include

    #define EPS 1.0e-12

    //--------------------------------------------------------------// Fonction dallocation dun vecteur (n)//--------------------------------------------------------------double * alloc_vecteur (int n){

    return (double *)malloc(n*sizeof(double));}

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    17/82

    17/82

    //--------------------------------------------------------------// Fonction de dsallocation d'un vecteur (n)//--------------------------------------------------------------void free_vecteur (double *v)

    {if (v!=NULL) free((void *)v);

    }

    //--------------------------------------------------------------// Fonction d'allocation d'une matrice (n,n)// Remarque : on dsalloue en cas dchec en cours !//--------------------------------------------------------------double ** alloc_matrice (int n){

    double **a;

    a=(double **)malloc(n*sizeof(double *));if (a!=NULL){

    for (int i=0; i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    18/82

    18/82

    // Fonction de recherche du pivot maximum sur une colonne// et partir d'une ligne spcifie//--------------------------------------------------------------int trouve_pivot (double **A, int n, int ligne, int colonne){

    double v,max;inti,pivot;for (i=ligne, max=0.0; imax){

    pivot=i; // pivot identifie la ligne contenant le pivot max.max=v;

    }}

    if (max

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    19/82

    19/82

    int gauss (double **a, double *b, double *x, int n){

    interr,pivot,indpivot,ligne,colonne;double **A,*B,coef;

    A=alloc_matrice(n);if (A==NULL) return 0; // allocation matrice A

    B=alloc_vecteur(n); // allocation vecteur B

    if (B==NULL){

    free_matrice(A,n);return 0;

    }

    for (ligne=0; ligne

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    20/82

    20/82

    break;}

    }

    if (err==1) // si on na pas rencontr derreur

    {for (ligne=n-1; ligne>=0; ligne--) // calcul des solutions, en remontant

    de la{ // dernire jusqu la premire

    coef=B[ligne];for (colonne=1+ligne; colonne

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    21/82

    21/82

    // 1. on alloue dynamiquement a et b (x=b+n)// 2. la matrice a est alatoire entre -1 et +1, idem pour b// 3. on affiche a et b// 4. on calcule la solution x par la fonction gauss// 5. on affiche x, puis la diffrence (ax-b)

    // 6. on dsalloue a et b

    main (){

    double **a,*b,*x;int n=5;

    a=alloc_matrice(n); if (a==NULL) return 0;b=alloc_vecteur(2*n);

    if (b==NULL){

    free_matrice(a,n);return 0;

    }

    x=b+n;for (int i=0; i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    22/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    23/82

    23/82

    Le code C ci-dessous regroupe les mthodes itratives cites plus haut, et en rajoutedautres (cf. littrature en Rfrences)

    /*Rsolution de A x = b par :

    Cramer , Inversion , Gauss , Gauss pivot partiel ,Gauss pivot total , Jordan , Dcomposition LU croot ,LU doolittle , Cholseky , et les methodes itratives de Jacobie et Gauss-Seidel.*/

    #include "stdafx.h"

    #include #include #include // -------------------------------------------------------------// Fonctions utiles pour la rsolution par Cramer et inversion// -------------------------------------------------------------

    // fonction d'affichage matricevoid aff_mat(double a[19][19],int n){

    int i,j;

    printf("\n\n");for (i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    24/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    25/82

    25/82

    // Mettre Zero les elements qui doivent etre des zro

    void zero(double a[19][19],double b[19],int n){

    int i,j;double eps=1e-4;for(i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    26/82

    26/82

    comatrices(a,c,k,j,n);s = s + powl(-1,k+j)*a[k][j]*det(c,k);}return(s);

    }

    // -------------------------------------------------------------// Rsolution Par Cramer// -------------------------------------------------------------

    void cramer(double a[19][19],double b[19],int n){

    double A[19][19],x[19],deter;int i,j,k;

    deter=det(a,n);

    if (deter==0){printf("\n => Determinant nul, pas de solutions \n\n");system("PAUSE");//main();}

    for(j=0;j

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    27/82

    27/82

    {printf("\n => Matrice non inversible, pas de solutions \n\n");system("PAUSE");

    }

    for(i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    28/82

    28/82

    p=a[i][k]/a[k][k];for (j=k;j=0;i--){s=0;for(j=i+1;j

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    29/82

    29/82

    //rductionfor(i=k+1;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    30/82

    30/82

    temp=a[k][j];a[k][j]=a[ligne][j];a[ligne][j]=temp;

    }

    temp=b[k];b[k]=b[ligne];b[ligne]=temp;

    for(i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    31/82

    31/82

    zero(a,b,n);printf("\n--------- Gauss avec pivot total ---------\n");printf("\n * La matrice reduite :");aff_syst(a,b,n);

    printf("\n * La resolution donne :\n\n");for (i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    32/82

    32/82

    for(i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    33/82

    33/82

    for(i=n-1;i>=0;i--){s=0;for(j=i+1;j

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    34/82

    34/82

    s=0;for (k=0;k

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    35/82

    35/82

    for (i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    36/82

    36/82

    // -------------------------------------------------------------// Rsolution Par Jacobie// -------------------------------------------------------------

    void jacobie(double a[19][19],double b[19],int n)

    {double x[19],x1[19],x2[19],s,eps=1e-4;int i,j,k,iter=0;

    //initialisation du vecteurprintf("\n * Veuillez initialisez le vecteur solution : \n\n");for (i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    37/82

    37/82

    for (j=i+1;j

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    38/82

    38/82

    printf("\n\n * Nombre d'equation-inconues : \n\n * N = ");scanf_s("%d",&n);

    reprendre_choix:

    printf("------ => donner votre choix ------ : ");scanf_s("%s",&valider);

    switch(valider){case 'A' : remplir(a,b,n);cramer(a,b,n); break;case 'B' : remplir(a,b,n);inversion(a,b,n); break;case 'C' : remplir(a,b,n);gauss(a,b,n); break;case 'D' : remplir(a,b,n);gauss_pivot_partiel(a,b,n); break;

    case 'E' : remplir(a,b,n);gauss_pivot_total(a,b,n); break;case 'F' : remplir(a,b,n);jordan(a,b,n); break;case 'G' : remplir(a,b,n);LU_doolittle(a,b,n); break;case 'H' : remplir(a,b,n);LU_crout(a,b,n); break;case 'I' : remplir(a,b,n);cholesky(a,b,n); break;case 'J' : remplir(a,b,n);jacobie(a,b,n); break;case 'K' : remplir(a,b,n);gauss_seidel(a,b,n); break;case 'X' : printf("\nProgramme interompu par l'utilisateur.......\n\n");system("PAUSE");exit(0); break;default : goto reprendre_choix;}printf("\n");system("PAUSE");

    return 0;}

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    39/82

    39/82

    CHAPITRE III

    Rgression Linaire au sens des moindres carrsApproximation de donnes exprimentales par :

    y = a.x +b

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    40/82

    40/82

    III .1. Problmatique

    Nous nous intressons un problme qui se pose souvent aux exprimentateurs. A l'issue

    d'une exprience, un exprimentateur a souvent enregistr des donnes relatives par exemple

    l'observation d'un phnomne physique. Ces donnes sont toujours entaches de bruit (le

    plus souvent d aux instruments utiliss). L'exprimentateur souhaite nanmoins comparer ses

    donnes un modle. Nous ne nous intresserons ici qu'au cas o le modle est connu.L'exprimentateur souhaite donc uniquement s'assurer que le phnomne observ suit bien la

    loi o le modle qu'il connat. Il souhaitera galement dterminer les valeurs numriques desparamtres intervenant dans ce modle, et qui ne sont pas connues priori.

    III.2. Ajustement dune fonction linaire :y = a.x + b

    L'exprimentateur est en possession de n donnes (xi, yi) issues de mesures par exemple. Laloi connue s'exprime comme y =f(x, p1, p2, , pm). Cette loi dpend des paramtres pqui ne

    sont pas ncessairement connus. Pour vrifier si les donnes se superposent correctement laloif, il suffit de calculer les carts yi-f(x,pj) en faisant varier la valeur de pj jusqu' ce que

    l'cart soit minimal (o nul si l'accord est parfait). Il faut bien videmment raliser ce calcul

    pour tous les points exprimentaux. Les statistiques nous offrent une manire lgante de

    calculer cela. On introduit pour cela une variable dpendant des paramtres pjque l'on

    appelle 2. Cette variable est dfinie comme

    On va ensuite chercher l'ensemble de paramtres pjqui va minimiser

    2

    Dans ce cas prcis, 2s'exprimera par lquation quadratique :

    On cherche minimiser cette grandeur, on va donc chercher satisfaire les conditions

    Et

    on en dduit que

    Et

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    41/82

    41/82

    On trouve ainsi les deux paramtres a et b qui minimisent le2, c'est dire les paramtres qui

    fournissent le meilleur accord entre les donnes exprimentales (xi, y

    i)et la fonction y. La

    valeur numrique de 2 va nous renseigner sur cet accord. Une valeur nulle indiquera un

    accord parfait entre les donnes et le modle, plus la valeur sera grande, moins bon sera

    l'accord. C'est ensuite l'utilisateur de cette mthode de dterminer quelles valeurs peuvent

    tre satisfaisantes ou pas.

    Exemple dapplication

    Soit les donnes exprimentales du tableau ci-dessous.

    x y

    0 1

    1 1,5

    2 2,1

    3 2,6

    4 3,5

    5 4,9

    6 5,3

    7 6,2

    On cherche donc les paramtres a et b qui minimisent2

    #include #include #include

    #define N 8

    double a, b;

    // fonction qui calcul a et b selon les quations ci-dessusvoidcalcul_a_b(int n, double *a,double *b, double *x, double *y){

    double A=0,B=0,C=0,D=0;double S1 =0.0,S2 = 0.0;double S3=0.0, S4=0.0;

    for(int i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    42/82

    42/82

    A *= n;B = S1*S2;C = n*S3;D = S1*S1;

    *a = (A-B)/(C-D);*b = (S3*S2 - (A/n)*S1)/(C - D);

    }

    //Fonction qui calcule X2 minimaledouble Khi2(int n, double a,double b, double *x,double *y){

    double valeur;

    valeur = 0.0;

    for(int k=0;k

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    43/82

    43/82

    // calcul de a et b

    calcul_a_b(N,&a,&b,x,y);

    printf("a = %18.16g \n\n",a);printf("b = %18.16g \n\n",b);

    // callcul de X2double KHI2 = Khi2(N,a,b,x,y);printf("KHI2 = %18.16g \n\n",KHI2);

    }

    Lexcution de ce programme nous donne le rsultat suivant pour notre exemple prcis

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    44/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    45/82

    45/82

    Soit une fonctionf (inconnue explicitement)

    connue seulement en certains pointsx0,x1xn

    ou valuable par un calcul coteux.Principe :

    reprsenterfpar une fonction simple, facile valuer

    Problme : il existe une infinit de solutions !

    Il faut se restreindre une famille de fonctions

    polynmes,

    exponentielles,

    fonctions trigonomtriques

    Interpolation polynomiale

    polynmes de degr au plus n polynmes de Lagrange

    diffrences finies de Newton

    0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8-4

    -3

    -2

    -1

    0

    1

    2

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    46/82

    46/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    47/82

    47/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    48/82

    48/82

    Le code C de linterpolation de Lagrange

    // polynomeLagrange.cpp : dfinit le point d'entre pour l'application console.//

    #include "stdafx.h"#include #include

    double lagrange(double *x,double *y,int n,double val){

    int i,j;double prod;

    double som;som=0;for(i=0;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    49/82

    49/82

    int _tmain(int argc, _TCHAR* argv[]){

    double val,res;double x[50],y[50];

    int i,j;int n;printf("donner le degre du polynome \n");scanf_s("%d",&n);

    for(j=0;j

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    50/82

    50/82

    IV.1. Mthode dinterpolation de Newton

    Lalgorithme de Newton propose dinterpoler des donnes exprimentales (Xi,Yi) par le

    polynme suivant :

    ()= + ( ) + ( )( ) + + ( )( ) ( )Avec

    ()= pour i=0,,nOn dmontre que le polynme Pn(x) scrit sous la forme :()= + ( ) +

    ( )( ) + +

    ! ( )( ) ( )On posera Cn

    =

    !Les

    ny0se calculent par la formule gnrale :

    = ()

    Avec

    = !!( )!

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    51/82

    51/82

    Exemple de calcul :

    Nous voulons produire le polynme de Newton pour la fonction reprsente par lchantillon

    du tableau suivant :

    xi 0 1 2 3

    yi 1 4 8 14

    Le programme en C ci-dessous illustre notre exemple

    /// INTERPOLATION POLYNOMIALE DE NEWTON

    #include "stdafx.h"#include

    #include #include

    const double h=1.0; // Pas des abscisses quidistants Xi+1 - Xiconst int n=3; // degr du polynme

    // Polynme de Newton pour la variable tdouble P(double t, double *x, double *C){

    double val, Prod;

    val = 0.0;

    for(int i=1;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    52/82

    52/82

    }

    // Combinaison de p parmi ndouble comb(int m, int p)

    {return fact(m)/(fact(p)*fact(m-p));

    }

    //Calcul des Delta Y0 : somme des K termesdouble DeltaY(double *y,int k)

    {double value = 0.0;

    int m=0;do

    {value += comb(k,m)*y[k-m]*pow(-1.0,m);

    m++;}

    while(m

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    53/82

    53/82

    free(x);

    free(C);free(y);

    system("pause");

    return 0;}

    En excutant ce programme, pour x=2 on trouve le rsultat suivant :

    Ce qui correspond bien la valeur pour x=2 (cad y = 8)

    Le polynme, aprs tous calculs, se rduit :

    ()= + + Prenons un autre exemple un peu plus complexe o le nombre de points est important

    La fonction tudier est donne par le tableau ci-dessous :

    Xi Yi

    -10,00 0,37

    -9,00 0,44

    -8,00 0,53

    -7,00 0,61

    -6,00 0,70

    -5,00 0,78

    -4,00 0,85

    -3,00 0,91

    -2,00 0,96

    -1,00 0,990,00 1,00

    1,00 0,99

    2,00 0,96

    3,00 0,91

    4,00 0,85

    5,00 0,78

    6,00 0,70

    7,00 0,61

    8,00 0,53

    9,00 0,4410,00 0,37

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    54/82

    54/82

    Constatons quil y a 21 valeurs pour xi et 21 pour yi. Il suffit donc de poser n = 20 et le tour

    est jou. Noublions pas que le pas constant h = 1 ici aussi et que les enregistrements de xi et

    yi doivent bien tre renseigns dans le code source. Ce dernier scrit alors comme suit :

    #include "stdafx.h"#include #include

    #include

    const double h=1.0;

    const int n=20; //Polynme de degr 20

    double P(double t, double *x, double *C)

    {double val, Prod;

    val = 0.0;

    for(int i=1;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    55/82

    55/82

    {

    value += comb(k,m)*y[k-m]*pow(-1.0,m);

    m++;

    }while(m

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    56/82

    56/82

    ree(C);

    free(y);system("pause");

    return 0;}

    Lexcution du programme nous donne le rsultat suivant :

    La valeur de 0.9600000000041672 correspond bien P20(2) qui en fait bien la valeur de 0.96

    dans le tableau

    Si nous souhaitons calculer une valeur intermdiaire de yi pour xi autre que celle du tableau, il

    suffit de remplacer la valeur choisi dans le code : soir la ligne

    value = P(2.0, x, C);

    Exemple : si x=0.5, alors le rsultat est P20(0.5) = 0.99747872, ce qui est proche de 1,valeur de y pour x=0.

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    57/82

    57/82

    CHAPITRE V

    Intgration numrique

    Mthodes tudies :

    Carrs, Trapzes,

    Simpson,

    Quadrature de Gauss-Legendre

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    58/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    59/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    60/82

    60/82

    Algorithme de la Mthode des Rectangles

    Donnes : f(x), a, bLuti lisateur dfini la prcision souhaite et donc N

    On dfinit un Tableau x[ ] de dimension NCalcul : h = (b-a)/NSomme = 0.0Pour i = 1 N{

    x[i ] = a + i*hSomme = Somme + f(x[i] + h/2)

    }SRectangles = h*Somme

    Afficher SRectangles

    Fin

    Exemple ;

    On souhaite calculer lintgrale de la fonction suivante :

    ()= Dans lintervalle : [0, 1]

    Le code C de la Mthode des Rectangles

    #include #include #include

    #define a 0.0 // Borne infrieure d'intgration#define b 1.0 // Borne suprieure d'intgration#define N 100 // Nombre de points

    double f(double x)

    { return exp(-x); // fonction intgrer}

    void main(){

    double *x;

    x = (double *)calloc(N, sizeof(double)); // Allocation dynamique des abscissesxi

    double Somme, I;

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    61/82

    61/82

    double h = (b-a)/N; // Pas d'intgration

    Somme = 0.0;for(int i=1;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    62/82

    62/82

    V.4.Mthode des Trapzes

    Le principe de cette mthode est analogue celui de l'intgration par une srie de rectangles.

    Dans cette mthode on cherche augmenter la prcision du calcul tout en vitant la

    dissymtrie qui apparat dans la dfinition de l'intgration par rectangles. Nous allons donc ici

    aussi tabuler en (n+1) points f0,f1,fndans l'intervalle d'intgration [x0,xn]. On va ensuiteinterpoler linairement (polynme d'ordre 1, c.a.d. une droite) pour approximer f(x) entre

    deux points tabuls. On va donc remplacer les arcs xi, xi+1par leurs cordes

    L'intgration va alors se faire en sommant l'aire des trapzes, soit

    si l'chantillonnage des points est rgulier, c.a.d. sixi+1 xi= halors l'intgrale s'exprimera

    en effet chaque trapze aura chacun de ces cts en commun avec les trapzes adjacents,

    l'exception du premier et du dernier qui n'ont qu'un ct en commun.

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    63/82

    63/82

    Algorithme de la Mthode des Trapzes

    Donnes : f(x), a, bLuti lisateur dfini la prcision souhaite et donc N

    On dfinit un Tableau x[ ] de dimension NCalcul : h = (b-a)/NSomme = 0.0Pour i = 1 N-1{

    x[i ] = a + i*hSomme = Somme + f(x[i] + h/2)

    }Finpour

    Somme = Somme + 0.5*( f(a) + f(b) )

    STrapzes = h*Somme

    Afficher STrapzes

    Fin

    Exemple ;

    On souhaite calculer lintgrale de la fonction suivante :

    ()= Dans lintervalle : [0, 1]Le code C de la Mthode des Trapzes

    #include #include #include

    #define a 0.0 // Borne infrieure d'intgration

    #define b 1.0 // Borne suprieure d'intgration#define N 100 // Nombre de points

    double f(double x){

    return exp(-x); // fonction intgrer}

    voidmain(){

    double *x;

    x = (double *)calloc(N, sizeof(double)); // Allocation dynamique des abscisses

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    64/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    65/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    66/82

    66/82

    i = i+1}Finpour

    Sommepaire = 0.0

    Pour i = 1 N-1{

    Si i paire alorsx[i ] = a + i*h

    Sommepaire = Sommepaire + f(x[ i])Sinon

    i = i+1}Finpour

    Somme = SommePaire + SommeImpaire

    STrapzes = (h/3)*( f(a) + f(b) + Somme)

    Afficher STrapzes

    Fin

    Le code C de la Mthode de Simpson

    // METHODE D'INTEGRATION : SIMPSON

    #include #include #include

    #define a 0.0 // Borne infrieure d'intgration#define b 1.0 // Borne suprieure d'intgration#define N 100 // Nombre de points

    double f(double x){

    return exp(-x); // fonction intgrer}

    void main(){

    double *x;

    x = (double *)calloc(N, sizeof(double)); // Allocation dynamique des abscissesxi

    double Somme_Paire, Somme_Impaire, I;

    double h = (b-a)/N; // Pas d'intgration

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    67/82

    67/82

    int i;

    Somme_Impaire = 0.0;for(int j=0; j

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    68/82

    68/82

    intgrer, on voit clairement lamlioration de la prcision de gauche droite dans le tableau

    ci-dessus.

    V.5. Mthode de Quadrature de Gauss-Legendre

    Le domaine d'intgration [a, b] doit tre chang (au moyen d'un changement de variable) en [-1, 1] avant d'appliquer les mthodes de quadrature de Gauss. Le changement se droule ainsi :

    L'approximation de la valeur de l'intgrale devient :

    o xi sont les racines du polynme de Legendre de degret o wi sont les poids de ces racines,

    Les premiers polynmes sont alors :

    ...

    Une excellente prcision est garantie ds que n>2. Des tables permettent d'obtenir les valeurs

    des points et leurs poids.

    Exemple pour n = 3, Abscisses et Poids

    mro Abscisse Poids

    1

    2

    3

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    69/82

    69/82

    Code C de la mthode de Gauss-Legendre : Intgration

    =

    #include

    #include

    #include

    #define EPS 3.0e-11

    // Cette fonction calcul les poids w et les Abscisses x

    void ploynomes_GaussLegendre(double x1,double x2,double *x,double

    *w,int n)

    { int m,j,i;

    double z1,z,xm,xl,pp,p3,p2,p1;

    m=(n+1)/2;

    xm=0.5*(x2+x1);

    xl=0.5*(x2-x1);

    for (i=1;i

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    70/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    71/82

    71/82

    Problme :On sait que le champ radiolectrique reu par un mobile GSM en zone urbaine suit une

    distribution log-normale lorsque la puissance reue est exprime en Watt. Comme la notion

    de dBm est plus largement utilise, cette mme puissance reu suit une distribution

    gaussienne (ou normale) quand elle est exprime en dBm. La densit de probabilit estdonne par lquation :

    ()= 12 ()

    Avec m la valeur mdiane (assurant 50% de probabilit) et lcart type

    Loprateur Mobilis, par exemple, souhaite savoir avec quelle probabilit de couverture un

    utilisateur de son rseau peut tre desservie avec un niveau de puissance radiolectrique

    suprieure x0 = -50 dBm et infrieur x1 = 0 dBm, sachant que la mdiane de cette

    puissance est de m= -75 dBm. Lcart type est de = 7 dB.

    Solution :On calcule la probabilit par la formule :

    ( > ) = () Le programme en C (hrit du code C ci-dessus) et simplement crit en changeant la fonction

    f(x) et les bornes dintgration. Les valeurs de m et sont des constantes que lon peut

    dclarer avant le main() comme tant des constantes globales. Et le tour est jou !

    // gausslegendre_GSM.cpp : dfinit le point d'entre pour l'application console.//#include "stdafx.h"#include #include #include

    #define EPS 3.0e-11

    #define S 7 // 7 dB cart type#define M1 -75.0 // -75 dBm de valeur mdiane#define PI 3.141592654#define N 100

    // Cette fonction calcul les poids w et les Abscisses xvoid ploynomes_GaussLegendre(double x1,double x2,double *x,double *w,int n){

    int m,j,i;double z1,z,xm,xl,pp,p3,p2,p1;

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    72/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    73/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    74/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    75/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    76/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    77/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    78/82

    78/82

    Lalgorithme de Runge Kutta dordre 4 est donn par les quations suivantes

    Limplmentation de lexemple prcdent (voir Euler) par la mthode de Runge Kutta en C++

    est donne ci-dessous

    Code C++ :RUNGE-KUTTA4.CPP

    #include "stdafx.h"#include #include #include #include

    using namespace std;

    #define h 0.1 // pas h#define N 20 // nombre de points

    double f(double x,double y) // la fonction f(x,y){

    return 1.3*exp(-x) - 2*y;}

    int _tmain(int argc, _TCHAR* argv[]){

    double *x,*y; // tableau xn et yndouble k1,k2,k3,k4; // Les 4 variables de Runge-Kutta

    x = (double *)calloc(N,sizeof(double));y = (double *)calloc(N,sizeof(double));

    y[0]=5;

    for(int n=0;n

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    79/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    80/82

    80/82

    Exercice 3

    On se propose de rsoudre un problme classique en physique nuclaire. On considre

    lquation de dsintgration dun noyau donne par :

    dNdt

    = NAvec comme condition initiale N(0)=N0

    Pour utiliser la mthode Runge-Kutta, il suffit de poser f(x,y)= -y avec la condition initialey(0)=N0

    La solution est donne par le code C++ ci-dessous

    #include "stdafx.h"

    #include #include #include #include

    using namespace std;

    #define h 0.5 // le pas h#define N 30 // nombre de points#define N0 10 // nombre de noyaux t=0#define lambda 0.5

    double f(double x,double y) // la fonction f(x,y){

    return -lambda*y; // la fonction f(x,y) = - lambnda*y}

    int _tmain(int argc, _TCHAR* argv[]){

    double *x,*y; // tableau xn et yndouble k1,k2,k3,k4; // Les 4 variables de Runge-Kutta

    x = (double *)calloc(N,sizeof(double));y = (double *)calloc(N,sizeof(double));

    y[0]=N0;

    for(int n=0;n

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    81/82

  • 8/3/2019 Methodes de Calculs Numeriques Resolues en Langage c - Dr. Hatem Mokhtari

    82/82