我想绘制一个在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()
答案 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()
我对您的代码进行了一些重新格式化/调整,以便可以使用更易于验证的值,例如将时间间隔设置为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()
输出:
这会产生我期望的功能下的累积面积,因为它以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()
输出: