将Scipy中的solve_ivp()与动态参数一起使用

时间:2019-04-26 13:20:46

标签: python scipy

我正在尝试使用solve_ivp()函数来解决带有依赖于状态的参数的ODE。想法是在给定轨迹的当前状态的每个时刻更新ODE。

给出如下的ODE模型:

def model(t, y, arg1, arg2):
    '''
    Some Dynamics model that includes arg1 and arg 2
    '''
    return dy_dt

arg1arg2是使用其他一些函数计算的:

def gen_args(y):
    '''
    Calculate arg1 and arg2 based on the state y
    '''
    return arg1, arg2

然后我要通过ODE模型进行集成:

scipy.integrate.solve_ivp(model, t_span, y0, method='RK45', t_eval=None, dense_output=False, events=None, vectorized=False)

什么是实现此目的的好方法?

我已经检查过类似的问题,例如herehere,但是所有的args都是外部常量。

2 个答案:

答案 0 :(得分:2)

一种简单的解决方案是在gen_args中调用model

def model(t, y):
    arg1, arg2 = gen_args(y)
    dy_dt = ...
    return dy_dt

答案 1 :(得分:0)

添加到@Warren Weckesser答案

在'solve_ivp'的args参数中包含任何状态和(或)与时间相关的参数的意义很小。它们应包含在 “ solve_ivp”本身的“ fun”参数。 不可能包含受@Warren Weckesser启发而类似于this answer的状态和(或)与时间有关的参数。

中的args参数

solve_ivp(fun,t_span,y0,method ='RK45',t_eval = None,density_output = False,events = None,vectorized = False,args = None,** options)

只能接受一个常量参数的元组(例如浮点数,整数等)