python - limites - programa para calcular el area bajo la curva
Cálculo del área bajo una curva dado un conjunto de coordenadas, sin conocer la función (3)
Tengo una lista de 100 números como altura para el eje Y, y como longitud para el eje X: 1 a 100 con un paso constante de 5. Necesito calcular el área que está incluida por la curva de (x, y) Puntos, y el eje X, utilizando rectángulos y Scipy. ¿Tengo que encontrar la función de esta curva? ¿o no? ... casi todos los ejemplos que he leído son sobre una ecuación específica para el eje Y. En mi caso no hay ecuación, solo datos de una lista. La solución clásica es agregar o los puntos Y y múltiples por el paso X distancia ... ¿utilizando Scipy alguna idea?
Por favor, ¿alguien puede recomendar cualquier libro que se centre en métodos numéricos (elementales finitos), usando Scipy y Numpy? ...
Las bibliotecas numpy y scipy incluyen las reglas compuestas trapezoidales ( numpy.trapz ) y Simpson ( scipy.integrate.simps ).
Aquí hay un ejemplo simple. Tanto en trapz
como en trapz
, el argumento dx=5
indica que el espaciado de los datos a lo largo del eje x es de 5 unidades.
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)
Salida:
area = 452.5
area = 460.0
Puede usar la regla de Simpsons o la regla de Trapezium para calcular el área bajo una gráfica dada una tabla de valores y en un intervalo regular.
Script de Python que calcula la regla de los 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
es el desplazamiento (o brecha) entre los valores y, y y_vals
es una matriz de valores de pozo, y.
Ejemplo (en el mismo archivo que la función anterior):
y_values = [13, 45.3, 12, 1, 476, 0]
interval = 1.2
area = integrate(y_values, interval)
print("The area is", area)
Si no ha llamado sklearn, una alternativa simple es usar sklearn.metrics.auc
Esto calcula el área bajo la curva usando la regla trapezoidal dada la matriz arbitraria xy la matriz 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)))
ambos dan salida a la misma área: 4607.5
La ventaja de sklearn.metrics.auc es que puede aceptar una matriz ''x'' espaciada arbitrariamente, solo asegúrese de que esté ascendiendo, de lo contrario los resultados serán incorrectos