我想知道是否有可能解决一个向量的常微分方程的scipy。
以下是scipy页面上的一个例子:
import numpy as np
from scipy.integrate import solve_ivp
def lotkavolterra(t, z, a, b, c, d):
x, y = z
return [a*x - b*x*y, -c*y + d*x*y]
sol = solve_ivp(lotkavolterra, [0, 15], [10, 5], args=(1.5, 1, 3, 1),
dense_output=True)
t = np.linspace(0, 15, 300)
z = sol.sol(t)
如果我在一个solve_ivp
调用中有一个初始条件和参数的向量,我能解出这个方程吗?
ICs = np.random.rand(10, 2)
args = np.random.rand(10, 4)
1条答案
按热度按时间t3psigkw1#
是的,这是可能的,但不推荐。
1.因为你改变了参数,所以常微分方程的解将受到最严格的常微分方程的限制(因为它们都是同时被计算的)。这可能会导致代码变慢。
1.这不是预期的功能,而是对代码的滥用。它需要小心如何创建和使用变量
尽管如此,我还是会告诉你如何做到这一点。在我们开始之前,我们必须了解求解器的要求。
y0
必须是1D的,所以你需要在函数中展平变量并重塑它们。args
将分割变量,因此它们必须放在一个numpy数组中,该数组放置在一个元组中,该元组作为一个参数传递。1.您必须对所有模拟使用相同的
t_span
和函数。要创建兼容的
y0
和args
,您可以执行以下操作:在这里,
N
是您一次执行的模拟数量。每个模拟有2个变量和4个参数。请注意y0
是如何展开的,args
是如何放置在元组中的。对于这个函数,你现在需要接受一个单独的参数,这个参数将在里面被分割。而且,如前所述,您需要重新塑造解决方案向量。对于我上面使用的形式,我们需要将其展平,以便每个模拟解决方案都保持在一起,因此在展平之前需要转置。在提取变量时也需要撤销转置,这就是为什么在定义
x
和y
时要进行整形和转置。总的来说,我们有:
结果:
同样,这不是正确的方法,可能不应该使用。但最终,你是程序员,可以决定你想做什么。