2012-07-02 20 views
5

Sto lavorando a un programma che confronta due curve (derivate dall'uscita diodo quindi dalla sua curva di tensione/corrente).Calcolo dell'area tra due curve

Voglio calcolare l'area tra queste due curve (la curva BLU è il primo diodo e ROSSO è la seconda).

enter image description here

Ci sono 51 punti di dati per ciascuna curva (hanno sempre stessa quantità di dati poitns). Quello che sto facendo in questo momento è come questo:

public double CalculateArea(double[,] pin1, double[,] pin2) 
{ 
    double voltageArea = 0; 
    double currentArea = 0; //Current (Vertical axis) not yet! 
    double max = 0; 
    double min = 0; 

    for (int i = 0; i < pin1.GetLength(0); i++) 
    { 
     max = Math.Max(Math.Abs(pin1[i, 0]), Math.Abs(pin2[i, 0])); 
     min = Math.Min(Math.Abs(pin1[i, 0]), Math.Abs(pin2[i, 0])); 

     voltageArea += max - min; 
    } 

    return voltageArea; 
} 

Questo codice funziona in qualche modo, avendo in mente non faccio niente con corrente (asse verticale). Se il risultato è qualcosa vicino a 0 per esempio 0,05 allora la differenza tra le curve è negetable. Ma sono sicuro che questo non è il modo corretto, non ho assolutamente idea di quale sia il risultato del metodo che ho scritto ... sembra essere la differenza tra solo i punti di tensione.

Sono davvero grato se puoi aiutarmi a migliorare questo metodo.

+0

Area di quadrilatero? –

+2

Saluta [integrale] (http://en.wikipedia.org/wiki/Integral) :) – Reniuz

+0

Detto, ma hanno detto ciao in cambio: PI non ha idea di come posso integrare utilizzando solo i punti dati –

risposta

3

Prima sottrarre un diodo all'altro per ottenere la differenza nei valori. Quindi utilizzare la regola trapezoidale, che considera l'area sotto una funzione lineare a tratti.

class Program 
{ 
    /// <summary> 
    /// Calculate integral with trapezoidal rule 
    /// </summary> 
    /// <param name="h">The step size in x-axis</param> 
    /// <param name="y">The array of values to integrate</param> 
    /// <returns>The area under the curve y[i,0]</returns> 
    public static double Integrate(double h, double[,] y) 
    { 
     int N=y.GetLength(0); 

     double sum=(y[0, 0]+y[N-1, 0])/2; 

     for(int i=1; i<N-1; i++) 
     { 
      sum+=y[i, 0]; 
     } 

     return h*sum; 
    } 

    static void Main(string[] args) 
    { 
     int N = 100; 
     double[,] y=new double[N, 1]; 

     for(int i=0; i<y.GetLength(0); i++) 
     { 
      y[i, 0]=5+5*Math.Sin(2*Math.PI*i/(N-1)); 
     } 

     double x_min=0.5; 
     double x_max=3.5; 
     double h = (x_max-x_min)/N; 

     double area=Integrate(h, y); 
     // expected answer is area = 15.00 
     // actual answer is  area = 14.85 
    } 
} 
+0

Ho fatto lo stesso con un'interpolazione di spline cubiche e ho ottenuto esattamente un'area di 15.000.Forse le uscite dei pin sono abbastanza lisce da poter essere trattate da una spline cubica invece che da un punto lineare. – ja72

+0

Grazie ja, ti dispiacerebbe spiegare un po 'di più per favore? Cosa fai mena sottraendo i diodi? Intendi singolarmente i punti di tensione e i punti di corrente di ogni rispettivo punto dati? Anche cosa dovrebbe passare come argomento 'h'? cosa significa? –

+0

'h' è il passo nell'asse' x'. Per ogni misura successiva se l'asse 'x' è il tempo allora è la differenza di tempo. Vuoi integrare la differenza in modo che 'y [i, 0] = pin2 [i, 0] -pin1 [i, 0]'. – ja72

Problemi correlati