J'ai une liste de 100 nombres comme hauteur pour l'axe des Y et comme longueur pour l'axe des X: 1 à 100 avec un pas constant de 5. J'ai besoin de calculer la surface qui est incluse par la courbe du (x, y) points et l'axe X, en utilisant des rectangles et Scipy. Dois-je trouver la fonction de cette courbe? ou pas? ... presque tous les exemples que j'ai lus concernent une équation spécifique pour l'axe Y. Dans mon cas, il n'y a pas d'équation, juste des données d'une liste. La solution classique consiste à ajouter ou les points Y et multiples par la distance de l'étape X ... en utilisant Scipy une idée?
S'il vous plaît, quelqu'un peut-il recommander un livre qui se concentre sur les méthodes numériques (élémentaires finis), en utilisant Scipy et Numpy? ...
Les bibliothèques numpy et scipy incluent les règles composites trapézoïdales ( numpy.trapz ) et Simpson ( scipy.integrate.simps ).
Voici un exemple simple. Dans trapz
et simps
, l'argument dx=5
indique que l'espacement des données le long de l'axe x est de 5 unités.
from __future__ import print_function
import numpy as np
from scipy.integrate import simps
from numpy import trapz
# The y values. A numpy array is used here,
# but a python list could also be used.
y = np.array([5, 20, 4, 18, 19, 18, 7, 4])
# Compute the area using the composite trapezoidal rule.
area = trapz(y, dx=5)
print("area =", area)
# Compute the area using the composite Simpson's rule.
area = simps(y, dx=5)
print("area =", area)
Sortie:
area = 452.5
area = 460.0
Vous pouvez utiliser règle Simpsons ou règle Trapezium pour calculer l'aire sous un graphique à partir d'un tableau de valeurs y à intervalle régulier.
Script Python qui calcule la règle Simpsons:
def integrate(y_vals, h):
i = 1
total = y_vals[0] + y_vals[-1]
for y in y_vals[1:-1]:
if i % 2 == 0:
total += 2 * y
else:
total += 4 * y
i += 1
return total * (h / 3.0)
h
est le décalage (ou écart) entre les valeurs y et y_vals
est un tableau de valeurs bien, y.
Exemple (dans le même fichier que la fonction ci-dessus):
y_values = [13, 45.3, 12, 1, 476, 0]
interval = 1.2
area = integrate(y_values, interval)
print("The area is", area)
Si sklearn n'est pas installé, une alternative simple consiste à utiliser sklearn.metrics.auc
Ceci calcule l'aire sous la courbe en utilisant la règle trapézoïdale étant donné un tableau arbitraire x et y
import numpy as np
from sklearn.metrics import auc
dx = 5
xx = np.arange(1,100,dx)
yy = np.arange(1,100,dx)
print('computed AUC using sklearn.metrics.auc: {}'.format(auc(xx,yy)))
print('computed AUC using np.trapz: {}'.format(np.trapz(yy, dx = dx)))
les deux produisent la même zone: 4607,5
l'avantage de sklearn.metrics.auc est qu'il peut accepter un tableau 'x' espacé arbitrairement, assurez-vous simplement qu'il est ascendant sinon les résultats seront incorrects