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 :

Calcul des racines nième d'un nombre complexe donné


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 27
    Points
    27
    Par défaut Calcul des racines nième d'un nombre complexe donné
    Bonsoir,

    Suite à la perte des messages du forum, je repose ma question.

    Voici d'abord le code de mon programme, dont le but est de calculer les racines nième d'un nombre complexe donné.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
     
     
    #include <iostream>
    #include <math.h>
     
    using namespace std;
     
    int main()
    {
     
     
        long choix = 0;
        double thf = 0;
        long racine = 0;
        while(choix==0)
        {
     
            system("cls");
     
            cout << "Welcome to the complex roots calculating program\n\n" << endl; // INTRODUCTION
     
            cout << "A complex is a number such as a+ib, where a is the real part, and b the imaginary part.\n\n" << endl;
     
            cout << "-----------------------------------------------------------------------------------------\n\n" << endl;
     
            cout << "!! WARNING : SOLUTIONS ARE GIVEN IN RADIANS !! \n\n" << endl;
     
            long i = -1;
     
            double a = 0;
     
            cout << "a=" << endl; // On demande a, la partie réelle du complexe
     
            cin >> a;
     
            double b = 0;
     
            cout << "b=" << endl; // On demande b, la partie imaginaire du complexe
     
            cin >> b;
     
            if(b<0) // Afichage du complexe selon le signe de la partie imaginaire
            {
                cout << "The complex number you introduced is : " << a << b << "i" << endl;
            }
            else
            {
                cout << "The complex number you introduced is : " << a << "+" << b << "i" << endl;
            }
            cout << "\n\n" << endl;
     
            cout << "Which root of this complex do you want to compute (integer) ?" << endl; // On demande à l'user quelle racine il veut calculer du complexe ; cette dernière sera stockée dans racine
     
            cin >> racine;
     
            cout << "Computing ..." << endl;
     
            cout << "Calculating tan of theta..." << endl; // Calcul de la tangente de théta, essentielle pour déterminer la forme trigonométrique du complexe
     
            double th = 0;
     
            double tgth = 0;
     
            double PI = 3.14159265358979323846;
     
            if(a==0) // Cas où z = i (car a=0 et b=1)
            {
                th = PI/2;
            }
     
            else // Cas où z est différent de i
            {
                tgth = (b/a); // Calcul de la tangente de théta
                th = atan(tgth); // Calcul de théta (en radians)
            }
     
            cout << tgth << endl;
     
            cout << "Calculating theta..." << endl; // Calcul de la tangente de théta, essentielle pour déterminer la forme trigonométrique du complexe
     
            cout << th << endl;
     
            cout << "Calculating ro ... " << endl;
     
            double ro = 0;
     
            ro=sqrt(pow(a, 2)+pow(b, 2)); // Calcul de rô (fonctionnel, non arrondi.)
     
            cout << ro << endl;
     
            cout << "\n" << endl;
     
            cout << "Computing trigonometrical forms ... \n" << endl;
     
            double r = 0;
     
            cout << "z=[" << ro << "].[cos(" << th << "+2k.pi)+i.sin(" << th << "+2k.pi)]" << endl; // Propriété d'un complexe sous sa forme trigonométrique (le complexe z est le complexe dont on veut calculer la racine nième, n étant donné par l'user)
     
            cout << "Z^" << racine << "= [r^" << racine << "].[cos(" << racine << ".beta)" << "+i.sin(" << racine << ".beta)]" << endl; // Le complexe Z est le complexe qui va nous permettre de calculer la racine nième -n étant donné par l'user- du complexe z
     
            cout << "Egalizing real parts ...\n" << endl;
     
            cout << "Calculating r..." << endl;
     
            r=pow(ro, pow(racine, (-1))); // Calcul de r : r^racine = ro ; du coup, r = racine racinième de ro, donc ro^(1/racine)
     
            cout << r << endl;
     
            cout << "Egalizing imaginary parts ... \n" << endl;
     
            cout << "Calculating beta..." << endl;
     
            double bt1 = 0;
     
            bt1=(th)/(racine); // Calcul de béta : béta est en deux parties : la 1ère (bt1), est calculée en divisant théta (th) par la racine, puisque racine.beta = théta
     
            double bt2 = 0;
     
            bt2=(2)/(double) (racine); // Car on démarre toujours avec 2kpi dans la parenthèse : ceci est la deuxième partie de béta (bt2)
     
            cout << bt1 << "+" << bt2 << ".k.pi" << endl;
     
            cout << "Computing a Z expression ...\n" << endl;
     
            cout << "Z_k = [" << r << "].[cos(" << bt1 << "+" << bt2 << ".k.pi)+i.sin(" << bt1 << "+" << bt2 << ".k.pi)]" << endl; // C'est l'expression généralisée d'indice k, où k sera incrémenté plus loin, variant entre 0 et (racine-1)
     
            printf("Calculating roots ... \n");
     
            double k = 0;
     
            while(k<racine)
            {
                do
                {
                cout << "Z_0 = [" << r << "].[cos(" << bt1 << ")+i.sin(" << bt1 << ")]" << endl; // Première racine, d'indice 0, et comme l'indice vaut k, k.pi = 0, et bt2 disparaît donc, voilà pourquoi il existe une seule boucle pour Z_0
                k++;
                }while(k==0);
     
                thf=bt2*k;
     
                while(k<(racine-1)) // On affiche les racines situées entre la deuxième (comprise) et l'avant-dernière (comprise)
                {
                    cout << "Z_" << k << "=[" << r << "].[cos(" << bt1 << "+" << thf << ".pi)+i.sin(" << bt1 << "+" << thf << ".pi)]" << endl;
                    k++;
                }
     
                if(k=(racine-1)) // On affiche la dernière racine du complexe, et le choix de quitter, ou non
                {
                    cout << "Z_" << k << "=[" << r << "].[cos(" << bt1 << "+" << thf << ".pi)+i.sin(" << bt1 << "+" << thf << ".pi)]" << endl;
     
                    cout << "This is the end of the program - roots were calculated. Do you want to quit (0 to stay, 1 to quit) ? (0/1)" << endl;
     
                    cin >> choix;
     
                    if(choix==1)
                    {
                        cout << "Goodbye !" << endl; // Si l'user veut quitter
                        exit(EXIT_SUCCESS);
                    }
                    else
                    {
                        choix=0;
                        k=racine+1;
                    }
                }
            }
        }
    }
    Ma question : tout fonctionne, mais, dans le calcul des racines, j'obtiens toujours la même valeur dans la 2ème partie de la fonction trigonométrique.) par exemple :
    0.4.pi, à chaque fois (lorsque racine=5), alors que ceci devrait être incrémenté selon la valeur de k(donc l'indice de la racine).
    Exemple:
    je devrais avoir, outre tous les autres paramètres de la racine (ici j'ai essayé avec a=2,b=3, et racine=5),
    Z_1=[ro].[cos(théta+0.4.pi)+i.sin(théta+0.4.pi)]
    Z_2=[ro].[cos(théta+0.8.pi)+i.sin(théta+0.8.pi)]
    , et 0.12 pour Z_3, etc.
    En effet, j'ai défini :
    , et k est incrémenté dans la boucle while.

    Pourquoi, à chaque racine affichée, k n'est-il alors pas multiplié?

    Merci!

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Tu es sur de vouloir faire :

    et non pas plutôt :

    ?

  3. #3
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Dans ton exemple,
    je ne comprend pas à quoi sert la boucle ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(k<racine)
            {....
            }
    en effet, un simlple if k<racine aurait suffit (et encore, je vois pas l'utilité)

    d'autre part,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                while(k<(racine-1)) 
                {
                    cout << "Z_" << k << "=[" << r << "].[cos(" << bt1 << "+" << thf << ".pi)+i.sin(" << bt1 << "+" << thf << ".pi)]" << endl;
                    k++;
                }
    là tu incrémente k mais tu ne recalcule pas thf
    c'est de là que vient ton erreur
    il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                 while(k<(racine-1)) 
                {
                    cout << "Z_" << k << "=[" << r << "].[cos(" << bt1 << "+" << thf << ".pi)+i.sin(" << bt1 << "+" << thf << ".pi)]" << endl;
                    k++;
                   thf=bt2*k;}
    bonne chance
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 30
    Points
    30
    Par défaut
    Je crois que mephisto a tout dit...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    Merci à tous, je n'avais pas vu vos messages !

    Le code est tout à fait fonctionnel.

    Merci!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/05/2013, 16h23
  2. Nombre premiers et calculer la racine carrée d'un nombre
    Par Roud9 dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 21/09/2010, 17h55
  3. scipy.poly1d : précision du calcul des racines
    Par ryced dans le forum Calcul scientifique
    Réponses: 5
    Dernier message: 25/01/2010, 10h04
  4. Racine ènième d'un nombre
    Par kimlee dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2009, 21h08
  5. Calculer la racine quelconque d'un nombre
    Par badkiller3100 dans le forum Langage
    Réponses: 5
    Dernier message: 12/09/2007, 17h51

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