我用odeint
来解一个关于v(t)和u(t)的耦合微分方程。
f = odeint(ODEs, f0, t)
v = f[:,0]
u = f[:,1]
字符串
我想得到x,它是v(t)的积分,所以我有这样一段代码,它使用了scipy.integrate.quad
:
x = lambda t: f[t,0]
delta_x=quad(x, 0,1)
print(delta_x)
型
当我运行这个时,我得到
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
型
而我的笔记本突出显示了f[t,0]。如果函数在积分范围内处处定义,为什么会有索引错误?我如何解决错误或通过另一种方法获得积分?
下面是一个最小的可重复的例子:
import numpy as np
from scipy.integrate import odeint, quad
def ODEs(f,t):
v = f[0]
u = f[1]
dvdt = u-v
dudt = (v-u)/3
return [dvdt, dudt]
f0 = [0.3, 0.2]
t = np.linspace(0,4,10000)
f = odeint(ODEs, f0, t)
v = f[:,0]
u = f[:,1]
x = lambda t: f[t,0]
delta_x=quad(x, 0,1)
print(delta_x)
型
1条答案
按热度按时间mzillmmw1#
正如注解中提到的,
quad
将在不同的点上计算一个 * 函数 *,并以这种方式计算积分。因为你有来自odeint
的离散值,所以你不能使用quad
。相反,你可以使用np.trapz
从离散结果中使用梯形规则执行积分。字符串
或者,您可以将
scipy.integrate.solve_ivp
与dense_output=True
一起使用。ODE集成结果将具有sol
属性,这是一个可以计算的函数。然后可以将其用于quad
。型