2012-07-02 22 views
5

Estoy trabajando en un programa que compara dos curvas (resultado de la salida del diodo para su curva de tensión/corriente).Cálculo del área entre dos curvas

Quiero calcular el área entre estas dos curvas (la curva AZUL es el primer diodo y el ROJO es el segundo).

enter image description here

hay 51 puntos de datos para cada curva (que siempre tienen la misma cantidad de poitns de datos). Lo que estoy haciendo en este momento es la siguiente:

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; 
} 

Este código funciona de alguna manera, teniendo en cuenta que no hago nada con (eje vertical) actual. Si el resultado es algo cercano a 0, por ejemplo, 0.05, la diferencia entre las curvas es negable. Pero estoy seguro de que esta no es la manera correcta, no tengo ni idea de cuál es el resultado del método que escribí ... parece ser la diferencia entre los puntos de tensión solamente.

Realmente me complace si me puede ayudar a mejorar este método.

+0

Area of ​​Quadrilateral? –

+2

Saluda a [integral] (http://en.wikipedia.org/wiki/Integral) :) – Reniuz

+0

Dijo, pero dijeron adiós a cambio: PI no tengo idea de cómo puedo integrar usando solo los puntos de datos –

Respuesta

3

Primero reste un diodo del otro, obtenga la diferencia de valores. Luego use la regla trapezoidal, que considera el área bajo una función lineal por partes.

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

Hice lo mismo con una interpolación spline cúbica, y obtuve un área de 15,000 exactamente.Tal vez las salidas de los pines son lo suficientemente lisas como para poder ser tratadas por una spline cúbica en lugar de lineal a nivel de pieza. – ja72

+0

Gracias ja, ¿te importaría explicar un poco más, por favor? ¿Qué menas al sustraer diodos? ¿Se refiere a restar individualmente los puntos de voltaje y los puntos actuales de cada punto de datos respectivo? Además, ¿qué debería pasar como argumento 'h'? ¿Qué significa eso? –

+0

'h' es el paso en el eje' x'. Para cada medición sucesiva si el eje 'x' es el tiempo, entonces es la diferencia en el tiempo. Desea integrar la diferencia tal que 'y [i, 0] = pin2 [i, 0] -pin1 [i, 0]'. – ja72

Cuestiones relacionadas