2016-07-21 3 views
1

У меня есть быстрый вопрос, что на большинстве языков (например, python) было бы просто.Area Under Curve - 1D Array (Java)

Я ищу, чтобы получить интеграл (площадь кривой) из 1D-массива неподвижных точек. Java, по-видимому, имеет множество библиотек с числовой интеграцией, каждая из которых, по-видимому, требует ввода функции (f {double (x)}).

Однако я не могу найти какие-либо массивы (double []), такие как [1,4,10,11]. Я бы интегрированием по полноте массива (х значения 1-п, где п представляет размер массива)

Любая помощь очень ценится

+3

Это не совсем трудно реализовать [Симпсона] (протокол HTTPS (прибл.): //en.wikipedia .org/wiki/Simpson% 27s_rule) для себя ... –

+0

Согласен, однако я бы предпочел использовать оптимизированные библиотеки, основываясь на характере кода, который будет вызывать эту функцию – user1874538

ответ

1

Ну, они ожидают, что функции, потому что его нормально использовать их с непрерывностью. Поскольку у вас есть только разные высоты на каждом шаге (1,2,3,4 ...?), У вас есть прямоугольники с треугольниками сверху. высота треугольников - это разница между текущей высотой и предыдущей высотой. поэтому высота прямоугольника s - это текущая высота пинты минус высота треугольника. Напишите функцию, которая вычисляет и добавляет обе области. Сделайте это для каждой точки/предмета в вашем массиве, и вы получите интеграл от вашей «функции».

EDIT: Я написал небольшой код. нет гарантии, я просто закодировал некоторый простой для понимания код идеи этой интегральной задачи. Дальнейшие улучшения должны быть сделаны.

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 не содержала конечный интеграл из массива, я соглашусь с этим ответом, пока кто-то не укажет на оптимизированную версию Akin to (http: //docs.scipy .org/DOC/NumPy/ссылка/полученные/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; 
    }