-
1 pièce(s) jointe(s)
Travail sur courbe
Bonjour,
Je reviens demander de l'aide, j'ai un soucis qui maintenant me prend la tête depuis bien trop longtemps, et qui a mon avis ne se résout pas simplement parce que je n'ai plus le niveau en math ...
Allons y ^^
J'ai une courbe, une cinétique bactérienne en fait, elle se caractérise par un phase d'accélération (type exponentielle) suivi d'une phase exponentielle, suivi d'une phase de ralentissement qui mène à une phase stationnaire :
Exemple concret :
http://www.developpez.net/forums/att...1&d=1385992598
Le but de mon algorithme, que je recherche, c'est de récupérer le point durant lequel on passe d'une croissance à une décroissance, plus proprement dit : le point d'inflexion.
Ca c'est dans un monde tout beau tout propre et déjà avoir cet algo m'aiderais beaucoup. Mais il faut comprendre que mes cinétiques à traiter sont des observation du vivant, donc le monde n'est pas beau, pas propre, parfois on a des courbes dégueu... Il me faudrait un algorithme souple, du moins autant que possible (quand une bactérie ne pousse pas, pas la peine de chercher a trouver ce point, si il y est de toute manière il n'aura aucune valeur)
J'ai pensé calculé la différence Y(x1)-Y(x0) Et a partir de la plus grande différence, récupérer l’abscisse que je recherche. Mais malheureusement ça ne prend pas en compte les artefact qui pourrait apparaître en fin de courbe. Il faudrait dans l'idéal "trouver" la phase exponentielle recherché.
J'ai alors tenté de trouver la phase de ralentissement qui suit cette phase exponentielle en partant du postulat que si 5 valeurs consécutives de différences sont inférieur à la précédente, alors on est au bon endroit, mais là encore pour des courbes "lissé", on aura des résultats mauvais.
Je suis sur que je suis aller chercher bien trop loin et quasiment certain que ceux qui ont eu le courage de lire n'ont rien compris a mes réflexions, mais je dois avouer que je ne sais plus trop par quel bout prendre mon problème ...
-
Bonjour,
Est-ce que tu veux utiliser un modèle du genre fonction logistique
pour laquelle on part pratiquement de zéro ensuite on a une phase de croissance raide puis une stabilisation comme ça ?
http://www.bac-de-maths.fr/image/im004574.png
le modèle est f(t)= K / (1+a* e^(-r*t))
avec les points de la courbe observée on peut trouver les valeurs des paramètres K, a et r qui conviennent le mieux.
Précise ce que tu veux car le point d'inflexion en gros c'est celui qui est au milieu du S.(sur l'image son abscisse vaut 80) ou alors le point où le maximum est pratiquement atteint(sur l'image 220 )
-
Bonjour et merci de venir m'aider :)
J'ai regardé ça a une époque par le biais de R (que j'ai du abandonné après, il faut que je fasse ça sans les courbes, uniquement avec les valeurs pour chaque cycle d'une heure) et j'avais pris comme modèle de linéarisation une fonction Logistique à 3 arguments :
f(x) = c + \frac{d-c}{(1+\exp(b(x - e)))^f}
Avec b, d, e comme valeur à récupérer. (les autres valeurs étant nul, j'imagine)
Par R, je recherchais l'une de ces trois valeurs, mais je devais passer par des traitement sur la linéarisation (tel qu'une fixation de l'asymptote haute, le retrait d'un ou plusieurs point aberrants, une troncatures des valeurs pour avoir uniquement le motif qui match bien, ...)
Ca doit correspondent avec ce que tu me donnes, mais dans le même genre, comment traiter ça avec uniquement les valeurs de base, c'est largement au dessus de mon niveau @.@
Sinon oui, je recherche le milieu du S, en théorie dans mon cas, c'est DOmax/2 (soit en math : Ymax/2) Mais dans les faits, la valeur de DOmax n'est pas toujours égale à la valeur de seuil (parfois on aura des artefacts, parfois on aura une deuxième exponentielle qui commencera).
-
Moi je proposerais :
d'abord une moyenne glissante (sur 3 points) ça lissera la courbe
Puis simplement une exploration : ton point d'inflection marque la miite entre ce qui a une pente "verticale" (>> 45 degrés) et horizontale (<< 45 degrés). LE moment où tu détectes que tu bascules, c'est là...
-
1 pièce(s) jointe(s)
En fait il faut résoudre l'équation f''(x)=0 (dérivée seconde)
Si les points connus sont répartis régulièrement (pas h constant)
il y a des formules qui approchent la dérivée seconde
f''(x_i) = (y_{i-1} -2y_i + y_{i+1}) / (h^2)
ou encore mieux
f''(x_i) = ( - y_{i-2} +16y_{i-1} -30y_i +16y_{i+1} - y_{i+2}) / (12h^2)
Sur le dessin tu as f en noir, la dérivée en rouge avec le maximum dont tu parlais dans ton premier post et la dérivée seconde en vert.
C'est plus facile et plus précis de trouver le zéro de la verte que le maximum de la rouge ou que l'inflexion de la noire.
Comme tu veux la valeur qui annule tu peux laisser tomber le dénominateur
12h^2 qui reste constant
Pièce jointe 132151
je ne sais pas pourquoi l'image (en pj ) s'affiche si petit....il faut cliquer dessus pour l'agrandir
-
Je vois deux solutions:
1) La solution matheuse: faire une régression logistique.
Ca permet d'obtenir les paramètres a et r de l'équation f(t)= K / (1+a* e^(-r*t)) donnée par kija13; les calculs sont un peut lourd à implémenter, mais d'autres on sûrement déjà fait ça à ta place;). Ya plus qu'a trouver la lib qui va bien dans ton langage préféré.
2)La solution simpliste:
si pour x=0 tu as toujours y=0, et si pour x suffisamment grand tu as toujours une valeur de y constante (appelons la Y_palier) (sur tes graphs c'est à partir de x=6 ou 7) alors:
tu peut alors chercher l’intervalle [x_i, x_i+1] dans lequel pour x_i on a y<Y_palier/2 et pour x_i+1 on a y>Y_palier/2, puis pour affiner la valeur de x_inflexion, tu fait une simple interpolation linéaire sur [x_i, x_i+1] et tu résous pour y=Y_palier
-
Merci pour votre aide précieuse.
Là ou c'est drôle c'est que j'avais modélisé de tête puis sur une feuille la dérivé première et seconde exactement comme sur ton graphique et que j'avais fini par tout barrer parce que je ne voyais pas comment faire calculer ça à un ordinateur dans un langage pas du tout statistique ^^
J'aimerais partir sur la dérivé seconde du coup, parce qu'elle m'apportera exactement le point que je recherche, et que, du coup, il y a une formule (je ne le savais pas ça).
Maintenant une dernière question : Comment trouver cette formule ? le développement m'intéresse autant voir plus que la solution (solution : utile pour mon employeur; développement : utile pour moi)
Un lien suffirait parce que même ça je trouve pas ^^'
Souviron : ton idée était pas mal, je réutiliserais sans doute le principe de lissage que tu as suggéré.
Bertry : Résoudre une logistique, j'ai le programme pour (R) et une bibliothèque pour l'utiliser dans mon langage (R.NET pour vb.net) mais la librairie ne fonctionne pas aussi bien que je le voudrais, donc j'ai du lacher l'affaire ... Quand à la solution simpliste, j'ai bien peur qu'avec les courbes méchantes que je pourrais avoir et dans l'optique d'avoir quelque chose de suffisamment fiable, ce ne soit pas une solution intéressante.
-
La 2e formule est intéressante car elle utilise 5 points de la courbe donc correspond à une sorte de lissage.
Je n'ai pas de lien, ma réf est le livre de J.P. NOUGIER Méthodes de calcul numérique chez Masson pp 123-133.
On utilise les développement de Taylor
f(x+h)=f(x)+hf'(x)+h^2/2f''(x)+...
je peux te faire quelques pages en pdf
-
J'ai lu tout ça, dans toute mon incompétence j'ai réussi a comprendre environ la méthode, suffisamment pour que ma curiosité se calme un peu, c'est parfait pour mon cas, je lance une série de test. merci encore :)
-
2 pièce(s) jointe(s)
Double post pour donner mes résultats de tests. En pièce jointe se trouve les deux images, original, et dérivée seconde.
Le premier passage d'un Y positif à négatif correspond, mais il y en a plein d'autres qui se forment après. Ca pourrait aller quand même mais uniquement dans un cas ou les irrégularités sont après l'exponentielle, ce qui ne sera pas toujours le cas. (il faut s'imaginer que vu le nombre de données, on peut clairement partir du principe que tout les cas de figures gênant seront a traiter...)