Построить интеграл от заданного интервала вокруг позиции х - PullRequest
0 голосов
/ 15 мая 2019

Я хочу построить интеграцию функции с интервалами вокруг позиции x.

Я пробовал это с scipy.integrate.quad и scipy.integrate.cumtrapz, но ни один из них, похоже, не работал. Я думал, что это должно быть довольно распространенной задачей, но я не смог найти пример кода, который мог бы мне помочь. Приведенный ниже код был попыткой заставить меня работать, но он не даст полезного результата.

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate

x = np.linspace(0, 3, num=1000)
def f(v):
    f=np.cos(np.pi*v)+1
    return f
def y_int(v):
    y_int = scipy.integrate.cumtrapz(f(v), x, initial=0)
    return y_int
a=0.5
plt.plot(x, y_int(x+a)-y_int(x-a), 'r-')
plt.plot(x, f(x), 'b-')
plt.show()

1 Ответ

0 голосов
/ 15 мая 2019

Обновление

Я перешел на использование scipy.integrate.quad, так как cumtrapz вызывал проблемы больше нуля.Обратите внимание на троичное условие для предоставления логики initial = 0, которую обеспечивает cumtrapz.

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate

x = np.linspace(0, 3, num = 1000)
a = 0.5
f = lambda v: np.cos(np.pi * v) + 1

def y_int(v):
    integral = scipy.integrate.quad(f, v - a if v > a else 0, v + a)
    return integral[0]

plt.plot(x, f(x), 'b-')
plt.plot(x, np.array(map(y_int, x)), 'r-')
plt.show()

enter image description here

Оригинал

Я переформатировал/ немного подправил ваш код, чтобы мне было легче работать со значениями, которые легче проверять, например, сделать интервал от 0 до 2pi.Я также убрал ваш интервал допуска для проверки, и вы, я полагаю, допустили ошибку, вызвав "v" "x" в функции scipy.integrate.cumtrapz.Здесь это очищено:

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate

x = np.linspace(0, np.pi * 2, num = 1000)

def f(v):
    f=np.cos(np.pi * v)
    return f

def y_int(v):
    y_int = scipy.integrate.cumtrapz(f(v), v, initial=0)
    return y_int

plt.plot(x, f(x), 'b-') #plot the function from 0 to 2pi
plt.plot(x, y_int(x), 'r-')
plt.show()

Выход:

enter image description here

Это производит то, что я ожидаю, кумулятивная площадь под функциейвыглядеть так, как он обнуляется с интервалами в pi / 3 и так как область удваивается каждые (2/3) pi.

Вот ваш код немного очищен, а также в диапазоне от 1 до 4 (с интервалом от 0 до 3, есть что-то в том, что интервал x переходит в отрицательное значение, а первоначальное значение 0 дает странные результаты):

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate

x = np.linspace(1, 4, num = 1000)
a = 0.5

def f(v):
    f=np.cos(np.pi * v) + 1
    return f

def y_int(v):
    y_int = scipy.integrate.cumtrapz(f(v), v, initial=0)
    return y_int

plt.plot(x, f(x), 'b-')
plt.plot(x, y_int(x + a) - y_int(x - a), 'r-')
plt.show()

Вывод:

enter image description here

...