2016-07-21 16 views
1

私は簡単な質問があります。ほとんどの言語(Pythonなど)ではそれが簡単です。曲線下の領域 - 1D配列(Java)

固定小数点の1次元配列から積分(曲線の面積)を求めることを検討しています。 Javaには明らかに多くの数値統合ライブラリがあり、そのすべてが入力として関数(f {double(x)}を必要とするようです。

しかし、私は[1,4,10,11]のような配列(double [])に対応するものを見つけることはできません。その通常はそれらを使用するので、任意の助けを大幅さて、それらが機能を期待

+3

それは実装に正確に難しいことではありません[シンプソン](HTTPS(約)://en.wikipedia .org/wiki/Simpson%27s_rule)... –

+0

私はこの機能を呼び出すコードの性質に基づいて、最適化されたライブラリを利用することをお薦めします。 – user1874538

答えて

1

を理解されたい

(xは、nは、配列のサイズを表す1-nは、値)がアレイの全体にわたってIは積分されます継続性を持って 各ステップ(1,2,3,4 ...?)ごとに異なる高さしか持たないので、その上に三角形の四角形があります。三角形の高さは、現在の高さと前の高さの差です。したがって、矩形の高さは、現在の高さの高さから三角形の高さを引いた値になります。 両方の領域を計算して加算する関数を記述します。 Array内のすべてのポイント/アイテムに対してこれを行うと、 "関数"の積分値が得られます。

EDIT:コードを少し書きました。保証はありません、私はちょうどこの積分probのアイデアを理解しやすいコードをコーディングしました。更なる改善が行われなければならない。

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

"あなたはあなたの関数の積分を得るでしょう" - まあ、積分の近似... – Fildor

+1

私はその努力を解決に感謝します。この質問の意図は、Javaライブラリに配列の有限の整数が含まれていない可能性があることを理解することでしたが、誰かが最適化されたバージョンを指すようになるまで、この答えを受け入れます(http://docs.scipy .org/doc/numpy/reference/generated/numpy.trapz.html)。ありがとう – user1874538

1

trapezoidal ruleを使用することによって、あなたは、単にグラフの下の面積を取得するための方法の下に呼び出すことができます

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; 
    } 
関連する問題