传递args for solve_ivp(新的SciPy ODE API)

sha*_*mas 14 python numpy scipy ode odeint

为了使用SciPy解决简单的ODE,我曾经使用odeint函数,其形式为:

scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0)[source]
Run Code Online (Sandbox Code Playgroud)

要集成的简单函数可以包含表单的其他参数:

def dy_dt(t, y, arg1, arg2):
    # processing code here
Run Code Online (Sandbox Code Playgroud)

在SciPy 1.0中,似乎odeodeint函数已被更新的solve_ivp方法所取代.

scipy.integrate.solve_ivp(fun, t_span, y0, method='RK45', t_eval=None, dense_output=False, events=None, vectorized=False, **options)
Run Code Online (Sandbox Code Playgroud)

但是,这似乎没有提供args参数,也没有提供文档中关于实现args传递的任何指示.

因此,我想知道是否可以使用新API进行arg传递,或者这是一个尚未添加的功能?(如果故意删除这些功能,对我来说似乎是一种疏忽?)

参考:https: //docs.scipy.org/doc/scipy/reference/integrate.html

Lev*_* K. 9

最近在scipy的github上出现了类似的问题.他们的解决方案是使用lambda:

solve_ivp(fun=lambda t, y: fun(t, y, *args), ...)
Run Code Online (Sandbox Code Playgroud)

而且他们认为已经有足够的开销来解决这个问题.

  • 我阅读了评论,与简单的arg =()相比,许多人似乎对使用lambda感到不满意。他们仍然有例子,因为我不使用lambda,所以我仍然不确定该怎么做。您能否举一个完整的例子,我想很多人都会从中受益。 (5认同)

rle*_*827 7

新功能似乎没有args参数.作为一种解决方法,您可以创建一个包装器

def wrapper(t, y):
    orig_func(t,y,hardcoded_args)
Run Code Online (Sandbox Code Playgroud)

并通过它.

  • 同意,这对于新手和因果用户来说太复杂了。不确定开发人员在想什么。更糟糕的是,他们甚至没有为这种非常常见的情况在文档中提供示例。 (3认同)
  • 谢谢,尽管这似乎是resolve_ivp的一个严重问题(包装程序希望增加开销,并降低我的应用程序的速度)。因此,我将回到旧的API。我不知道为什么开发者会做出如此倒退的举动? (2认同)

小智 5

最近在solve_ivp中添加了'args'选项,见这里:https : //github.com/scipy/scipy/issues/8352#issuecomment-535689344