我想将odeint应用于一个初始条件数组,并返回一个与这些初始条件大小相同的导数。我可以循环遍历每个初始条件,但我认为N越大,速度越慢。下面的例子来自docs for odeint。sol_1按预期工作,但sol_2给出错误ValueError: Initial condition y0 must be one-dimensional.
有没有人有一个聪明的解决方案,如何使sol_2运行,而不仅仅是循环每个初始条件?谢谢.
import numpy as np
from scipy.integrate import odeint
def pend(y, t, b, c):
theta, omega = y
dydt = [omega, -b*omega - c*np.sin(theta)]
return dydt
b = 0.25
c = 5.0
t = np.linspace(0, 10, 101)
# 0D initial values, directly from docs
y0_1 = [np.pi - 0.1, 0]
sol_1 = odeint(pend, y0_1, t, args=(b, c))
# 1D initial values, directly from docs
y0_2 = [np.ones((3)) * (np.pi - 0.1), np.zeros((3))]
# Error here
sol2 = odeint(pend, y0_2, t, args=(b, c))
2条答案
按热度按时间fslejnso1#
这基本上和OP写的答案是一样的,但我认为它可能更干净一点。首先,我使用了
flatten
方法,它不像np.ndarray.flatten
函数那样冗长。其次,我将结果展平以传递给ODE函数,在函数内部进行整形以提取值并使用,然后将结果展平以返回。最后,我使用np.split
来提取每个解。ddrv8njm2#
根据hpaulj的评论,我想出了一个解决方案。这不是很好,因为我传递了N,但它确实有效,而且几乎肯定比循环更好。这应该也适用于N维输入,它只需要在最后重新塑造回原始形状。