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 :

Utilisation des nombres complexes en C


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Utilisation des nombres complexes en C
    Bonjour,

    Je suis tout débutant en programmation, et pour un TP, je dois écrire un programme qui puisse résoudre les équations du second degré à solutions réelles ou complexes. Je n'ai eu aucun problème dans les cas où le discriminant est positif ou nul, puisqu'on utilise que des nombres réels, mais les solutions complexes me posent problème.

    En gros l'algorithme que je dois transcrire ressemble à ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delta<0
    delta= -delta*i
    trouver les racines complexes de delta
    x1= (-b-sqrt(delta))/(2*a)
    x1= (-b+sqrt(delta))/(2*a)
    Mais je ne sais pas comment introduire des nombres complexes dans mon programme, et mes professeurs ne nous ont donné aucun cours là-dessus.

    J'ai cru comprendre qu'il fallait inclure la lib <complex.h>, mais je ne sais pas quoi faire ensuite. Le programme va-t-il reconnaitre automatiquement que je parle d'un complexe si je tape quelquechose du genre 4+3*i ?? (ca m'étonnerait beaucoup, mais ca m'arrangerait bien )

    J'ai aussi vu sur internet que je pourrais utiliser des structures avec quelquechose qui ressemblerait à ca, mais je n'ai pas vu ca en cours, ni même le principe des fonctions (que j'ai vaguement compris seule, mais que je ne maitrise pas bien du tout) :
    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
    #include <stdio.h>
    struct Complex
    {
    float r; /*real part*/
    float i; /*imag part*/
    };
    struct Complex C_add (struct Complex a, struct Complex b)
    {
    struct Complex result;
    result.r = a.r + b.r;
    result.i = a.i + b.i;
    return(result);
    }
    main()
    {
    struct Complex z1, z2, z3;
    z1.r = 0.0; z1.i = 0.5;
    z2.r = 0.0; z2.i = 3;
    z3 = C_add (z1, z2);
    printf (" la valeur z3 est %f + %f i\n",z3.r, z3.i);
    }
    Pourriez-vous m'expliquer comment utiliser de manière simple les complexes afin de pouvoir résoudre mon exercice?
    Merci d'avance!

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par toupitoui
    J'ai cru comprendre qu'il fallait inclure la lib <complex.h>, mais je ne sais pas quoi faire ensuite. Le programme va-t-il reconnaitre automatiquement que je parle d'un complexe si je tape quelquechose du genre 4+3*i ?? (ca m'étonnerait beaucoup, mais ca m'arrangerait bien )
    Rq: complexe.h est un header (i.e. qui définit des variables, macros, fonctions) qui te permet d'accéder à la librairie.

    Si tu as cru comprendre qu'il fallait l'utiliser c'est qu'elle doit exister. J'ai trouvé complex.h faisant partie de la Librairie Standard (C99) donc man peut t'aider:
    (http://www.linuxinfor.com/french/man5/complex.html)
    Citation Envoyé par man complex
    NOM
    complex - Base des mathématiques complexes.
    SYNOPSIS
    #include <complex.h>
    DESCRIPTION
    Les nombres complexes sont des nombres de la forme a+i*b, où a et b sont des réels et i est la racine carrée de -1, ainsi i*i=-1.
    Il y a d'autres manières de représenter ce nombre. Comme le point z=(a,b) est sur un plan, vous pouvez aussi décrire ce point avec une distance et un angle (r, phi). Le nombre z=r*(cos(phi)+i*sin(phi)) peut aussi être écrit sous forme exponentielle z=r*exp(i*phi) comme l'a montré Euler.

    Les opérations de base définies pour z = a+i*b et w = c+i*d ainsi :

    addition: z+w = (a+c) + (b+d)*i
    multiplication: z*w = (a*c - b*d) + (a*d + b*c)*i
    division: z/w = ((a*c + b*d)/(c*c + d*d)) + ((b*c - a*d)/(c*c + d*d))*i

    Presque toutes les fonctions mathématiques ont un équivalent sous forme de fonctions complexes.
    EXEMPLE
    Le compilateur C peut travailler avec les nombres complexes s'il supporte le C99. Il faut faire l'édition des liens avec -lm. L'unité imaginaire pure est représentée par I.

    /* vérifions que (i*pi) == -1 */
    #include <math.h> /* pour atan */
    #include <complex.h>
    int main()
    {
    double pi = 4*atan(1);
    complex z = cexp(I*pi);
    printf("%f+%f*i\n", creal(z), cimag(z));
    return (0);
    }


    VOIR AUSSI
    cabs(3), carg(3), cexp(3), cimag(3), creal(3)
    TRADUCTION
    Christophe Blaess, 2003.
    Rq: il te faut un compilo qui gère le C99.


    Mais en relisant ton post, je me demande si tu as saisi ce qu'était un complexe ? Parce que tes "solutions" sont fausses:
    http://fr.wikipedia.org/wiki/%C3%89q...ond_degr%C3%A9

    Tout dépend de ce que tu dois faire de ces nombres, si c'est juste les afficher, alors tu peux afficher la partie réelle et la partie imaginaire (avec juste un i devant ). Par contre si tu dois faire des calculs (bon, ça m'étonnerait si tes profs ne t'en on pas parlé), il faut effectivement que tu "définisse" les opérations Classiques dans C (corps des complexes).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    sauf erreur, la solution si delta<0 est simplement : -b +/- iracine(-delta)/2a. Pas besoin d'utiliser complex.h pour ça, juste un if sur le delta...

    Hugo

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par [Hugo]
    sauf erreur, la solution si delta<0 est simplement : -b +/- iracine(-delta)/2a. Pas besoin d'utiliser complex.h pour ça, juste un if sur le delta...

    Hugo
    Oui. Sauf que prendre la racine d'un nombre négatif est impossible.
    Donc si delta est est un réel négatif, on peut dire qu'il est égal à sa valeur absolue multipliée par i², qui vaut -1. Cette technique ne pose pas de problème lorsque les coefficients a,b,c de l'équation ax²+bx+c=0 sont tous trois réels. Ce qui n'est pas forcément le cas dans mon exercice

    Citation Envoyé par D[r]eadLock
    Tout dépend de ce que tu dois faire de ces nombres, si c'est juste les afficher, alors tu peux afficher la partie réelle et la partie imaginaire (avec juste un i devant ). Par contre si tu dois faire des calculs (bon, ça m'étonnerait si tes profs ne t'en on pas parlé), il faut effectivement que tu "définisse" les opérations Classiques dans C (corps des complexes).
    Le principe de fonctionnement de mes profs étant de nous faire chercher par nous-mêmes sans avoir le cours, pour ensuite nous donner une correction. Donc je n'ai strictement aucun support de cours, à part la syntaxe de base d'un programme en C.

    Et j'ai beau être extrêmement débutante en programmation et en algo, je sais depuis quelques années ce que sont les complexes et la résolution des équations du second degré.

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par toupitoui
    Oui. Sauf que prendre la racine d'un nombre négatif est impossible.
    Si delta est négatif, -delta est... positif, donc sa racine carrée est réelle.

    Citation Envoyé par toupitoui
    Cette technique ne pose pas de problème lorsque les coefficients a,b,c de l'équation ax²+bx+c=0 sont tous trois réels. Ce qui n'est pas forcément le cas dans mon exercice
    À mon avis si, i.e. coéfficients réels, mais solutions complexes.
    Sinon, il te faut effectivement avoir les opérations complexes (addition, multiplication...). Cf. http://fr.wikipedia.org/wiki/%C3%89q...ents_complexes
    Dans ce cas, une solution, est de représenter un nombre complexe comme un struct avec deux réels et définir les fonctions nécessaires (comme dans le code que tu as donné). Pour la multiplication, (a+ib) * (c+id) = a*c - b*d + i (b*c + a*d), où a,b,c et d sont réels, et les opérateurs sont de R dans R.
    Une autre, est d'utiliser complex.h et afficher a la fin les parties réelles et imaginaire (je suppose que les opérations doivent marcher):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <complex.h>
     
    int main(void)
    {
        complex x=3+I*2;
        complex y=2+I*4;
        complex z=x*y+2*y;
        printf("z = %f+i%f\n",creal(z),cimag(z));
        return 0;
    }

Discussions similaires

  1. Gestion des Nombres complexes
    Par Lalanne dans le forum C++
    Réponses: 6
    Dernier message: 16/09/2009, 10h52
  2. Ma fonction me retourne des nombres complexes!
    Par FouadSami dans le forum MATLAB
    Réponses: 1
    Dernier message: 09/04/2009, 18h47
  3. Utiliser des nombres avec pygtk
    Par Patrick vivien dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 14/08/2008, 15h29
  4. utilisation des nombres complexes (C#)
    Par Bouyou1983 dans le forum C#
    Réponses: 2
    Dernier message: 22/04/2008, 19h18
  5. Utilisation des nombres dans Winsock2
    Par DeusXL dans le forum MFC
    Réponses: 14
    Dernier message: 01/12/2004, 17h36

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