python 积分用ODEint求解的ODE的解时的IndexError

xienkqul  于 2024-01-05  发布在  Python
关注(0)|答案(1)|浏览(149)

我用odeint来解一个关于v(t)和u(t)的耦合微分方程。

  1. f = odeint(ODEs, f0, t)
  2. v = f[:,0]
  3. u = f[:,1]

字符串
我想得到x,它是v(t)的积分,所以我有这样一段代码,它使用了scipy.integrate.quad

  1. x = lambda t: f[t,0]
  2. delta_x=quad(x, 0,1)
  3. print(delta_x)


当我运行这个时,我得到

  1. IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices


而我的笔记本突出显示了f[t,0]。如果函数在积分范围内处处定义,为什么会有索引错误?我如何解决错误或通过另一种方法获得积分?
下面是一个最小的可重复的例子:

  1. import numpy as np
  2. from scipy.integrate import odeint, quad
  3. def ODEs(f,t):
  4. v = f[0]
  5. u = f[1]
  6. dvdt = u-v
  7. dudt = (v-u)/3
  8. return [dvdt, dudt]
  9. f0 = [0.3, 0.2]
  10. t = np.linspace(0,4,10000)
  11. f = odeint(ODEs, f0, t)
  12. v = f[:,0]
  13. u = f[:,1]
  14. x = lambda t: f[t,0]
  15. delta_x=quad(x, 0,1)
  16. print(delta_x)

mzillmmw

mzillmmw1#

正如注解中提到的,quad将在不同的点上计算一个 * 函数 *,并以这种方式计算积分。因为你有来自odeint的离散值,所以你不能使用quad。相反,你可以使用np.trapz从离散结果中使用梯形规则执行积分。

  1. import numpy as np
  2. from scipy.integrate import odeint
  3. def ODEs(f,t):
  4. v, u = f
  5. dvdt = u - v
  6. dudt = -dvdt/3
  7. return [dvdt, dudt]
  8. f0 = [0.3, 0.2]
  9. # changed t to the range you want the later integral over
  10. t = np.linspace(0, 1, 1000)
  11. f = odeint(ODEs, f0, t)
  12. v, u = f.T
  13. integral = np.trapz(v, t)
  14. print(integral) # 0.266422665699249

字符串
或者,您可以将scipy.integrate.solve_ivpdense_output=True一起使用。ODE集成结果将具有sol属性,这是一个可以计算的函数。然后可以将其用于quad

  1. import numpy as np
  2. from scipy.integrate import solve_ivp, quad
  3. # Note solve_ivp by default expect 't' to be first
  4. def ODEs(t, f):
  5. v, u = f
  6. dvdt = u - v
  7. dudt = -dvdt/3
  8. return [dvdt, dudt]
  9. f0 = [0.3, 0.2]
  10. t_span = [0, 4]
  11. f = solve_ivp(ODEs, t_span, f0, dense_output=True)
  12. integral = quad(lambda t: f.sol(t)[0], 0, 1)
  13. # the first term is the integral result and the second is the error
  14. print(integral) # (0.2663479453362735, 4.315387022498807e-09)

展开查看全部

相关问题