在x

时间:2019-05-15 14:56:02

标签: python matplotlib scipy jupyter integrate

我想绘制一个在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 :(得分:0)

更新

我切换到使用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。我还删除了您的公差间隔以进行检查,并且您相信在scipy.integrate.cumtrapz函数中调用“ v”“ x”时出错。在这里清理:

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