Наиболее эффективный способ вычисления интеграла в диапазоне набора данных - PullRequest
1 голос
/ 11 января 2011

У меня есть массив из 10 строк по 20 столбцов. Каждый столбец соответствует набору данных, который не может быть снабжен какой-либо непрерывной математической функцией (это серия чисел, полученных экспериментальным путем). Я хотел бы вычислить интеграл каждого столбца между строкой 4 и строкой 8, а затем сохранить полученный результат в новом массиве (20 строк x 1 столбец).

Я пытался использовать разные модули scipy.integrate (например, quad, trpz, ...).

Проблема в том, что, насколько я понимаю, scipy.integrate должен применяться к функциям, и я не уверен, как преобразовать каждый столбец моего исходного массива в функцию. В качестве альтернативы я подумал о том, чтобы вычислить среднее значение каждого столбца между строкой 4 и строкой 8, затем умножить это число на 4 (т.е. 8-4 = 4, интервал x) и затем сохранить его в моем окончательном массиве 20x1. Проблема в том ... эм ... что я не знаю, как рассчитать среднее значение для данного диапазона. Вопрос, который я задаю:

  1. Какой метод является более эффективным / простым?
  2. Можно ли рассчитать интегралы по набору данных, подобному тому, который я описал?
  3. Как рассчитать среднее значение по диапазону строк?

Ответы [ 2 ]

4 голосов
/ 27 января 2011

Поскольку вы знаете только точки данных, лучшим выбором будет использование trapz (трапецеидальное приближение к интегралу, основанное на точках данных, которые вы знаете).

Скорее всего, вы не хотитепреобразовывать ваши наборы данных в функции, и с trapz вам не нужно.

Так что, если я правильно понимаю, вы хотите сделать что-то вроде этого:

from numpy import *

# x-coordinates for data points
x = array([0, 0.4, 1.6, 1.9, 2, 4, 5, 9, 10])

# some random data: 3 whatever data sets (sharing the same x-coordinates)
y = zeros([len(x), 3])
y[:,0] = 123
y[:,1] = 1 + x
y[:,2] = cos(x/5.)
print y

# compute approximations for integral(dataset, x=0..10) for datasets i=0,1,2
yi = trapz(y, x[:,newaxis], axis=0)
# what happens here: x must be an array of the same shape as y
# newaxis tells numpy to add a new "virtual" axis to x, in effect saying that the
# x-coordinates are the same for each data set

# approximations of the integrals based the datasets
# (here we also know the exact values, so print them too)
print yi[0], 123*10
print yi[1], 10 + 10*10/2.
print yi[2], sin(10./5.)*5.
2 голосов
/ 11 января 2011

Чтобы получить сумму записей от 4 до 8 (включая оба конца) в каждом столбце, используйте

a = numpy.arange(200).reshape(10, 20)
a[4:9].sum(axis=0)

(Первая строка просто для создания примера массива желаемой формы.)

...