2016-07-21 21 views
1

Ich habe eine kurze Frage, die in den meisten Sprachen (wie Python) wäre einfach.Bereich unter der Kurve - 1D Array (Java)

Ich suche, um das Integral (Fläche der Kurve) von einem 1D-Array von Fixpunkten zu erhalten. Java hat offensichtlich viele Bibliotheken für numerische Integration, von denen alle eine Funktion (f {double (x)}) als Eingabe erfordern.

Allerdings kann ich keine finden, die Arrays (double []) wie [1,4,10,11] aufnehmen. Ich würde über die Gesamtheit des Arrays werden die Integration von (x-Werte 1-n, wobei n die Größe des Arrays darstellt)

Jede Hilfe sehr

geschätzt
+3

Es ist nicht gerade schwer zu [Regel Simpson] zu implementieren (https (ca.).: //en.wikipedia .org/wiki/Simpson% 27s_rule) für sich selbst ... –

+0

Einverstanden, aber ich würde bevorzugen, optimierte Bibliotheken zu verwenden, basierend auf der Art des Codes, der diese Funktion – user1874538

Antwort

1

Nun, sie erwarten Funktionen, weil seine normale, sie zu nutzen mit einer Kontinuität. Da Sie bei jedem Schritt nur eine andere Höhe haben (1,2,3,4 ...?), Haben Sie Rechtecke mit Dreiecken darauf. Die Höhe der Dreiecke ist die Differenz zwischen der aktuellen Höhe und der vorherigen Höhe. Daher ist die Höhe des Rechtecks ​​die aktuelle Pinthöhe minus Dreieckshöhe. Schreiben Sie eine Funktion, die beide Bereiche berechnet und hinzufügt. Tun Sie dies für jeden Punkt/Element in Ihrem Array und Sie erhalten das Integral Ihrer "Funktion".

EDIT: Ich schrieb einen kleinen Code. keine Garantie, ich habe gerade einen leicht verständlichen Code für die Idee dieses integralen Problems programmiert. Weitere Verbesserungen müssen gemacht werden.

public static double getIntegralFromArray(double[] ar, double xDist) 
    { 
     double base = 0; 
     double prev = 0; 
     double triHeight = 0; 
     double rectHeight = 0; 
     double tri = 0; 
     double rect = 0; 
     double integral = 0; 
     for (int i = 0; i < ar.length; i++) { 
      triHeight=Math.abs(ar[i]-prev); // get Height Triangle 
      tri = xDist*triHeight/2; // get Area Triangle 
      if(ar[i]<=prev){ 
       rectHeight = Math.abs(base-ar[i]); // get Height Rectangle 
      }else { 
       rectHeight = Math.abs(base-(ar[i]-triHeight)); // get Height Rectangle 
      } 
      rect = xDist*rectHeight; // get Area Rectangle 
      integral += (rect + tri); // add Whole Area to Integral 
      prev=ar[i]; 
     } 
     return integral; 
    } 

    double[] ar = new double[]{1,2,3,2,2,3,1,3,0,3,3}; 
    System.out.println(MyMath.getIntegralFromArray(ar, 1)); 

    Area under 'curve': 21.5 
+1

aufrufen wird "und Sie erhalten das Integral Ihrer Funktion "Nun, eine Annäherung an das Integral ... – Fildor

+1

Nun, ich schätze den Aufwand, der in die Lösung gesteckt wurde. Während die Intention der Frage war, herauszufinden, wie es möglich war, dass keine Java - Bibliothek ein endliches Integral von einem Array enthielt, werde ich diese Antwort akzeptieren, bis jemand auf eine optimierte Version zeigen kann, ähnlich wie (http: //docs.scipy .org/doc/numpy/Referenz/erzeugt/numpy.trapz.html). Vielen Dank – user1874538

1

von trapezoidal rule verwenden, können Sie einfach unter Methode aufrufen Fläche unter einer Kurve bekommen

public static double trapz(double ar[],double xDist){ 
     if (ar.length==1 || ar.length==0) 
      return 0; 
     double integral=0; 
     double prev=ar[0]; 
     for (int i=1;i<ar.length;i++) 
     { 
      integral+=xDist*(prev+ar[i])/2.0; 
      prev=ar[i]; 
     } 
     return integral; 
    }