我有一个应用程序,我需要合并从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_1
和sol_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_1
和sol_2
的时间值和插值。
1条答案
按热度按时间yx2lnoni1#
我认为在对函数进行矢量化时,需要指定输出的签名,因为默认情况下,传递给np.vectorize()的 pyfunc 被假定为将标量作为输入和输出see doc。我假定您的ValueError是由它引起的。因此,尝试以下操作:
输出:
我不知道这是否是预期的输出tho。我希望这回答了你的问题。