web-dev-qa-db-fra.com

Calcul de l'aire sous une courbe à partir d'un ensemble de coordonnées, sans connaître la fonction

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? ...

38
user1640255

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
55
Warren Weckesser

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)
17
Will Richardson

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

4
khuang834