Числовая интеграция в numpy

Я хочу сделать что-то совсем простое, но не могу найти в глубинах numpy. Я хочу численно и непрерывно интегрировать функцию, заданную ее значениями (не ее формулой!). Это означает, что мне просто нужен массив, содержащий суммы начала входного массива. Пример:

Вход:

[ 4, 3, 5, 8 ]

Выход:

[ 4, 7, 12, 20 ]  # [ sum(i[0:1]), sum(i[0:2]), sum(i[0:3]), sum(i[0:4]) ]

Звучит довольно прямолинейно, поэтому я надеюсь, что это должно быть легко с некоторыми numpy функциями, которые я в настоящее время не могу найти.

Я нашел такие вещи, как scipy.integrate.quad(), но они, похоже, интегрируются в заданном диапазоне (от a до b) и возвращают одно значение. Мне нужен массив в качестве вывода.


person Alfe    schedule 06.04.2017    source источник
comment
Как эта интеграция?   -  person Arya McCarthy    schedule 07.04.2017
comment
Выходом являются значения функции стебля функции, которая производит значения входа.   -  person Alfe    schedule 07.04.2017
comment
Ах, попался. Для будущих читателей: здесь выглядит основная функция. Затем используем суммы Римана.   -  person Arya McCarthy    schedule 07.04.2017
comment
@aryamccarthy Можете ли вы уточнить, почему вы не считаете совокупную сумму числовой интеграцией? Я не вижу здесь смысла, и ссылка, которую вы предоставили, тоже не помогла.   -  person Alfe    schedule 07.04.2017
comment
Я обычно рассматриваю числовое интегрирование как имеющее функцию для оценки, как это делает ode45< /а> будет. Это кумулятивное суммирование является важной частью этого процесса.   -  person Arya McCarthy    schedule 07.04.2017
comment
Численное интегрирование — это процесс аппроксимации интеграла по заданной области и функции. Поскольку у вас уже есть стволовая функция, этот вопрос не касается численного интегрирования.   -  person Nico Schlömer    schedule 10.04.2017
comment
@NicoSchlömer Ты ошибаешься. У меня нет доступной функции ствола; Я хочу создать его в процессе. Под этим я подразумеваю ее ценности, а не ее формулу. Отсюда интеграция. Но называйте это как хотите.   -  person Alfe    schedule 11.04.2017


Ответы (3)


Вы ищете numpy.cumsum:

   >>> numpy.cumsum([ 4, 3, 5, 8 ])
   array([ 4,  7, 12, 20])
person sfjac    schedule 06.04.2017

Вам просто понадобится numpy.cumsum().

import numpy as np
a = np.array([ 4, 3, 5, 8 ])
print np.cumsum(a) # prints [ 4  7 12 20]
person ImportanceOfBeingErnest    schedule 06.04.2017

Вы можете использовать quadpy (pip install quadpy), мой проект, который, в отличие от scipy.integrate.quad(), выполняет векторизованные вычисления. Предоставьте ему много интервалов и верните все интегральные значения по этим интервалам.

import numpy
import quadpy

a = 0.0
b = 3.0
h = 1.0e-2
n = int((b-a) / h)

x0 = numpy.linspace(a, b, num=n, endpoint=False)
x1 = x0 + h
intervals = numpy.stack([x0, x1])

vals = quadpy.line_segment.integrate(
        lambda x: numpy.sin(x),
        intervals,
        quadpy.line_segment.GaussLegendre(5)
        )

res = numpy.cumsum(vals)

import matplotlib.pyplot as plt
plt.plot(x1, numpy.sin(x1), label='f')
plt.plot(x1, res, label='F')
plt.legend()
plt.show()

введите здесь описание изображения

person Nico Schlömer    schedule 11.04.2017
comment
Ницца! Но на самом деле у меня просто есть куча чисел, которые я хочу постоянно суммировать (и теперь я знаю, что np.cumsum() делает это. Кто-то, однако, нашел мою формулировку для этого (числового интегрирования) настолько вводящей в заблуждение, что он перефразировал мой вопрос так фундаментально, что в В конце это выглядело так, как будто я искал функции. Я отменил это (на мой взгляд, слишком строгое) изменение. Я думаю, ваш ответ был дан в этот период. - person Alfe; 11.04.2017
comment
@Nico Вы не можете просто отредактировать вопрос таким образом, чтобы он позволил вам написать ответ, основной целью которого, по-видимому, является продвижение вашего программного обеспечения. - person ImportanceOfBeingErnest; 11.04.2017
comment
@ImportanceOfBeingErnest Спасибо за ответ. Вопрос был очень неясен, особенно его связь с численным интегрированием; см. обсуждение под исходным постом. Из I don't have the stemfunction available; I want to create it in the process. [...] я понял, что вопрос действительно об этом. Я приступил к редактированию поста соответствующим образом и после некоторой обработки дал ответ, а именно тот, который создает первообразную производную. Я действительно использую пакет, который написал, но не вижу в этом ничего плохого. - person Nico Schlömer; 11.04.2017