Équation Différentielle du Second Ordre donnant 0

Aller en bas

Équation Différentielle du Second Ordre donnant 0

Message  FirePowi le 26.01.13 19:22

Bonjour à tous, vous connaissez les équations différentielles, ça peut vous enerver ? Eh bien voici comment percer le secret d'une equa diff' du second ordre, sous la forme ay''+by'+cy = 0.

a != 0 !!

Spoiler:
Code:

/*
  This program is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the
  Free Software Foundation; either version 2, or (at your option) any
  later version.
*/

#include <iostream>
#include <math.h>

using namespace std;

void cinCleaner()
{
    cin.clear();
    cin.ignore(255,'\n');
}
        //Début de déclaration des fonctions
void entrerVariables(float &a, float &b, float &c);
short int equaNum(float a, float b, float c, float &r1, float &r2, float &r1Imaginaire, float &r2Imaginaire);
void afficheSol(float r1, float r2, float r1Imaginaire, float r2Imaginaire, short int signeDelta);
void resolNeg(float r1,float r1Imaginaire,float r2Imaginaire);
void resolNul(float r1);
void resolPos(float r1,float r2);
        //Fin de déclaration des fonctions


int main()
{
    while(1)
    {
        float a(0),b(0),c(0),r1(0),r2(0), r1Imaginaire(0), r2Imaginaire(0);
        // Décclaration des variable de l'équation et du résultat.

        short int caseDelta(0);
        //Variable qui vera si Delta est positif, nul ou négatif

        entrerVariables(a,b,c);
        //fonction demandant à l'utilisateur, de rentrer les variables de l'équation

        caseDelta = equaNum(a,b,c,/*&*/r1,/*&*/r2,/*&*/r1Imaginaire,/*&*/r2Imaginaire);
        //fonction qui calcul le résultat de l'équation numérique asscoiée.

        afficheSol(r1, r2, r1Imaginaire, r2Imaginaire, caseDelta);
        //fonction qui affiche les solution de l'équation
    }
    return 0;
}

void entrerVariables(float &a, float &b, float &c)
{
    cout << "\n\nSalut, je resouds des equations differentiels du second ordre, de la forme af''+bf'+cf" << endl;
    cout << "merci de me donner a : ";
    cin >> a;
    cinCleaner();  //vide le buffer
    cout << "merci de me donner b : ";
    cin >> b;
    cinCleaner();  //vide le buffer
    cout << "merci, enfin, de donner c : ";
    cin >> c;
    cinCleaner();  //vide le buffer
}

short int equaNum(float a, float b, float c, float &r1, float &r2, float &r1Imaginaire, float &r2Imaginaire)
{
    float Delta = b*b-(4*a*c); //calcul de Delta=(b²-4ac)
    if (Delta < 0)
    {
        //Deux solution Complexe
        r1 = (-b/2*a);  //partie réel commune aux 2 solutions
        r1Imaginaire = sqrt(-Delta)/2*a; //partie imaginaire de r1
        r2Imaginaire = -r1Imaginaire;  //partie imaginaire de r2
        return -1;  //caseDelta sera égal à négatif, car Delta est négatif
    }
    else if (Delta == 0)
    {
        //Une seule solution Réelle
        r1 = (-b/2*a);
        return 0;  //caseDelta sera égal à 0, car Delta est nul
    }
    else
    {
        //Deux solution réelles
        r1 = (-b+sqrt(Delta))/2*a;  //la première solution
        r2 = (-b-sqrt(Delta))/2*a;  //la deuxième solution
        return 1;  //caseDelta sera égal à -1, car Delta est négatif
    }
}

void afficheSol(float r1, float r2, float r1Imaginaire, float r2Imaginaire, short int signeDelta)
{
    switch(signeDelta)
    {
        case -1 : resolNeg(r1,r1Imaginaire,r2Imaginaire); break;
        //si Delta est négatif, appel de resolNeg

        case 0 : resolNul(r1); break;
        //si Delta est nul, appel de resolNul

        case 1 : resolPos(r1, r2); break;
        //si Delta est positif, apper de resolPos
    }
}

void resolNeg(float r1,float r1Imaginaire,float r2Imaginaire)
{
    cout << "les solutions a l'equation sont : " << endl;
    if (r1 && r1!=1)
    //si la partie réelle n'est ni égale à 0 ni égale à 1, pas de simplification
    {
        cout << "f(x) = e^(" << r1 << "x) (A * cos (" << r1Imaginaire << "*x ) + B * sin (" << r2Imaginaire << "x ), A et B sont reel.";
    }
    else if (r1 == 0)
    //si la partie réelle est nulle, suppression de l'exponentiel : e⁰=1
    {
        cout << "f(x) = (A * cos (" << r1Imaginaire << "*x ) + B * sin (" << r2Imaginaire << "x ), A et B sont reel.";
    }
    else if (r1 == 1)
    //si la partie réelle est égale à 1, pas besoin de la mentionner
    {
        cout << "f(x) = e^(x) (A * cos (" << r1Imaginaire << "*x ) + B * sin (" << r2Imaginaire << "x ), A et B sont reel.";
    }
    else
    //si la partie réelle est égale à -1, on ne mentionne que le -
    {
        cout << "f(x) = e^(-x) (A * cos (" << r1Imaginaire << "*x ) + B * sin (" << r2Imaginaire << "x ), A et B sont reel.";
    }
}

void resolNul(float r1)
{
    cout << "les solutions a l'equation sont : " << endl;
    if (r1!=-1 && r1!=0 && r1 != 1)
    //si r1 n'est ni égal à 0 ni à 1, pas de simplification
    {
        cout << "f(x) = (A*x+B)e^( " << r1 << "x )";
    }
    else if (r1 == 1)
    //si r1 est égal à 1, simplification, on ne le mentionne pas
    {
        cout << "f(x) = (A*x+B)e^( x )";
    }
    else if(r1 == 0 )
    //si r1 est nul, suppression de l'exponentiel : e⁰ = 1
    {
        cout << "f(x) = (A*x+B)";
    }
    else
    //si r1 est égal à -1, simplification, on ne mentionne que le -.
    {
        cout << "f(x) = (A*x+B)e^( -x )";
    }
}

void resolPos(float r1,float r2)
{
    cout << "les solutions a l'equation sont : " << endl;
    if ( r1 != 0 && r1 != 1 && r1 != -1 && r2 != 0 && r2 != 1 && r2 !=-1 ) //00
    //r1 et r2 sont différent de 0 et de 1 -> Pas de simplif.
    {
        cout << "f(x) = Ae^( " << r1 << "x ) + Be^( " << r2 << "x )";
    }
    else if ( r1 != 0 && r1 != 1 && r1 != -1 && r2 == 1 )  //01
    //idem pour r1, r2 égal 1 => simplification, on ne le mentionne pas.
    {
        cout << "f(x) = Ae^( " << r1 << "x ) + Be^( x )";
    }
    else if ( r1 != 0 && r1 != 1 && r1 != -1 && r2 == 0 )  //02
    //idem pour r1, r2 égal 0 => simplification de l'exponentiel : e⁰=1
    {
        cout << "f(x) = Ae^( " << r1 << "x ) + B";
    }
    else if ( r1 != 0 && r1 != 1 && r1 != -1 && r2 == -1 )  //03
    //idem pour r1, r2 égal -1 => simplification, on ne mentionne que le -
    {
        cout << "f(x) = Ae^( " << r1 << "x ) + Be^( -x )";
    }
    else if (r1 == 1 && r2 != 0 && r2 != 1 && r2 !=-1 ) //10
    //r1 égal 1 et r2 ni 0 ni 1 => simplif r1 pas mentionné
    {
        cout << "f(x) = Ae^( x ) + Be^( " << r2 << "x )";
    }
    else if (r1 == 1 && r2 == 1) //11
    //idem r1, r2 (cf cas n°2)
    {
        cout << "f(x) = Ae^( x ) + Be^( x )";
    }
    else if (r1 == 1 && r2 == 0) //12
    //idem r1, r2 (cf cas n°3)
    {
        cout << "f(x) = Ae^( x ) + B";
    }
    else if (r1 == 1 && r2 == -1) //13
    //idem r1, r2 (ce cas n°4)
    {
        cout << "f(x) = Ae^( x ) + Be^( -x )";
    }
    else if (r1 == 0 && r2 != 0 && r2 != 1 && r2 !=-1 ) //20
    //r1 nul, simplif son exponentiel (e⁰=1), r2 idem cas n°1
    {
        cout << "f(x) = A + Be^( " << r2 << "x )";
    }
    else if (r1 == 0 && r2 == 1) //21
    //idem r1, r2 cas n°2
    {
        cout << "f(x) = A + Be^( x )";
    }
    else if (r1 == 0 && r2 == 0)  //22
    //idem r1, r2 cas n°3
    {
        cout << "f(x) = A + B";
    }
    else if (r1 ==0 && r2 == -1)  //23
    //idem r1, r2 cas n°4
    {
        cout << "f(x) = A + Be^( -x )";
    }
    else if (r1 == -1 && r2 != 0 && r2 != 1 && r2 !=-1 ) //30
    //r1 égal -1, r2 cas n°1
    {
        cout << "f(x) = Ae^( -x ) + Be^( " << r2 << "x )";
    }
    else if (r1 == -1 && r2 == 1)  //31
    //idem r1, r2 cas n°2
    {
        cout << "f(x) = Ae^ ( -x ) + Be^( x )";
    }
    else if (r1 == -1 && r2 == 0 )  //32
    //idem r1, r2 cas n°3
    {
        cout << "f(x) = Ae^( -x ) + B";
    }
    else
    //idem r1, r2 cas n°4
    {
        cout << "f(x) = Ae^( -x ) + Be^ (-x )";
    }
}
Penser à l'améliorer, si l'envie vous en prend.
Il ne gère pas encore les erreurs.

Programmé en Math et en Info.

avatar
FirePowi

Humeur : Je pleure autant que je ris, à quelque chose près.
Localisation : Physiquement proche de mon PC
Emploi/Loisirs : Sans Emploi, Sans Loi… Ah si.

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  Yoendel le 26.01.13 21:07

Oh, je vois... résolution des équations homogène (<=> dire "= 0") de second ordre à coefficients constants...
Hum, et en C++ ... tu viens de m'apprendre le nom de la fonction d'entrée, le cin... je la cherchais... on ne l'a pas apprise en cours...
Je verrai ce qui peut être amélioré...

_____________________
"On ne voit bien qu'avec le cœur: l'essentiel est invisible pour les yeux." le renard, A de St Exupéry.
"Qu'est-ce que signifie «apprivoiser»? dit le Petit prince.
-C'est une chose trop oubliée, dit le renard. Ca signifie «créer des liens...»"
http://www3.sympatico.ca/gaston.ringuelet/lepetitprince/chapitre21.html
"eux veulent me forcer à parler pour ne rien dire, alors je ne dis rien pour parler."
"Il ne faut pas mettre les gens dans des petites cases ; c'est un signe de confusion mentale, mon chou !" les Chants de la Mallorée
"Point de monde sans hasard... point de hasard sans monde... la boucle est bouclée" Alexandra.
"et si notre monde avait 3 coordonnées temporelles pour une spatiale ?"
avatar
Yoendel

Humeur : variable... dérivable... et même C-infinie

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  FirePowi le 26.01.13 22:03

Ah bah merci du vocabulaire, et c'est un plaisir pour la cin.
Et il est nécéssaire de toujours faire cinCleaner après une cin, et tu as vu ma fonction cinCleaner.

Je pense que ce qui peut-être amélioré :

-Ajout d'une autre égalité que 0, constante, puis premier degré, puis éventuellement second, mais là, ça commencera à faire un long programme et autant pour la constante, je sais faire, autant pour aller plus loin, je ne sais pas encore comment faire, puisque la façon que je connais est très théorique et qu'il faudrait donc faire des calculs long.

-Ajout du premier ordre, et donc calcul de Primitive, donc à partir de là, l'ED devient un objet, à proprement parler, car on ne peut plus faire juste avec 3 variable.

-L'entré de l'ED en toute lettre, et donc gestion par le programme de :
af''+bf'+cf = xt+z, mais là, ça relève du réel défi, et ce ne sera plus juste un petit programme sympatique, mais une vrai machine à faire les frites.

-Plus soft : un VRAI menu classe, avec choix : premier ou second ordre (voire troisième si tu connais), puis sous-menu : homogène ou égalité avec constante, ou égalité avec binôme, ou ...

Liste incomplète éditable au fur et à mesure du temps.
avatar
FirePowi

Humeur : Je pleure autant que je ris, à quelque chose près.
Localisation : Physiquement proche de mon PC
Emploi/Loisirs : Sans Emploi, Sans Loi… Ah si.

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  Bacrima le 27.01.13 14:13

J'adore ! Smile

_____________________
"Ouvrez-moi une bucolique à perte de vue, le ventre à tout le monde si vous l'aviez vu quand on n'y aurait qu'une petite partie de la société mécanisée."
avatar
Bacrima

Humeur : Une pointe de joie et un soupçon d'amusement
Localisation : Dans ma chambre, rarement ailleur ...
Emploi/Loisirs : Japanimer, ça se dit ?

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  Yoendel le 28.01.13 2:09

Ah bah merci du vocabulaire, et c'est un plaisir pour la cin.
Et il est nécéssaire de toujours faire cinCleaner après une cin, et tu as vu ma fonction cinCleaner.
De rien pour le voc et encore merci pour la fonction.

Dès que j'ai du temps libre sous Debian, j'essaie d'ajouter des trucs à ce programme.

-Ajout d'une autre égalité que 0, constante, puis premier degré, puis éventuellement second, mais là, ça commencera à faire un long programme et autant pour la constante, je sais faire, autant pour aller plus loin, je ne sais pas encore comment faire, puisque la façon que je connais est très théorique et qu'il faudrait donc faire des calculs long.
Ah, ça... la solution est dans la recherche d'une solution particulière + la recherche de la solution de l'équation homogène (en re-remplaçant la fonction par "=0") associée... mais le plus dur devient alors de trouver la solution particulière, d'un point de vue programmation.
(puisque la solution homogène, ton programme te la donne déjà)


(voire troisième si tu connais)
C'est soluble, mais si tu fais pour 3... tu fais pour n.
Mais bon, se restreindre à 3 est un bon début.
Car dans tous les cas, il va falloir passer par des matrices, et surtout par ce qu'on appelle la diagonalisation de matrice (transformer une matrice en matrice diagonale). C'est long et difficile à concevoir informatiquement... mais pas impossible. :mrgreen:
J'essaierai aussi de voir ça...

_____________________
"On ne voit bien qu'avec le cœur: l'essentiel est invisible pour les yeux." le renard, A de St Exupéry.
"Qu'est-ce que signifie «apprivoiser»? dit le Petit prince.
-C'est une chose trop oubliée, dit le renard. Ca signifie «créer des liens...»"
http://www3.sympatico.ca/gaston.ringuelet/lepetitprince/chapitre21.html
"eux veulent me forcer à parler pour ne rien dire, alors je ne dis rien pour parler."
"Il ne faut pas mettre les gens dans des petites cases ; c'est un signe de confusion mentale, mon chou !" les Chants de la Mallorée
"Point de monde sans hasard... point de hasard sans monde... la boucle est bouclée" Alexandra.
"et si notre monde avait 3 coordonnées temporelles pour une spatiale ?"
avatar
Yoendel

Humeur : variable... dérivable... et même C-infinie

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  FirePowi le 28.01.13 9:13

-Ajout d'une autre égalité que 0, constante, puis premier degré, puis éventuellement second, mais là, ça commencera à faire un long programme et autant pour la constante, je sais faire, autant pour aller plus loin, je ne sais pas encore comment faire, puisque la façon que je connais est très théorique et qu'il faudrait donc faire des calculs long.
Ah, ça... la solution est dans la recherche d'une solution particulière + la recherche de la solution de l'équation homogène (en re-remplaçant la fonction par "=0") associée... mais le plus dur devient alors de trouver la solution particulière, d'un point de vue programmation.
(puisque la solution homogène, ton programme te la donne déjà)

Il faudra que je m'y intéresse, mais là, j'ai salement la tête dans le cul, et vraiment envie dormir, 4h de someil après ÇA, ça ne suffit pas !


(voire troisième si tu connais)
C'est soluble, mais si tu fais pour 3... tu fais pour n.
Mais bon, se restreindre à 3 est un bon début.
Car dans tous les cas, il va falloir passer par des matrices, et surtout par ce qu'on appelle la diagonalisation de matrice (transformer une matrice en matrice diagonale). C'est long et difficile à concevoir informatiquement... mais pas impossible. :mrgreen:
J'essaierai aussi de voir ça...

Nous en avons parlé, mais je ne connais pas les matrices, je suis parti en délire, à cause d'un court-métrage amateur nommé Matrix.
avatar
FirePowi

Humeur : Je pleure autant que je ris, à quelque chose près.
Localisation : Physiquement proche de mon PC
Emploi/Loisirs : Sans Emploi, Sans Loi… Ah si.

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  Yoendel le 29.01.13 1:04

:mrgreen: Décidément, y'en a des courts métrages amateurs usant de concepts de maths trop incompris et pourtant trop stylés...

Disons juste que fondamentalement une matrice c'est ni plus ni moins qu'un bête tableau de n lignes par p colonnes...

Comme beaucoup de définitions mathématiques, cela peut décevoir au début.
Mais lorsque l'on commence à donner des règles puis un sens à ces tableaux... on peut refaire le monde. Wink

Mais bon... moi aussi je vais devoir attendre pour pouvoir avancer ce programme...

_____________________
"On ne voit bien qu'avec le cœur: l'essentiel est invisible pour les yeux." le renard, A de St Exupéry.
"Qu'est-ce que signifie «apprivoiser»? dit le Petit prince.
-C'est une chose trop oubliée, dit le renard. Ca signifie «créer des liens...»"
http://www3.sympatico.ca/gaston.ringuelet/lepetitprince/chapitre21.html
"eux veulent me forcer à parler pour ne rien dire, alors je ne dis rien pour parler."
"Il ne faut pas mettre les gens dans des petites cases ; c'est un signe de confusion mentale, mon chou !" les Chants de la Mallorée
"Point de monde sans hasard... point de hasard sans monde... la boucle est bouclée" Alexandra.
"et si notre monde avait 3 coordonnées temporelles pour une spatiale ?"
avatar
Yoendel

Humeur : variable... dérivable... et même C-infinie

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  FirePowi le 29.01.13 20:35

Yoendel a écrit: :mrgreen: Décidément, y'en a des courts métrages amateurs usant de concepts de maths trop incompris et pourtant trop stylés...

Disons juste que fondamentalement une matrice c'est ni plus ni moins qu'un bête tableau de n lignes par p colonnes...

Comme beaucoup de définitions mathématiques, cela peut décevoir au début.
Mais lorsque l'on commence à donner des règles puis un sens à ces tableaux... on peut refaire le monde. Wink

Oh que ça donne envie. Tu m'apprendrais ? *regard de chaton*

Yoendel a écrit:Mais bon... moi aussi je vais devoir attendre pour pouvoir avancer ce programme...

Ah ? Pourquoi ?
avatar
FirePowi

Humeur : Je pleure autant que je ris, à quelque chose près.
Localisation : Physiquement proche de mon PC
Emploi/Loisirs : Sans Emploi, Sans Loi… Ah si.

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  Yoendel le 29.01.13 22:05

Pourquoi ? Parce que je ne trouve pas le temps d'avancer mon propre programme pour le cours, de terminer les livres qui sont entre mes mains depuis trop longtemps, de finir de lire les derniers que l'on m'a offerts, de faire un tour dans un Paris store pour manger des Manjuu ou de visiter les musées, d'écrire les histoires qui m'attendent dans un livre perso, de recopier ce fichu sujet du monde tytrutif sans lequel il est inutile de passer à autre chose, même s'il va sérieusement falloir en revoir les bases, de programmer mon perceptron en C++, de nettoyer le sol de ma chambre qui s'est sali je ne sais trop comment, de réfléchir à un exercice sur les tenseurs et la relativité, de faire des liens explicites entre le film Chaos et mon cours de Phystat, de réviser mon cours de Méca Q en comprenant enfin d'où viennent ces l, m, p qui produisent notre tableau périodique, de comprendre en quoi le conjugué de l'entropie est la température, d'appeler Svetlana pour discuter du problème soulevé par Bac, d'envoyer des cartes, -Eh zut ! c'était urgent, ça !!- de...
enfin bref, tu auras compris ... :mrgreen:
Cependant du temps j'en ai (là preuve, je réponds...) . C'est juste que quand ma motivation colle avec l'un de ces éléments, étrangement... Murphy intervient, le fourbe. :mrgreen:

Donc j'espère trouver un moment où le temps sera en phase avec mon humeur... Wink

Oh que ça donne envie. Tu m'apprendrais ? *regard de chaton*
J'essaie de t'imaginer avec un regard de Chaton.
Mais un renard prend mieux chez moi. Razz
Enfin...

Oui, à l'occasion, je ferai un sujet dessus...
Et si d'autres veulent m'aider (Meko, Geo ? Ainsi que tous ceux qui savent au moins le début de ce qu'est une matrice ou des règles de multiplication... c'est déjà quelque chose... Very Happy )
Je ne suis pas contre... c'est même plus amusant.

_____________________
"On ne voit bien qu'avec le cœur: l'essentiel est invisible pour les yeux." le renard, A de St Exupéry.
"Qu'est-ce que signifie «apprivoiser»? dit le Petit prince.
-C'est une chose trop oubliée, dit le renard. Ca signifie «créer des liens...»"
http://www3.sympatico.ca/gaston.ringuelet/lepetitprince/chapitre21.html
"eux veulent me forcer à parler pour ne rien dire, alors je ne dis rien pour parler."
"Il ne faut pas mettre les gens dans des petites cases ; c'est un signe de confusion mentale, mon chou !" les Chants de la Mallorée
"Point de monde sans hasard... point de hasard sans monde... la boucle est bouclée" Alexandra.
"et si notre monde avait 3 coordonnées temporelles pour une spatiale ?"
avatar
Yoendel

Humeur : variable... dérivable... et même C-infinie

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Équation Différentielle du Second Ordre donnant 0

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum