pour modéliser une fonction polynomiale on peut utiliser la fonction polyfit
comment peut-on faire pour modéliser une fonction exponentielle ?
je précise une modélisation à partir de valeurs contenues dans une liste
merci pour votre aide
pour modéliser une fonction polynomiale on peut utiliser la fonction polyfit
comment peut-on faire pour modéliser une fonction exponentielle ?
je précise une modélisation à partir de valeurs contenues dans une liste
merci pour votre aide
Salut,
Si vous partez d'une liste de points, vous aurez un polynome.... même si cette liste de points sort d'une exponentielle (qui peut être approchée par un polynome de Lagrange).
notez que polyfit a été remplacé par polynomial dans les versions récentes.... et que c'est à vous de choisir la méthode à utiliser (en fonction des données et du domaine).
- W
je vous copie le programme que j'utilise pour une régression linéaire
je récupère ainsi une équation du type y = ax + b.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 t=np.array(t) T=np.array(T) coeff=np.polyfit(t, T,1) Tmodel = coeff[0]*t+coeff[1] print(T={0:.1f}'.format(coeff[0]),'x t+{0:.1f}'.format(coeff[1]))
je veux savoir s'il est possible de faire (et comment) la même chose avec des valeurs qui suivent une fct exponentielle du type y = A.exp(k x) + B (bon le plus B je peux m'en passer si besoin)
le but est de récupérer l'équation de la modélisation
Si vos points sont alignés, le "modèle" sera une droite de la forme y = ax + b.
Mais si ce n'est pas le cas, forcer polyfit à retourner un polynôme de degré 1 est discutable.
A priori, vous ne savez pas quelle fonction a permis de générer vos points... puisque le but est d'en faire un approximation via un polynôme qui va passer par l'ensemble des points.
edit: prenez un nuage de points, le polynome de degré 1 retourné par polyfit sera une extrapolation linéaire... qui pourra être utilisé comme "modèle" modulo une erreur plus ou moins importante. La machine se contente de faire les calculs que vous lui demandez, à vous d'être assez intelligent pour évaluer la pertinence de ce qu'elle sort comme "modèle".
- W
Avec scipy.optimize.curve_fit, vous pouvez étant donné un nuage de point et une fonction que vous avez vous même défini, trouver les meilleurs paramètres de cette fonction pour qu'elle soit le plus proche possible de votre nuage de points. Vous pouvez donc en particulier lui demander un "fit" avec une fonction exponentielle.
Après comme dit précédemment, si vos données n'ont pas vraiment une forme exponentielle alors cette méthode va fournir un résultat, mais résultat qui sera très peu pertinent.
ok je m'approche de ce que je veux faire mais dans ce lien si j'ai bien compris (car je n'ai pas compris toutes les lignes) ils ont une idée de ce que qu'ils vont obtenir et les coefficients sont saisis (2.5 1.3 et 0.5) puis optimisés par Python
moi j'ai une série de valeur et je ne connais pas l'équation, je sais juste qu'elle est de la forme y = a x exp(bx) + c.
exemple
et je veux sortir l'équation modèle de ça sous la forme y = a x exp(bx) + c et que Python me calcule les coeff a ; b et c que je ne connais pas d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 x = np.array([1, 2, 3, 4]) y = np.array([34,223,1619,11929])
ici par exemple c'est de la forme y = 4 x exp(2x) +5.
les valeurs x et y sont bidons la vraie situation c'est un TP de physique où je mesure la température de refroidissement de l'eau en fonction du temps (loi phénoménologique de Newton)
Hello,
Voici comment par exemple utiliser curve_fit dans ton cas de figure :
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 import numpy as np from scipy.optimize import curve_fit ###définition de la fonction à trouver def fonc(x, a, b, c): return a * np.exp(b * x) + c ###valeurs expérimentales valeurs_x = [1, 2, 3, 4] valeurs_y = [34,223,1619,11929] ###recherche des valeurs optimales et de la covariance popt,pcov = curve_fit(fonc, valeurs_x, valeurs_y) print(popt) print(pcov)
Vérification pour 2 par exemple :[4.00806722 1.99951261 4.39047525]
[[ 3.26662429e-08 -2.01155168e-09 -1.43470119e-06]
[-2.01155168e-09 1.23980694e-10 8.68693128e-08]
[-1.43470119e-06 8.68693128e-08 1.27109443e-04]]
Rappel de l'équation de la loi de refroidissement de Newton :In[1]: (4.00806722*np.exp(2* 1.99951261)) + 4.39047525
Out[1]: 223.01032051810336
T(t) = Ta + (T(0) − Ta).exp( − k.t)
La loi de refroidissement de Newton stipule que le taux de perte de chaleur d'un corps est directement proportionnel à la différence de température entre le corps et son environnement.
Ami calmant, J.P
Le code d'exemple de la doc est :
Donc non, au moment où curve_fit est appelé, ils cette méthode n'a aucune idée des paramètres. Là on se donne des paramètres juste pour générer des données, que l'on bruite pour avoir un ydata, et puis après étant donné ce ydata, en oubliant tous le reste, on se demande si on est capable de retrouver les paramètres (ou presque à peu de chose près) que l'on s'était donné au départ pour générer les données. C'est une manière maligne de vérifier que l'algo fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 xdata = np.linspace(0, 4, 50) y = func(xdata, 2.5, 1.3, 0.5) rng = np.random.default_rng() y_noise = 0.2 * rng.normal(size=xdata.size) ydata = y + y_noise plt.plot(xdata, ydata, 'b-', label='data') popt, pcov = curve_fit(func, xdata, ydata) plt.plot(xdata, func(xdata, *popt), 'r-', label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
Si vous avez directement ydata, bon et bien très bien les 3 dernières lignes de code vous suffisent, et ça répond pleinement à votre besoin !
ok cela a l'air de fonctionner, je vais tester avec des valeurs extraites de la carte arduino; je vous dirai ce que cela donne
merci
bon la modélisation n'a pas marché avec mes mesures expérimentales, le programme donnait 1 pour chaque paramètre
je retesterai en important un fichier csv de mesures car un peu long de tester en direct
mais merci pour votre aide la modélisation avec la liste saisie manuellement dans le programme fonctionne
Si ca fonctionne lorsque vous rentrez les valeurs à la main, c'est que la partie optimisation des paramètres de la fonction exponentielle fonctionne. Donc si avec le csv ça ne marche pas, c'est que vous avez un souci en amont. Ca peut être la structure de vos données, leur type, etc .... Faites des print pour vous rendre compte de ce qu'il y a dans les variables de votre programme.
Partager