根据我对solve_ivp文档的理解,events=event所需的函数event(t,y,arg)必须是这样的,即$event(t_0,y_0,args)= 0。如果事件发生了。solve_ivp然后尝试改进事件的时间和坐标。我没有这样一个连续的函数,在积分过程中,我用数字“看”事件是否发生,我相信(我没有证据)这种优化使我的解决方案更加关键。我的问题是:有没有什么方法可以“告诉”solve_ivp不要尝试这种优化,而只是接受事件已经发生并终止集成?感谢您的任何帮助!!
5us2dqdw1#
有没有什么方法可以“告诉”solve_ivp不要尝试这种优化,而只是接受事件已经发生并终止集成?感谢您的任何帮助!!这已经是solve_ivp在大部分情况下所做的了。它查找函数在一个步骤中的符号变化(请参阅下面的events文档)。然后,它使用积分器解的插值函数来估计其发生的时间。这应该非常有效。请参见执行根查找的代码部分的链接。注意,它不使用ODE函数,而是使用解中的插值函数。
events
从https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html事件:可调用,或可调用列表,可选要跟踪的事件。如果为“无”(默认值),则不会跟踪任何事件。每个事件发生在时间和状态的连续函数的零点处。每个函数必须有签名事件(t,y)并返回一个浮点数。求解器将使用求根算法找到事件(t,y(t))= 0处的t的准确值。默认情况下,将找到所有零。求解器在每个步骤中查找符号变化,因此如果在一个步骤中发生多个过零点,则可能会错过事件。此外,每个事件函数可能具有以下属性:[编辑更多详情]查找事件时间的代码部分:https://github.com/scipy/scipy/blob/f68525ef0270d7b0b1206e11b264b792c9ee6e6f/scipy/integrate/_ivp/ivp.py#L53-L78
1条答案
按热度按时间5us2dqdw1#
有没有什么方法可以“告诉”solve_ivp不要尝试这种优化,而只是接受事件已经发生并终止集成?感谢您的任何帮助!!
这已经是solve_ivp在大部分情况下所做的了。它查找函数在一个步骤中的符号变化(请参阅下面的
events
文档)。然后,它使用积分器解的插值函数来估计其发生的时间。这应该非常有效。请参见执行根查找的代码部分的链接。注意,它不使用ODE函数,而是使用解中的插值函数。参考资料
从https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html
事件:可调用,或可调用列表,可选
要跟踪的事件。如果为“无”(默认值),则不会跟踪任何事件。每个事件发生在时间和状态的连续函数的零点处。每个函数必须有签名事件(t,y)并返回一个浮点数。求解器将使用求根算法找到事件(t,y(t))= 0处的t的准确值。默认情况下,将找到所有零。求解器在每个步骤中查找符号变化,因此如果在一个步骤中发生多个过零点,则可能会错过事件。此外,每个事件函数可能具有以下属性:[编辑更多详情]
查找事件时间的代码部分:https://github.com/scipy/scipy/blob/f68525ef0270d7b0b1206e11b264b792c9ee6e6f/scipy/integrate/_ivp/ivp.py#L53-L78