IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Intégrale par la méthode des rectangles


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1
    Par défaut Intégrale par la méthode des rectangles
    Bonjour, excusez-moi de vous déranger mais j'ai un gros soucis ! je suis actuellement en master et mon master comporte de l'informatique or je n'en ai jamais fait et me retrouve avec des étudiants en ayant fait depuis 3 ans. Le prof ne prend donc pas le temps de m'expliquer le fonctionnement de ce langage et j'avoue que je galère pas mal...
    J'essaye de lire des livres ou d'aller sur des sites comme celui ci pour essayer d'apprendre un tel langage mais ce n'est pas facile...
    J'en viens au but. voici un programme que mon professeur nous a donné qui est pour calculer l'intégrale exp x entre 2 bornes a et b en prenant un pas h (méthode des rectangles si je ne m'abuse) bref voila ce qu'il nous a donné comme code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define MAXN 1000
     
    double rect(double * , double *, long);
     
    int main(){ 
     
      long i , N ;
      double a, b, h, A, Ath, Er;
      double X[MAXN], Y[MAXN];
     
      printf("\n entrer a ? ")   ; scanf("%lf",&a);
      printf("\n entrer b ? ")   ; scanf("%lf",&b);
      printf("\n entrer h ? ")   ; scanf("%lf",&h);
     
      Ath= exp (b)-exp(a);
     
      N=1L+(long)(  (b-a)/h );
      if (N>=MAXN) {
              printf("  attention dépassement  " );
              return (1);
      }
     
      for (i=0  ;  i<=N-1  ; i++  ) {X [i] = a+i*h ; Y[i]=exp(X[i]) ; }
      A=rect (X , Y , N);
      Er=100.0*fabs(   (A-Ath)/Ath ) ;
     
      printf ("\n aire théorique =%lf\n" , Ath) ;
      printf ("\n aire calculée =%lf\n" , A) ;
      printf ("\n erreur relative =%lf\n" , Er) ;
     
      return(0);
    }
     
    double rect ( double *X  , double *Y, long N){
      long i; 
      double h, aire, somme;
     
     
      h=X[1]-X[0];
      somme=0;
      for(i=0 ; i<=N-2 ; i++ ) somme+=Y[i];
      aire =h*somme;
      return(aire);
    }

    mon problème est le suivant : je ne comprends pas grand chose a ce code ...
    les 4 premières lignes sont les préprocesseurs puis la 5éme je ne la comprends pas ...Pourquoi des * ? pourquoi cette ligne n'est pas au début du main avec les autres déclarations ?
    Je ne comprends pas cette ligne aussi :
    et celle la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Er=100.0*fabs(   (A-Ath)/Ath

    Pouvez vous m'aider ? D'avance merci
    Cordialement

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    ça va être très difficile pour toi si tu n'as jamais fait du C ,surtout que ce n'est pas le langage le plus facile.

    Pour tes questions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double rect(double * , double *, long);
    c'est tout simplement la déclaration de la fonction rect , en gros dans ton main tu appelle la fonction rect , mais ton compilateur ne connais pas rect et ces arguments donc pour évité les warning/erreur (ça dépend de comment est réglé ton compilo) en déclare rect avant.
    C'est pareil pour nous ,si on lis le code de haut en bas après tout d'un coup je met 'rect()' tu te dira c'est quoi rect ? .

    J'imagine que tu as compris opération , (long) signifie qu'on convertie le résultat en type long (vu que b,a et h sont du type double), 1L signifie que 1 c'est une constante de type long.
    Donc le calcul est bel et bien 1 + (b-a)/h , mais qu'on convertie en long (donc en entier relatif).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Er=100.0*fabs(   (A-Ath)/Ath );
    J'imagine que c'est fabs que tu ne comprends pas donc c'est une fonction qui renvoie la valeur absolue.
    le calcul est donc 100* | (A -Ath)/Ath |.
    Je précise au cas ou mais on C si on écrit 100.0 c'est que c'est un type double , si on écrit seulement 100 c'est du type int.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Je ne sais pas si le code est un copié-collé du fichier du prof ou si tu l'as retapé. Si c'est le cas 1, c'est triste... Je trouve ce code assez mal présenté et surtout, il ne contient aucun commentaire et les noms des variables ne sont absolument pas parlant ce qui fait qu'on ne peut pas le comprendre simplement.

    Pourquoi des * ? pourquoi cette ligne n'est pas au début du main avec les autres déclarations ?
    Parce que cette déclaration et celles au début du main() sont très différentes. Dans le main, tu déclares des variables que tu vas pouvoir utiliser "tout de suite". Avant le main, c'est comme la bien expliqué Kannagi une déclaration de fonction. Elle sert juste au compilateur (qui lit le fichier du début vers la fin sans de revenir en arrière) de savoir qu'il existe quelque part une fonction nommée rect() et de savoir quels sont ces paramètres et son type de retour.

    Les étoiles indiquent que les paramètres sont des pointeurs (ici, des pointeurs le premier élément d'une zone mémoire "façon tableau"). Note que lors d'une déclaration sans définition, tu peux omettre les noms des paramètres.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 442
    Par défaut
    Bonjour et bienvenue,

    Citation Envoyé par lnkjv Voir le message
    Bonjour, excusez-moi de vous déranger mais j'ai un gros soucis ! je suis actuellement en master et mon master comporte de l'informatique or je n'en ai jamais fait et me retrouve avec des étudiants en ayant fait depuis 3 ans. Le prof ne prend donc pas le temps de m'expliquer le fonctionnement de ce langage et j'avoue que je galère pas mal...
    Effectivement, comme dit plus haut, ce n'est pas le langage le plus facile, encore moins pour commencer. Cependant, il est très répandu, parce qu'il est déjà ancien et surtout parce qu'il reste très proche de la machine.

    Par conséquent, il faut que tu gardes à l'esprit qu'un programme C mélange très souvent des considérations purement algorithmiques et des contraintes techniques au sein de ses formules. Par exemple, les types des nombres : mathématiquement, l'équation est correcte mais il faut quand même prendre en compte le format des variables qui peut représenter une gamme finie de nombres. Dans certains cas, il te sera peut-être nécessaire de convertir le résultat vers un format plus large pour pouvoir le conserver sans perte.

    mon problème est le suivant : je ne comprends pas grand chose a ce code ...
    les 4 premières lignes sont les préprocesseurs puis la 5éme je ne la comprends pas ...Pourquoi des * ?
    Ce sont les fameux pointeurs que redoutent tant les étudiants, mais qui deviennent évidents quand on sait comment un ordinateur fonctionne en coulisses. Les pointeurs sont les adresses en mémoire des objets que l'on référence.

    En gros, tu ne vas pas passer à ta fonction les données elles-mêmes mais, à la place, l'endroit où elles se trouvent en mémoire, pour qu'elle puisse directement travailler dessus.

    C'est utile à pratiquement tous les niveaux mais, dans ton cas, on les utilise d'une part parce qu'on ne peut pas passer le contenu d'un tableau directement en argument de fonction (et heureusement parce qu'ils peuvent être très gros) et, d'autre part, parce qu'en modifiant sur place des données déjà existantes, ça permet aux fonctions appelantes de profiter directement du résultat sans avoir à le récupérer et à mettre à jour leur propre tableau local.

    pourquoi cette ligne n'est pas au début du main avec les autres déclarations ?
    Je ne comprends pas cette ligne aussi :
    Kannagi t'a donné la bonne réponse.

    Sache simplement que lorsque tu vois des parenthèses en langage C, elles suivent la plupart du temps les mêmes lois que l'algèbre ordinaire sur papier (ou les déclarations de fonctions). Il existe au moins une exception : le transtypage (ou cast) : lorsqu'une paire de parenthèses ne contient qu'un nom de type (aussi compliqué soit-il), elles servent de préfixe à l'expression qui suit et convertissent la valeur de l'expression vers le type en question.

    Tu peux également utiliser des suffixes aux nombres constants. « L » permet effectivement d'indiquer directement qu'il s'agit d'un type long. Enfin, le fait d'écrire « 1.0 » plutôt que « 1 » est une astuce qui permet au programmeur, en précisant au moins une décimale, qu'il s'agit d'un nombre réel à virgule flottante plutôt que d'un entier.

    Des considérations techniques, donc.

    et celle la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Er=100.0*fabs(   (A-Ath)/Ath
    Là encore, tu as obtenu la réponse sur le fond. Sache seulement que dans ce cas précis, « f » signifie « float » (pour « virgule flottante ») et que c'est un préfixe qui a été donné aux noms de toutes les fonctions de la bibliothèque qui les propose. C'est nécessaire car les noms de fonctions habituelles comme « abs() » sont déjà utilisés pour les implémenter avec le type int, et parce que le C ne propose pas la surcharge de fonctions (i.e. la définition de deux fonctions différentes portant le même nom mais étant différentiées par les arguments qu'on leur passe).

Discussions similaires

  1. double intégrale par la méthode des trapèzes
    Par sergy01 dans le forum MATLAB
    Réponses: 28
    Dernier message: 26/06/2012, 17h05
  2. Sécurite CSRF par la "méthode des tickets"
    Par lebonvieuxnovice dans le forum Langage
    Réponses: 4
    Dernier message: 09/09/2009, 00h16
  3. Calcul d'une intégrale double par la méthode des quadratures
    Par deubelte dans le forum Mathématiques
    Réponses: 5
    Dernier message: 10/05/2009, 12h40
  4. Equation du cercle par la méthode des moindres carrés
    Par olivier21c dans le forum MATLAB
    Réponses: 1
    Dernier message: 29/03/2009, 20h10
  5. Calcul d'intégrale par la méthode de Monte Carlo
    Par physicslover dans le forum Fortran
    Réponses: 5
    Dernier message: 29/01/2009, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo