2012-07-02 11 views
5

के बीच क्षेत्र की गणना करना मैं एक कार्यक्रम पर काम कर रहा हूं जो दो वक्र की तुलना करता है (डायोड आउटपुट से इसके वोल्टेज/वर्तमान वक्र के परिणामस्वरूप)।दो घटता

मैं इस दो घटता के बीच क्षेत्र की गणना करना चाहता हूं (ब्लू वक्र पहला डायोड है और लाल दूसरा है)।

enter image description here

प्रत्येक वक्र के लिए 51 डेटा बिंदुओं रहे हैं (वे हमेशा डेटा poitns की एक ही राशि है)। क्या मैं इस समय कर रहा हूँ इस तरह है:

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

इस कोड को किसी भी तरह से काम करता है, मैं वर्तमान (ऊर्ध्वाधर अक्ष) के साथ कुछ नहीं कर मन में आ रहा है। यदि परिणाम 0 जैसे 0.05 के आसपास कुछ है तो वक्र के बीच का अंतर negetable है। लेकिन मुझे यकीन है कि यह सही तरीका नहीं है, मुझे पूरी तरह से पता नहीं है कि मैंने जो विधि लिखा है उसका नतीजा क्या है ... केवल वोल्ट पॉइंट्स के बीच अंतर दिखता है।

यदि आप इस विधि को बेहतर बनाने में मेरी सहायता कर सकते हैं तो मैं वास्तव में सराहना करता हूं।

+0

चतुर्भुज का क्षेत्र? –

+2

नमस्ते कहें [अभिन्न] (http://en.wikipedia.org/wiki/Integral) :) – Reniuz

+0

ने कहा, लेकिन उन्होंने बदले में अलविदा कहा: पीआई को पता नहीं है कि मैं केवल डेटा बिंदुओं का उपयोग करके एकीकृत कैसे कर सकता हूं –

उत्तर

3

पहले दूसरे से एक डायोड घटाएं मूल्यों में अंतर प्राप्त करें। फिर ट्राइपोज़ाइडल नियम का उपयोग करें, जो एक टुकड़े के अनुसार रैखिक समारोह के तहत क्षेत्र को मानता है।

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

मैंने एक क्यूबिक स्पलीन इंटरपोलेशन के साथ ऐसा किया, और 15.000 का क्षेत्रफल बिल्कुल मिला।हो सकता है कि पिन से आउटपुट टुकड़े के अनुसार रैखिक के बजाय घन स्पिनलाइन द्वारा इलाज करने में सक्षम हो सकें। – ja72

+0

धन्यवाद, क्या आप थोड़ा और बताएंगे? डायोड को घटाने से आप मेन क्या करते हैं? क्या आपका मतलब व्यक्तिगत रूप से वोल्टेज पॉइंट्स और प्रत्येक संबंधित डेटा पॉइंट के वर्तमान बिंदुओं को अलग करता है? तर्क 'एच' के रूप में क्या गुजरना चाहिए? इसका क्या मतलब है? –

+0

'h'' x'-axis में चरण है। प्रत्येक क्रमिक माप के लिए यदि 'x'-axis समय है तो यह समय में अंतर है। आप इस अंतर को एकीकृत करना चाहते हैं कि 'y [i, 0] = pin2 [i, 0] -pin1 [i, 0] '। – ja72

संबंधित मुद्दे