< Mathc gnuplot

Préambule

Quelques fonctions C à connaitre :

f_p=fopen("a.txt","w"); //(write)  Créer un fichier en écriture.
f_p=fopen("a.txt","r"); //(read)   0uvrir un fichier en lecture.
f_p=fopen("a.txt","a"); //(append) 0uvrir un fichier en écriture. 
                        //         Rajouter le texte en fin de fichier.

 printf(    "%d",i);    // Imprimer sur l'écran.
fprintf(f_p,"%d",i);    // Imprimer dans le fichier *f_p
sprintf(  s,"%d",i);    // Imprimer dans la chaine de caractères s.


Éviter les lettres accentuées dans les fichiers sources (*.c,*.h), cela pose des problèmes pour échanger les fichiers entre Windows et Linux ou à l'international.


Premiers fichiers

Un fichier list.txt

  1. Copiez cet exemple dans votre éditeur.
  2. Sauvez-le sous le nom "c01.c"
  3. Compilez et exécutez-le.
    gcc -lm c01.c -o c01.exe ;./c01.exe
  4. Éditer le fichier "list.txt"
c01.c
Un fichier list.txt
/* ------------------------------ */
/* Save as c01.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(pow(x,2.));}
/* ------------------------------ */
int main(void)
{
FILE   *fp;                   /*Déclarer un pointeur de fichier.   */
double   a;
                              /*Ouvrir le fichier en mode écriture.*/
 fp = fopen("list.txt","w");  /*fp est un pointeur de fichier      */
                              /*qui pointe sur "list.txt"          */
 for(a = -5.0; a <= 5.0; a++)
  fprintf(fp," %6.3f %6.3f\n",/*Imprimer dans le fichier           */
                a,   f(a));
 fclose(fp);                  /*Fermer le fichier                  */

 printf("\n\n Ouvrir le fichier list.txt "
        "\n\n Press return to continue.  ");
 getchar();
 return 0;}

Un fichier de données pour gnuplot

Nous ne mettrons pas d'extension pour les fichiers de données avec gnuplot.

  1. Compilez et exécutez-ce fichier.
  2. Éditez le fichier "data"
  3. Dans gnuplot tapez : plot "data"
c02.c
Un fichier de données pour gnuplot
/* ------------------------------ */
/* Save as c02.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(pow(x,2.));}
/* ------------------------------ */
int main(void)
{
FILE *fp = fopen("data","w");
double a = -5.0;

  for(; a <= 5.0; a+=.2)
     fprintf(fp," %6.3f   %6.3f\n",a,f(a));
  fclose(fp);

 printf(" Dans gnuplot -> plot \"data\" \n\n"
        " Press return to continue.     \n\n");
 getchar();

 return 0;
}


Un fichier de commande pour gnuplot

L'extension des fichiers de commande de gnuplot est "*.plt" Ici on dessine deux chaines de caractères.

  1. Compilez et exécutez-ce fichier.
  2. Éditez le fichier "a_main.plt"
  3. Dans gnuplot tapez : load "a_main.plt"
c03.c
Un fichier de commande pour gnuplot
/* ------------------------------ */
/* Save as c03.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
char  heq[] = "sin(x)";
char  geq[] = "cos(x)";
/* ------------------------------ */
int main(void)
{
FILE   *fp = fopen("a_main.plt","w");

fprintf(fp,"# Fichier de commande pour gnuplot          \n"
           "# En ligne de commande : load \"a_main.plt\"\n"
           "#\n"
           " set zeroaxis\n"
           " plot %s,\\\n"
           " %s \n\n"
           " reset", geq, heq);
 fclose(fp);

 printf("\n\n load \"a_main.plt\" with gnuplot."
        "\n\n Press return to continue.        ");
 getchar();

 return 0;
}

Cela donne dans le fichier "a_main.plt" :

 # Fichier de commande pour gnuplot          
 # En ligne de commande : load "a_main.plt"
 #
  set zeroaxis
  plot cos(x),\
  sin(x) 
  reset

On peut remarquer que chaque fonction est sur une ligne différente. Important si l'on veut dessiner quatre ou cinq fonctions.


Dessiner une liste et une chaîne de caractères

On associe les deux méthodes vues précédemment.

  1. Compilez et exécutez-ce fichier.
  2. Éditez le fichier "a_main.plt"
  3. Dans gnuplot tapez : load "a_main.plt"
c04.c
Dessiner une liste et une chaîne de caractères
/* ------------------------------ */
/* Save as c04.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(cos(x));}
/* ------------------------------ */
char   feq[] =           "cos(x)";
/* ------------------------------ */
int main(void)
{
FILE *fp;
double a = -5.0;

   fp = fopen("data","w");
   for(; a <= 5.0; a+=.2)
        fprintf(fp," %6.3f   %6.3f\n",   a, f(a));
   fclose(fp);

   fp = fopen("a_main.plt","w");
   fprintf(fp,"# Fichier de commande pour gnuplot          \n"
              "# En ligne de commande : load \"a_main.plt\"\n"
              "#\n"
              " set zeroaxis\n"
              " plot \"data\",\\\n"
              " %s\n"
              " reset",feq);
   fclose(fp);

 printf("\n\n load \"a_main.plt\" with gnuplot."
        "\n\n Press return to continue.        ");
 getchar();

 return 0;
}

Cela donne dans le fichier "a_main.plt" :

 # Fichier de commande pour gnuplot          
 # En ligne de commande : load "a_main.plt"
 #
 set zeroaxis
 plot "data",\
 cos(x)
 reset


Une fonction graphique

On met simplement le contenu de la fonction main() dans G_plot().

  1. Compilez et exécutez-ce fichier..
  2. Éditez le fichier "a_main.plt"
  3. Dans gnuplot tapez : load "a_main.plt"
c05.c
Une fonction graphique
//* ------------------------------ */
/* Save as c05.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(cos(x));}
char   feq[] = "cos(x)";
/* ------------------------------ */
int G_plot(void)
{
FILE *fp;
double a = -5.0;

   fp = fopen("data","w");
   for(; a <= 5.0; a+=.2)
        fprintf(fp," %6.3f   %6.3f\n",a,f(a));
  fclose(fp);

  fp = fopen("a_main.plt","w");
   fprintf(fp,"# Fichier de commande pour gnuplot          \n"
              "# En ligne de commande : load \"a_main.plt\"\n"
              "#\n"
              " set zeroaxis\n"
              " plot \"data\",\\\n"
              " %s\n"
              " reset",feq);
  fclose(fp);

return 0;
}
/* ------------------------------ */
int main(void)
{
 G_plot();

 printf("\n\n load \"a_main.plt\" with gnuplot."
        "\n\n Press return to continue.        ");
 getchar();

 return 0;
}

Cela donne dans le fichier "a_main.plt" :

 # Fichier de commande pour gnuplot          
 # En ligne de commande : load "a_main.plt"
 #
 set zeroaxis
 plot "data",\
 cos(x)
 reset


Les ennuis commencent

À partir des fichiers précédents, essayer de dessiner la fonction g, sans modifier G_plot() ?

/* ------------------------------ */
double g(double x){return(sin(x));}
char   geq[] = "sin(x)";
/* ------------------------------ */

Une solution va être proposée dans le chapitre suivant : Pointeurs de fonctions.

Conclusion

Nous avons dessiné des fonctions sous forme de chaînes de caractères et sous la forme de liste de points.

Un problème est apparu : rendre les fonctions graphiques indépendantes de la fonction utilisée.

Cet article est issu de Wikibooks. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.