python - 在 Python 中,SciPY ode.int 的过度工作完成问题
问题描述
我正在尝试模拟一个在二维平面中互相追逐的错误的追踪问题,我正在使用 SciPY.odeint 来帮助我解决这个问题。使用以下代码,模型可以工作,但是随着错误越来越近,模型会崩溃并发出在此调用上完成的多余工作(可能是错误的 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)
这样您就永远不会除以零,并且对于可见距离,扰动可以忽略不计。
推荐阅读
- javascript - 为什么这个变量没有定义?
- mysql - mysql-js如何插入带有插入id的批量记录
- node.js - GAE - Nodejs - 一个简单的 pubsub 应用程序的内存泄漏 - 超过了软私有内存限制
- c# - 对象值在 linq 中给出对象数组
- android - 无法将字节从活动发送到蓝牙接收器?
- wordpress - 每次在wordpress中加载页面时如何更改背景图像
- r - 如何为二次模型创建预测线
- python - Python xml:以十六进制形式编码数字字符引用
- python - 将 GridSearchCSV 与 KNN 一起使用时总是出现属性错误
- python - 如何更改标签内某些单词的颜色?