2012-11-10 18 views
21

Ho una lista di 100 numeri come altezza per l'asse Y e come lunghezza per l'asse X: da 1 a 100 con un passo costante di 5. I è necessario calcolare l'Area che è inclusa dalla curva dei punti (x, y) e l'asse X, usando i rettangoli e Scipy. Devo trovare la funzione di questa curva? o no? ... quasi tutti gli esempi che ho letto riguardano un'equazione specifica per l'asse Y. Nel mio caso non c'è un'equazione, solo dati da una lista. La soluzione classica è aggiungere o i punti Y e multipli per il passo X distanza ... usando Scipy qualche idea?Calcolo dell'area sotto una curva dato un insieme di coordinate, senza conoscere la funzione

Per favore, qualcuno può raccomandare qualsiasi libro che si concentra sui metodi numerici (elementari finiti), usando Scipy e Numpy? ...

risposta

11

È possibile utilizzare la regola Simpsons o la regola Trapezium per calcolare l'area sotto un grafico data una tabella di valori y a intervalli regolari.

Simpsons rule

Trapezium rule

Se la matematica non è la vostra cosa, lasciare un commento e io lo spiego ulteriormente.

script Python che calcola Simpson regola:

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 è l'offset (o gap) tra i valori y, e y_vals è un array di valori ben, y.

Esempio (Nella stessa lima come sopra funzione):

y_values=[13, 45.3, 12, 1, 476, 0] 
interval=1.2 
area=integrate(y_values, interval) 
print "The area is", area 
+0

+1. Bei collegamenti utili e includono anche le implementazioni di Python :) – nbrooks

+0

Grazie! la matematica è la mia cosa !, pitone non lo è! novizio ... Non ho fatto la nuova regola di Simpson ... grazie! semplicemente mostralo ... – user1640255

+0

Non so se Scipy ne abbia uno, non dovrebbe essere troppo difficile fare una funzione per te stesso (potrei farne uno .. Ho un po 'di tempo libero;) – javanut13

37

Il NumPy e biblioteche SciPy includono il trapezio composita (numpy.trapz) e (scipy.integrate.simps) regole di Simpson.

Ecco un semplice esempio. In entrambi trapz e simps, l'argomento dx=5 indica che la spaziatura dei dati lungo l'asse x è di 5 unità.

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) 

uscita:

area = 452.5 
area = 460.0 
+0

è fantastico! ... Entrambe le risposte mi aiutano a capire e risolvere tutte le domande che ho avuto. Vorrei chiedere una parente ... Ti consiglia di utilizzare gli array e non la lista? è qualcosa che aiuta l'utente? o la logica e la velocità dell'algoritmo? – user1640255

+1

La prima cosa che fanno le funzioni 'trapz' e' simps' è convertire l'argomento 'y' in un array numpy, quindi non ha molta importanza. Potresti guardare il tuo codice che genera i valori 'y', e vedere se questo trarrebbe beneficio dall'uso di funzioni addizionali numpy o scipy. Se è così, 'y' sarebbe già un array quando lo passate a' simps'. –

Problemi correlati