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

Caml Discussion :

Racines complexes d'un polynôme.


Sujet :

Caml

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Racines complexes d'un polynôme.
    Bonjour à tous ^^
    Je dois réaliser une fonction "racines" qui rend les racines réelles et complexes d'un polynôme du second degré.
    J'ai déjà une fonction "racines_réelles" qui calcule les racines réelles que je voudrais modifier pour qu'elle gère aussi les racines complexes.

    Voilà un exemple de réponse attendue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # racines (1.,2.,3.) ;;
    les deux racines de x²+2x+3 = 0 sont -1.0 + i * 1.41421356237 et -1.0 - i * 1.41421356237
    Voilà ma fonction racines_réelles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let racines_reelles = function (a,b,c) ->
    (* "racines_reeles" calcule les racines réelles,lorsqu'elles existent, d'une équation du second degré. *)	
      let d = (b*.b-.4.*.a*.c) in
        if a = 0. then failwith "racines reelles : a = 0"
          else if d = 0. then (-.b/.(2./.a),-.b/.(2.*.a))
    	else if d > 0. then ((-.b-.(sqrt(d)))/.(2.*.a),(-.b+.(sqrt(d)))/.(2.*.a))
    	  else failwith "il n'existe pas de racines reelles pour cette equation"
    ;;
    Mon problème pour l'instant c'est que je n'arrive pas à intégrer i dans la réponse lorsque le discriminant est négatif.
    J'ai essayé avec la concaténation et int_of_char sans succès.
    Quelqu'un a une piste?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Ta question est étrange. C'est un problème avec les maths, ou avec l'entrée/sortie OCaml ?

    Voici une routine qui affiche un nombre complexe sous forme textuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let print_complex (x, y) =
      print_float x; print_string " + i * "; print_float y
    (on peut aussi utiliser Printf, mais alors c'est différent sous OCaml et Caml Light, et comme je ne sais pas quelle variante tu utilises...)

  3. #3
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour !

    Citation Envoyé par n-c-d
    Mon problème pour l'instant c'est que je n'arrive pas à intégrer i dans la réponse lorsque le discriminant est négatif.
    De deux choses l'une : soit tu veux afficher la solution et dans ce cas il suffit d'effectuer une conversion en chaîne, comme te l'indique bluestorm, soit tu veux pouvoir travailler avec ces racines ultérieurement, et dans ce cas, si tu utilises OCaml, tu peux mettre à profit le module Complex. Illustration (il a peut-être des erreurs dans les formules pour le cas complexe; la terminale, ça commence à faire longtemps...) :

    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
     
    type racines = 
      | Float of float list 
      | Complex of Complex.t list
     
    let racines a b c =
      if a <> 0. then (
        let d = b *. b -. 4. *. a *. c and denom = 2. *. a in
        if d > 0. then (
          let sqrt_d = sqrt d in
          Float [(-.b -. sqrt_d) /. denom; (-.b +. sqrt_d) /. denom]
        ) else if d < 0. then (
          Complex [
            {Complex.re = -.b /. denom; im = sqrt (-.d) /. denom};
            {Complex.re = -.b /. denom; im = -. sqrt (-.d) /. denom}]
        ) else Float [-.b /. denom]    
      ) else Float [-.c /. b]
    Cordialement,
    Cacophrène

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Cacophrène :
    - je ne vois pas l'intérêt de séparer les racines complexes et les racines réelles : il est facile de vérifier après coup si la partie imaginaire d'une racine est nulle, et ça simplifie nettement l'algorithme de résolution (il suffit de traiter le cas complexe)
    - pour un débutant, utiliser un couple de flottants est au moins aussi clair que le module Complex, qui est nettement plus lourd syntaxiquement (il a l'avantage côté performance, mais dans notre cas on n'en a rien à cirer)

  5. #5
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour !

    Citation Envoyé par bluestorm
    je ne vois pas l'intérêt de séparer les racines complexes et les racines réelles : il est facile de vérifier après coup si la partie imaginaire d'une racine est nulle, et ça simplifie nettement l'algorithme de résolution (il suffit de traiter le cas complexe)
    Comme beaucoup d'autres personnes, j'ai appris à résoudre les équations du second degré en classe de première. On nous disait alors que si le discriminant est nul, il n'y a pas de solution réelle (sans plus de détails). Les solutions complexes ne sont venues que plus tard, en classe de terminale. Je trouve donc assez peu intuitif de les regrouper parce qu'un réel est un complexe avec une partie imaginaire nulle. D'ailleurs l'article de Wikipédia conserve cette séparation.

    Citation Envoyé par bluestorm
    pour un débutant, utiliser un couple de flottants est au moins aussi clair que le module Complex, qui est nettement plus lourd syntaxiquement
    Moui... Utiliser re et im pour partie réelle / partie imaginaire, c'est assez explicite quand même... Sans oublier un intérêt non négligeable : s'il veut faire des calculs sur les racines complexes, il aura des fonctions prêtes à l'emploi !

    Cordialement,
    Cacophrène

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Racines complexes d'un polynôme.
    Bonsoir,
    Merci pour vos réponses qui m'ont aidé.
    En fait j'ai réussi en rectifiant ma fonction, j'avais juste des erreurs de type et de syntaxe.. ^^
    J'ai intégré le "+- i * ..", comme conseillé avec float_of_string(" + i * ").
    Merci encore pour votre aide

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    ??

    (float_of_string "+ i * ") n'est certainement pas correct.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/05/2013, 16h23
  2. [TPW] ZCircle : Algorithme de recherche du zéro (racines complexes)
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 04/12/2011, 12h06
  3. [TPW] Comptage de racines complexes
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 04/12/2011, 11h54
  4. Racine réelle d'un polynôme de 3e degré
    Par bigben11 dans le forum MATLAB
    Réponses: 16
    Dernier message: 31/03/2009, 06h45
  5. Racines d'un polynôme du 5ème degré
    Par spithi dans le forum Pascal
    Réponses: 2
    Dernier message: 05/12/2006, 20h11

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