par , 09/04/2020 à 11h18 (1754 Affichages)
Lorsque vous utilisez un Dataframe pour contenir les valeurs x et y d'une courbe périodique il est possible de trouver les minimas et les maximas de cette courbe.
J'ai utilisé la méthode à plusieurs reprises sur des équations de courbes périodiques très diverses, mais je ne peux pas garantir la justesse du résultat (minimas et maximas) dans tous les cas de figure. C'est la raison pour laquelle je vous recommande vivement de toujours comparer le résultat (minimas et maximas) avec le tracé de la courbe périodique (matplotlib).
Lorsqu'un résultat semble étrange par rapport au tracé de la courbe périodique n'oubliez pas de zoomer sur la zone concernée du graphique, car selon son échelle il peut y avoir un plat apparent la où il y a un petit creux ou une petite bosse.
La comparaison de la valeur de deux réels quasi égaux doit se faire avec une petite tolérance (epsilon) pour trouver les minimas et les maximas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #! python3
# coding: utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
epsilon = 1e-7 # tolérance par rapport à 1
# tolérance relative : x + x * epsilon = x * (1 + epsilon)
rtol_plus = (1 + epsilon)
rtol_moins = (1 - epsilon)
pd.options.display.max_rows = 999 # liste au maximum 999 valeurs du Dataframe
""" Exemple y = 1e-12 * np.sin(x) """
x = np.linspace(0, np.pi, 200)
y = [1e-12 * np.sin(item) for item in x]
df = pd.DataFrame({'x': x, 'y': y})
plt.title("1e-12 * np.sin(x)")
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
df['Minimums'] = df['y'][(df['y'].shift(1) > df['y'] * rtol_moins) & (
df['y'].shift(-1) > df['y'] * rtol_moins)]
df['Maximums'] = df['y'][(df['y'].shift(1) < df['y'] * rtol_plus) & (
df['y'].shift(-1) < df['y'] * rtol_plus)]
pd.options.display.max_rows = 999
print(df)
""" Exemple y = 2.0 * np.cos(np.sqrt(2.0 * x)) + 3.0 * np.cos(np.sqrt(3.0 * x) + 5.0 * np.cos(np.sqrt(5.0 * x))) - """
x = np.linspace(0, 5.0 * np.pi, 400)
y = [2.0 * np.cos(np.sqrt(2.0 * item)) + 3.0 * np.cos(np.sqrt(3.0 *
item) + 5.0 * np.cos(np.sqrt(5.0 * item))) for item in x]
df = pd.DataFrame({'x': x, 'y': y})
plt.title("2.0 * np.cos(np.sqrt(2.0 * x)) + 3.0 * np.cos(np.sqrt(3.0 * x) + 5.0 * np.cos(np.sqrt(5.0 * x)))")
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
mng = plt.get_current_fig_manager()
mng.window.state('zoomed') # plot plein écran
plt.show()
df['Minimums'] = df['y'][(df['y'].shift(1) > df['y'] * rtol_moins) & (
df['y'].shift(-1) > df['y'] * rtol_moins)]
df['Maximums'] = df['y'][(df['y'].shift(1) < df['y'] * rtol_plus) & (
df['y'].shift(-1) < df['y'] * rtol_plus)]
print(df) |
Licence Creative Commons Attribution 2.0 Belgique