[résolu] Coup de main sur problème de math (biorythme)

octobre 2018 modifié dans Divers

Bonjour à tous,
pour découvrir le monde des applis android j’essaie d’en faire une qui consiste à présenter les courbes du biorythme.

Tracer une courbe sinusoïdale ne me présente pas de soucis, là ou je butte c’est pour trouver le moment où toutes les courbes sont au maxi ou au mini. (Eh oui en plus de montrer les courbes je souhaite indiquer la date des prochains maxis et minis)

Pour mémoire, le biorythme c’est de la pseudo-science, en gros il existerait 3 cycles concernant notre potentiel physique, émotionnel et intellectuel.

  • Le cycle physique d’une période de 23 jours
  • Le cycle émotionnel d’une période de 28 jours
  • le cycle intellect d’une période de 33 jours.

Mon niveau actuel de math ne me permet plus de résoudre ce problème, ma dernière présence sur les bancs de l’école pour un cours de math remonte maintenant à 33 ans en arrière autant dire que j’ai tout oublié.

La découverte d’android et de nombreuses autres activités font que je n’ai pas eu l’envie et aussi le courage de me replonger la dedans d’où mon appel à l’aide pour une solution facile.

Au pire des cas si personnes ne me trouve une solution je ferais une simple boucle avec un algo du genre, alors qu’une formule doit surement exister j’espére juste ne pas avoir à utiliser une librairie mathématique spéciale.

LesMaxis = faux;
Max = MaxiPhysique = MaxiEmotion=MaxiIntelect = 0;
Mini = MaxiPhysique = MaxiEmotion=MaxiIntelect = 0;
Amplitude 10;
Joursdepuisnaissance = date-du-jour - date-naissance;
CompteurJour = 0;
Tant que LesMaxis est faux
    TmpPhysique = TmpEmotion = TmpEmotion = 0 
    TmpPhysique=Amplitude * sin(2*3.14*Joursdepuisnaissance/23);
    TmpEmotion=Amplitude * sin(2*3.14*Joursdepuisnaissance/28);
    TmpIntelect=Amplitude * sin(2*3.14*Joursdepuisnaissance/33);
    Si (TmpPhysique +TmpEmotion + TmpIntelect = 30)  alors Max = CompteurJour;
    Si (TmpPhysique +TmpEmotion + TmpIntelect = -30)  alors Min = CompteurJour;
    Si (Max = 30 Et Min = -30) alors LesMaxis est vrai
    CompteurJour = Compteur +1;  
Tant que fin  

Pourquoi je poste cela ici, car je suis lecteur du blog de notre hôte et que je le sais prof de math ;) , c’est peut-être une idée d’exercice concret…

Je comprendrais aussi que personne ne veuille prendre le temps de se pencher sur le truc. Comme je l’ai laissé entendre c’est juste dans ma liste des 1000 trucs et projets en cours que peut-être je ne finirai ou ferai jamais !

Réponses

  • @fran6t Je suis désolé, je ne vais pas pouvoir t'aider mais je me souviens d'avoir cherché l'algo et de l'avoir implémenté en PASCAL UCSD. Il y a de ça donc fort fort fort longtemps (disons un peu après l'élection de François Mitterrand, le 1er septennat hein)

  • @CitronDoux cool, ce devait être le premier et vrai PASCAL, les premiers contact de programmation pour moi en loisir ce fut le TI-BASIC sur TI 99 puis après pendant des études l'assembleur 6800 et le Turbo PASCAL. Cela ne nous rajeunit pas... Pour faire suite à la ref temporel je dirais au bon temps de l'arrivée et du boom des radios libres... ;)

  • Je me trompe peut-être (surement même) mais en utilisant une fonction "modulo", ça devrait être possible, non?
    Du style si modulo (Joursdepuisnaissance , 23) = 0 alors TmpPhysique = max (ou 0, je ne sais plus trop comment fonctionne les biorythmes)

  • @GillesLL merci pour la réponse, mais non ce n’est pas cela que je cherche ce que je cherche c’est une fonction mathématique permettant de remplacer l’algorithme que j’ai montré.
    La fonction doit me permettre de trouver quand le maxi des trois périodes est atteint ainsi que le mini.
    Du coup en re-expliquant il m'est aussi venu une autre idée :
    Si la fonction est relativement simple, je pense même si je la comprends l’utiliser aussi du coup par exemple pour un couple, par exemple on saisit sa date de naissance, celle de sa compagne et idem on trouve le moment où tout s’accorde, peut-être jamais sur 100 ans je sais pas trop.

  • on va attendre que les vrais profs de maths passent dans le coin. @Alain @Arnaud

  • octobre 2018 modifié

    Juste une remarque mais sachant que les périodes sont de 23,28 et 33 jours, les rythmes ne vont parfaitement coïncider que tout les 23 x 28 x 33 =21 252 jours, soit tout les 58 ans ...
    Sauf si je dis une énorme connerie
    PS : c'est malin, me v'la avec une règle en train d'essayer de résoudre le truc ;)

  • octobre 2018 modifié

    Si je ne raconte pas trop de conneries et si j'ai bien compris, comme 23, 28 et 33 sont premiers entre eux et premiers deux à deux, les cycles des extremums communs sont périodiques de période 23x28x33 jours avec un décalage d'un quart de période en plus pour le maximum et d'une demie-période supplémentaire pour le minimum.

  • alors on rectifie pour alain
    23 est premier mais pas 28 ( 2x2x7) , ni 33 (3x11 )

    ce que tu cherche a savoir c'est lorsque que tes fonctions sinus ( y ) = -1 ou 1
    caf sin(j1) = sin(j2) = sin(3j) = 1 ou -1

  • Je n'ai pas dit qu'ils étaient premiers mais premiers entre eux, ce qui n'est pas tout à fait la même chose ...

  • Ça me rappelle la logique bureaucratique. Aucune en fait.
    Le biorythme c'est un machin qui ne sert à rien. À part savoir si les petits pois vont correctement pousser dans le bon sens.
    Par contre, ça peut être un bon exercice théorique et connecter les synapses qui ne demandent que ça.
    Ravi d'avoir pu aider…

  • Ben moi, je pense que :

    1) Certaines situations ne sont pas prises en compte dans l'algorithme, donc on se retrouve avec une boucle infinie dans certains cas,

    2) Si on ne clarifie pas ce qu'il se passe avec les quarts de jour, on ne peut pas trouver de réponse simple. Pour les matheux : on se retrouve alors avec trois équations diophantiennes dont le pgcd des coefficients ne divise pas le membre de droite ( 92k = 5+112k' = 10+132k'' pour la recherche d'un max ), sauf erreur de ma part.

  • octobre 2018 modifié

    Bon, je me suis amusé à bidouiller des calcul avec libreoffice
    J'arrive à un cas ou tout devrait concorder mais quand je regarde sur des sites de biorythmes, ça ne colle pas.
    D'ailleurs, les résultats des sites eux-mêmes m'interpellent
    Ainsi là : http://www.biorythme.net/?jour=29&mois=7&annee=2002
    J'ai 5923 jours, soit 25723+12 , 21128+15 et 179*33+16
    Or le site me site aujourd'hui (16/10/2018) quasiment au 0.
    Y'a un truc que je ne pige pas.

    Et surtout mes calculs tombent à l'eau, moi qui pensait décrocher la médaille Fields :(

    Mais comme dit @philgra , ça aura au moins fait travailler les synapses.

  • @Arnaud a dit :
    Ben moi, je pense que :

    1) Certaines situations ne sont pas prises en compte dans l'algorithme, donc on se retrouve avec une boucle infinie dans certains cas,

    C'est bien possible et du coup en vous lisant tous je me rend compte qu'effectivement les trois sinus a 1 ou à -1 n'est peut-être pas jouable voir même peu pertinant il faudra surement une petite fourchette de tolérance mais du coup ça laisse de la place que pour l'algorythme et plus a une formule ou une equation.

    Merci à tous pour vous être ou vous pencher sur le problème.

  • Bonjour,
    je ne vois pas vraiment ou est le sujet. Un gros tableau sous Libreoffice et un graphique font bien l'affaire pour ces 3 courbes. Reste à définir la fonction qui représente le résultat final.

  • @Phreg a dit :
    Bonjour,
    je ne vois pas vraiment ou est le sujet. Un gros tableau sous Libreoffice et un graphique font bien l'affaire pour ces 3 courbes. Reste à définir la fonction qui représente le résultat final.

    Ben alors pas trop la peine de répondre s'il y a pas de sujet ;)

    La phrase "Reste à définir la fonction qui représente le résultat final."

    Ben comment dire: je n’ai pas demandé de l’aide pour faire des beaux graphes reposant sur une fonction, mais n’ayant plus le niveau en math c’était une aide pour trouver une fonction qui trouve le maxi et le mini commun de fréquences sinusoïdales différentes. Je ne vois pas trop ce qui va me faire trouver la fonction en regardant les graphes du tableur. D'ailleur le travail est tout maché merci à l'auteur http://francis.leroux.pagesperso-orange.fr/excel_en_physique/utilisation_excel/sinusoide.htm (à noter que ça fonctionne sans problème dans libreoffice, mais peut-être pas au moment de la redaction de ses explications).

    J’en profite pour remercier tous les intervenants qui m’ont apporté si ce n’est une solution en tous un éclairage avisé pour la suite que je donnerai (sûrement l'algo amélioré).

    Je n’ai pas le temps de faire fonctionner et améliorer l’algo que j’ai mis à main levée en rédigeant le post, mais dès que j’ai une minute je m’y penche en PHP car très pratique avec sa class date qui est vraiment top pour les calculs et les conversions.

  • @fran6t a dit :
    Je n’ai pas le temps de faire fonctionner et améliorer l’algo que j’ai mis à main levée en rédigeant le post, mais dès que j’ai une minute je m’y penche en PHP car très pratique avec sa class date qui est vraiment top pour les calculs et les conversions.

    Tu as la même chose en Python ( et même la plupart des langages ), avec tout ce qu'il faut pour les maths, sans avoir besoin d'un serveur web.

  • @Arnaud c’est vrai je plussoie d’autant que python est dispo dans le logiciel de 3D paramétrique que j’utilise assez souvent à savoir Freecad, par contre je connais pas du tout ce qu’il faut pour développer un petit script python et afficher l’image comme je le ferais avec un simple bout de php.
    Ok il faut un éditeur de texte, python qui sont sur mon ordi puisque nécessaire à de plus en plus de truc sous linux, mais après ? J’image faire le script qui enregistre une image ou alors il y a un ide qui permet d’afficher l’image générée direct ?

    Pour revenir au sujet au final, pas besoins d’une fonction avec ce que vous m’avez soumis tous comme réflexion et avis j’ai fait un petit script et en fait nous avons bien tous à l’arrondi prêt :
    - nos maximums aux âges de 46A et 7 mois, 103A et 9 mois
    - nos minimums aux âges de 10A et 6 mois, 68 A et 10 mois

    Voici le petit bout de code qui me permet de dire cela, j’ai un peu triché en faisant une première boucle pour trouver les maxi et mini (pas besoins de me prendre ainsi la tête avec les arrondis ou autres, il y a un x 100 aussi qui pourrait ne pas être là, mais pas grave :

    <?php function ageAlaDateDu($nbreJours,$ddn){ //Entrée le nombre de jours, et la date de naissance retourne l'âge sous forme (nombre années et mois) $lachaine = $ddn." +".$nbreJours." days"; $DateJourJ = date('Y-m-d', strtotime($lachaine)); $lanaiss = explode('-',$ddn); $lejourj = explode('-',$DateJourJ); $annais = $lanaiss[0]; $anjour = $lejourj[0]; $moisnais = $lanaiss[1]; $moisjour = $lejourj[1]; $journais = $lanaiss[2]; $jourjour = $lejourj[2]; // Calcul du nombre d'année $age = $anjour-$annais; if ($moisjour<$moisnais){ $age=$age-1; } if ($jourjour<$journais && $moisjour==$moisnais){ $age=$age-1; } // Calcul nombre mois $ageresult = ""; $nb_mois = $moisjour - $moisnais; if ($nb_mois == 0) $ageresult = $age."A"; if ($nb_mois <= 0) $ageresult = ($age-1)."A-".($nb_mois+12)."m"; if ($nb_mois >= 0) $ageresult = ($age)."A-".$nb_mois."m"; return "(".$ageresult.")"; } $date_naiss = '1968-02-20'; $periodP = 23; $periodE = 28; $periodI = 33; $max = $mini = 0; $jmax = $jmini = 0; for ($x = 0; $x <= 73000; $x++) { $phaseP = (($x) % $periodP) / $periodP * 2 * pi(); $phaseE = (($x) % $periodE) / $periodE * 2 * pi(); $phaseI = (($x) % $periodI) / $periodI * 2 * pi(); $y = (sin($phaseP) + sin($phaseE) + sin($phaseI)) * 100; if ($y > $max){ $max = $y; $jmax = $x; } if ($max >= 299.65361083735){ echo "<br />Max atteind ".$x." jours après la naissance valeur du max = ".$max; $lachaine = $date_naiss." +".$x." days"; echo "<br />Date du maxi : ".date('d-m-Y', strtotime($lachaine))." à l'âge de ".ageAlaDateDu($x,$date_naiss); $max = 0; } if ($y < $mini){ $mini = $y; $jmini = $x; } if ($mini <= -299.65361083735){ echo "<br />Mini atteind ".$x." jours après la naissance valeur du mini = ".$mini; $lachaine = $date_naiss." +".$x." days"; echo "<br />Date du mini : ".date('d-m-Y', strtotime($lachaine))." à l'âge de ".ageAlaDateDu($x,$date_naiss); $mini = 0; } } ?>

    Merci à tous

Connectez-vous ou Inscrivez-vous pour répondre.