gpt4 book ai didi

python - 在 Python 中,SciPY ode.int 的过度工作完成问题

转载 作者:行者123 更新时间:2023-12-01 08:43:02 24 4
gpt4 key购买 nike

我正在尝试对二维平面中互相追逐的 bug 的追逐问题进行建模,我正在使用 SciPY.odeint 来帮助我解决这个问题。使用以下代码,模型可以工作,但是,当 bug 越来越接近时,模型就会崩溃并发出在此调用上完成的多余工作(可能是错误的 Dfun 类型)错误。

import numpy as np
from scipy.integrate import odeint

def split_list(a_list):
half = len(a_list)//2
return a_list[:half], a_list[half:]

def diff(w, t):
x_points, y_points = split_list(w)
def abso(f, s):
return np.sqrt((x_points[f] - x_points[s])**2 + (y_points[f] - y_points[s])**2)
x_funct = [(x_points[i+1] - x_points[i]) / abso(i+1, i) for i in range(len(x_points) - 1)]
x_funct.append((x_points[0] - x_points[-1]) / abso(0,-1))

y_funct = [(y_points[i+1] - y_points[i]) / abso(i+1,i) for i in range(len(x_points) - 1)]
y_funct.append((y_points[0] - y_points[-1]) / abso(0,-1))
funct = x_funct + y_funct
return funct

def ode(tstart, tend, init_cond):

t = np.linspace(tstart, tend, step_size)

wsol = odeint(diff, init_cond, t)
sols = [wsol[:,i] for i in range(len(init_cond))]
x_sols, y_sols = split_list(sols)
return x_sols, y_sols, t, tend

bug_init_cond = [[-0.5, 1],
[0.5, 1],
[0.5, -1],
[-0.5, -1],]

amount_of_bugs = 4
step_size = 10000

x_sols, y_sols, t, tend = ode(0, 5, [bug_init_cond[i][j] for j in range(2) for i in range(amount_of_bugs)])

由于我对使用 Scipy.odeint 函数还很陌生,我想知道是否有解决方案来解决这些多余的工作?感谢您抽出时间。

最佳答案

你的问题是,在精确的解决方案中,路径在时间 t=1.48 相遇。至t=1.5 。在精确的解决方案中,您将得到除以零误差的结果,浮点噪声会“降级”到一种僵硬的情况,其中步长被调低,直到输出时间步长需要超过mxstep=500。内部步骤。

您可以添加条件,以便在平仓时将右侧设置为零。实现这一目标的一种快速方法是修改距离函数 abso

  def abso(f, s):
return np.sqrt(1e-12+(x_points[f] - x_points[s])**2 + (y_points[f] - y_points[s])**2)

这样你就不会被零除,并且对于可见距离,扰动可以忽略不计。

关于python - 在 Python 中,SciPY ode.int 的过度工作完成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53434453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com