scipy python中的矢量化问题

bogh5gae  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(220)

我有一个应用程序,我需要合并从python中的scipy.integrate.solve_ivp获得的两个解决方案。实际的应用程序有点复杂,但下面的例子说明了这个想法:

from scipy.integrate import solve_ivp import numpy as np

def lotkavolterra(t, z, a, b, c, d):

    x, y = z

    return [a*x - b*x*y, -c*y + d*x*y]

sol_1 = solve_ivp(lotkavolterra, [0, 10], [10, 5], args=(1.5, 1, 3, 1), dense_output=True).sol  
sol_2 = solve_ivp(lotkavolterra, [10, 15], [10, 5], args=(1.5, 1, 3, 1), dense_output=True).sol

def sol_comb(t):

    if t <= 10:
        return sol_1(t)
    else:
        return sol_2(t)

我希望能够在numpy数组上使用合并或组合的解sol_comb。因此,我尝试定义一个矢量化的解,如下所示:

sol_comb_vect = np.vectorize(sol_comb)

下面的代码只调用标量上的函数,运行良好:

print("sol_1 for t = 2",sol_1(2)) 
print("sol_2 for t = 11",sol_2(11))
print("sol_comb for t = 11",sol_comb(11))
print("sol_comb_vect for t = 11",sol_comb_vect(11))

单个解sol_1sol_2显然是矢量化的,因为下面的表达式可以正常工作:

print("sol_1 for t = [2,3]",sol_1(np.array([2])))
print("sol_2 for t = [11,13]",sol_2(np.array([11,13])))

但是,如果我对一个数组调用非矢量化函数sol_comb,如下面的示例所示,我将得到预期的ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

print("sol_comb for t = [11,13]",sol_comb(np.array([11,13])))

我希望矢量化版本sol_comb_vect可以工作。

print("sol_comb_vect for t = [11,13]",sol_comb_vect(np.array([11,13])))

有什么办法解决这个问题吗?
我也很乐意以一种更简洁的方式合并两个OdeSolution示例,原则上我认为这是可能的,分别使用sol_1sol_2的时间值和插值。

yx2lnoni

yx2lnoni1#

我认为在对函数进行矢量化时,需要指定输出的签名,因为默认情况下,传递给np.vectorize()的 pyfunc 被假定为将标量作为输入和输出see doc。我假定您的ValueError是由它引起的。因此,尝试以下操作:

sol_comb_vect = np.vectorize(sol_comb, signature='()->(n)')
sol_comb_vect(np.array([2, 11, 13]))

输出:

array([[0.60031288, 0.09618044],
       [0.21298705, 1.36999868],
       [2.58274789, 0.01857732]])

我不知道这是否是预期的输出tho。我希望这回答了你的问题。

相关问题