Résolu PHP/Maths : Sinusoide en triangle

mdj de normandie

Expert
#1
Bonjour a tous,

Le forum a fait peu neuve apparemment ^^ et j'ai récup le vieux compte sa fait plaisir !

bon je vais essayez de faire simple :
je bosse en PHP (comme d'hab')
je travail sur une fonction qui implique la suite logistique ( Suite logistique, merci wikipédia ! )

j'ai un nombre (float) en entré de ma fonction qui est compris entre 0 et 1 et la précision de ce nombre et d'un millionième (6 chiffres après la virgule pour ceux qui dormaient en maths ^^)

Ce nombre passe un certain nombre de fois dans la suite logistique (avec µ=4 et le nombre d’itération reste a définir selon les besoins)

Pour allez plus loin dans la fonction que je souhaite créer j'avais besoin de connaitre le comportement de la suite, j'ai donc tracer un graphique avec le million de points
1M points.png

et voila le comportement :
pour 1 itération, le graphique affiche une parabole de [0,0 ; 0.5,1; 1,0]
Pour 2 itérations, le graphique affiche 2 sinusoïdes
Pour 3 itérations, le graphique affiche 4 sinusoïdes
Pour 4 itérations, le graphique affiche 8 sinusoïdes
et plus on fait d’itérations plu le nombre de sinusoïdes augmentes suivant le shema : pour n itérations : 2^(n-1) sinusoïdes
a noté que les sinusoïdes ont une période plus courte quand x s’approche de 0 ou 1 et des périodes plus longues en s’approchant de 0.5

voila le graphique (pour 5 itérations)
graph 5 iterations.png
et une partie du code :
PHP:
function graphique() {
    $points=[];
    for ($i = 0; $i < 1000000; $i++) {
        $x=$i/1000000;
        for ($j = 1; $j <= 5; $j++) { // 5 itérations            
            // la fameuse suite logistique :
            $x = $this->logistic($x); // (4 * $x * (1 - $x));
            // ???
        }
        $points[] = [$i/1000000, $x];
    }
    return $points;
}
Et à présent voici ma question :
Quel traitement dois-je appliquer à $x sur la ligne "// ???" pour transformer/lisser/convertir ma courbe sinusoïdal en courbe en triangle (spike en anglais) ?

bon courage a ceux qui liront ce pavé,
bravo a ceux qui le comprendront,
et merci a celui qui trouvera la solution a mon problème.

Sur ce je vous laisse, c'est l'heure de mes pilules ...
 

mdj de normandie

Expert
#2
Bon j'ai trouvé un truc,
pour redresser la courbe sinusoïdal j'utilise un graphique en dents de scie définis par
f(x) = x * f % M
( f = fréquence des dents de scie
M = valeur maximal d'une dent de scie)

x étant mon nombre décimal après le passage dans un certain nombre d’itération de la fonction logistique j'ai donc cette ligne a la place de mon "//???" du message précédent :


PHP:
//je multiplie $x par 1000000 pour pouvoir utiliser le modulo 
//et je redivise par 1000000
//on appel ça "un parapluie" en maths ^^
$x = (($x * 1000000 * $f) % 1000000) / 1000000;
se qui me donne un graphique du genre :
graph dds.png
a présent il me reste a trouver les valeurs optimal pour le nombre d’itération et la fréquence des dents de scie...
j'ai une simulation qui tourne pour ça, j'ai quelques résultats intéressants mais je pense que quelqu'un qui s'y connais en IA et machine learning pourrais me faire gagner du temps.

ou alors si vous me trouvez une meilleur solution je reste preneur.

PS : j’oubliai de préciser, évidement pour ces recherches je fait tourner mes script PHP en mode console, je lance pas une boucle for a 1000000 de tours par serveur web ^^
 

CRicky

Helper
#3
Je ne vois pas trop ce que tu cherches à faire, mais pourquoi ne chercherais-tu pas les minima et maxima locaux pour générer une nouvelle fonction ?
 

mdj de normandie

Expert
#4
Bonjour,
bonne réflexion mais ce n'est pas ce que je cherche ( ou j'ai mal compris votre idée),
les minima et maxima locaux pourrais me servir uniquement :
-si je cherchais les valeurs max et min de mon signal ( hors je sais déjà qu'il varie de 0 a 1)
- ou a connaitre le nombre de "bosse" et de "creux" de mon signale mais sa je peux aussi le déduire a l'aide des deux paramètres que je peux faire varier a savoir :
le nombre d’itérations de la fonction logistique ( i ) et la fréquence de mon signale en dent de scie ( f )
( nombre de bosse = nombre de creux = [2^(i-1)] * (2f -1) )

Je ne vois pas comment je pourrais me servir de ça pour transformer mon signale sinusoïdale en signale triangulaire. ou vous avez eu une réflexion que je n'ai pas saisis.
 
Dernière édition:

CRicky

Helper
#5
Les min/max pourraient aussi servir à définir des équations de droites sur intervalles
 

mdj de normandie

Expert
#6
Ok donc il y a bien un truc qui m'a échappé dans votre réflexion,
auriez vous une source ? car je n'ai pas trouvé comment définir une équation a partir des minima et maxima locaux . merci
 

CRicky

Helper
#7
Meilleure réponse
En supposant, comme dans le graphique, que les min sont en 0 et max en 1.
En déterminant un Xmin ou Xmax successif (avec Ymin=0 et Ymax=1, et peu importe si Xmin < Xmax ou inversement), tu peux calculer l'équation de droite y = a * x + b entre le point (Xmin, 0) et le point (Xmax, 1).
Il suffit juste de déterminer a et b avec le système d'équation suivant dans le cas où la droite passe par le point min, puis par le point max:
a * Xmin + b = Ymin = 0
a * Xmax + b = Ymax = 1
soit
b = -a * Xmin
a * Xmax - a * Xmin = 1
L'équation de droite entre (Xmin, 0) et (Xmax, 1) sera donc:
y = x / (Xmax - Xmin) - Xmin / (Xmax - Xmin)
ou y = (x - Xmin) / (Xmax - Xmin)

On vérifie que pour x=Xmin on a bien y=0 et que pour x=Xmax on a bien y = 1

En fait, la difficulté de cette méthode est plutôt sur la recherche de minima et maxima locaux: avec la dérivée locale d'un point au hasard (déterminée par la droite de 2 points très proches), tu peux calculer le point d'intersection avec 1 (ou 0), en déduire la valeur de x associée à ce point d'intersection, puis recalculer à nouveau la dérivée (qui n'aura pas le même angle) etc. Il faut s'arrêter à une certaine précision parce que la boucle sera infinie (enfin s'arrêtera à la limite de la précision du calcul float).
Il y a aussi la méthode de la dérivée seconde (qui s'annule sur un minimum ou un maximum). En pratique, prendre 3 points très proches, et si ça forme un V alors c'est un minimum et si ça forme un ^ c'est un maximum.
 

mdj de normandie

Expert
#8
bonjour désolé sa fait 1 mois et demi que je ne me suis pas connecté.
a mon avis vous êtes partis dans un truc extrêmement compliqué et qui malheureusement s'éloigne de ma problématique initial.

de mon coté je suis resté sur mon idée de redresser la sinusoïde avec une courbe en dent de scie, j'ai fait tourner un script pour tester une multitude de combinaison entre mes variables i et f et j'ai trouvé plusieurs combinaisons qui s'approche du résultat que je cherchais, il me reste quelques combinaisons a vérifier mais je pence pouvoir continuer mon projet avec sa.

Quoi qu'il en soit, merci pour votre aide !
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Membres en ligne
  • Willdeaf
  • Malynka
  • Eriendya
  • Titi-78340
  • svoglimacci
Derniers messages publiés
Statistiques globales
Discussions
863 935
Messages
8 042 515
Membres
1 574 452
Dernier membre
Eriendya
Partager cette page
Haut