scipy的solve_ivp有类似ode的set_f_params的方法吗?
在scipy的ode方法中,有一个叫set_f_params的函数,可以用来更新你提供的任何参数:使用solve_ivp处理变化的参数。我想在solve_ivp方法中实现类似的功能,但一直找不到方法,不知道有没有人能帮我解决这个问题?
简单来说,我正在处理一个状态向量y,我想计算一些我提供给solve_ivp的额外参数的变化,然后再把这些变化后的参数传回给solve_ivp。对感兴趣的人来说,这涉及到两个自然卫星的传播,我想在传播过程中更新重力场系数,但我遇到了很大的困难。
更具体一点,我想实现的方程组如下:
我可以在状态y中很好地实现方程5.20、5.21和5.22的第二个方程。然后我可以调用solve_ivp,它会简单地返回给我结果。但是我不明白的是,如何根据每个积分步骤得到的$\Delta Z^\nu {l,m}$,使用5.22左边的方程来相应地更新$\Delta Z{l,m}$。这个新的delta $Z_{l,m}$将用于方程5.20和5.21的右边,因此我需要同时完成所有这些操作。
我非常感谢任何帮助
1 个回答
0
为了回答我自己的问题,我发现我之前的方法是错的。重力场的系数不应该在每一步计算时都更新。因为它并不明显依赖于时间,所以在5.22的第一个公式中,无论我的可变步长计算器每次走多大一步,这个系数的大小可能都是差不多的,这样就会导致结果不符合物理实际。
现在看来,在每一步计算时用重力场系数的常数值来替代,并加上这个小的扰动,就能得到一个符合物理规律的结果。因此,我不需要再去研究如何改变solve_ivp
函数的输入参数了。