优化零重力二维空间中粒子的引力计算

2023-12-01

我用 python 创建了一个小的粒子可视化。 我正在计算零重力二维空间中粒子的运动。 每个粒子都会根据粒子质量和距离吸引所有其他粒子。

我在 pygame 中做了一个可视化,一切都按计划进行(通过计算),但是我需要极大地优化计算。如今,该系统可以在相当好的帧速率下计算大约 100-150 个粒子。我将所有计算放在一个单独的线程中,这给了我更多的计算,但远不是我想要的。

我看过 scipy 和 numpy 但由于我不是科学家或数学大师,我只是感到困惑。看起来我走在正确的轨道上,但我不知道如何做。

我需要计算所有粒子对循环的所有吸引力。 因为我需要找出是否有碰撞,所以我必须再次做同样的事情。

写出这样的代码让我心碎......

Numpy 能够使用数组计算数组,但是我还没有找到任何方法来计算数组中的所有项目以及同一/另一个数组中的所有项目。有吗? 如果是这样,我可以创建几个数组并计算得更快,并且必须有一个函数可以从两个数组中获取索引,其中它们的值匹配(CollitionDetect iow)

这是今天的吸引力/碰撞计算:

class Particle:
    def __init__(self):
        self.x = random.randint(10,790)
        self.y = random.randint(10,590)
        self.speedx = 0.0
        self.speedy = 0.0
        self.mass = 4

#Attraction    
for p in Particles:
    for p2 in Particles:
        if p != p2:
            xdiff = P.x - P2.x
            ydiff = P.y - P2.y
            dist = math.sqrt((xdiff**2)+(ydiff**2))
            force = 0.125*(p.mass*p2.mass)/(dist**2)
            acceleration = force / p.mass
            xc = xdiff/dist
            yc = ydiff/dist
            P.speedx -= acceleration * xc
            P.speedy -= acceleration * yc
for p in Particles:
    p.x += p.speedx
    p.y += p.speedy

#Collision
for P in Particles:
   for P2 in Particles:
        if p != P2:
            Distance = math.sqrt(  ((p.x-P2.x)**2)  +  ((p.y-P2.y)**2)  )
            if Distance < (p.radius+P2.radius):
                p.speedx = ((p.mass*p.speedx)+(P2.mass*P2.speedx))/(p.mass+P2.mass)
                p.speedy = ((p.mass*p.speedy)+(P2.mass*P2.speedy))/(p.mass+P2.mass)
                p.x = ((p.mass*p.x)+(P2.mass*P2.x))/(p.mass+P2.mass)
                p.y = ((p.mass*p.y)+(P2.mass*P2.y))/(p.mass+P2.mass)
                p.mass += P2.mass
                p.radius = math.sqrt(p.mass)
                Particles.remove(P2)

您可以首先尝试与复数:在这种形式中,相关的引力和动力学公式非常简单,并且也可以相当快(因为NumPy可以在内部进行计算,而不是单独处理x和y坐标)。例如,z 和 z' 处两个粒子之间的力很简单:

(z-z')/abs(z-z')**3

对于所有 z/z' 对,NumPy 可以非常快速地计算出这样的数量。例如,所有 z-z' 值的矩阵只需从一维数组中获得Z坐标为Z-Z[:, numpy.newaxis](对角线项 [z=z'] 在计算时确实需要特别小心1/abs(z-z')**3:它们应该设置为零)。

至于时间演变,你当然可以使用SciPy 的快速微分方程例程:它们比逐步欧拉积分精确得多。

无论如何,深入研究 NumPy 将非常有用,特别是如果您打算进行科学计算,因为 NumPy 非常快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化零重力二维空间中粒子的引力计算 的相关文章

随机推荐

  • 如何让Python中的for循环工作?

    我想吐出一个回文列表 直到我给出某个字母为止 是关于这一部分的 def pyramid palindrome last letter for letter in range 97 last letter last letter last l
  • 使用 CUDA 进行 Cholesky 分解

    我正在尝试使用 cuSOLVER 库实现 Cholesky 分解 我是一名初学者 CUDA 程序员 我总是指定块大小和网格大小 但我无法找出程序员如何使用 cuSOLVER 函数显式设置它 这是文档 http docs nvidia com
  • 使用 powershell 处理弹出框

    谁能告诉我如何使用 powershell 在弹出窗口上单击 确定 或 取消 我正在尝试使用 powershell 自动化网站 但我是 powershell 新手 我必须单击弹出框中的 确定 按钮才能继续 我了解 VBscript 因为我可以
  • 如何在没有安全警告的情况下发布Java Web Start jnlp应用程序?

    我有一个从网站上的 jnlp 文件启动的 Java 应用程序 我试图让它运行 而不会在运行之前弹出一堆安全警告 该程序被分解为大约 10 个不同的 jar 文件 大约 30 个 jar 库以及一些也包含在 jar 文件中的本机库 我已经使用
  • HttpClient 调用 Windows 身份验证 Api 控制器方法...但没有 WindowsIdentity 随之而来

    当 api 控制器使用 windows authentication 时 有没有办法让我的 api 控制器获取发起对 api 控制器调用的帐户的身份 我的 castController User Identity 是 类型 WindowsI
  • DOM 对象存在后初始化 angular2 组件中的传单地图

    我目前正在尝试在有角度的材质内创建传单地图2tab group如下 import Component NgModule from angular core import BrowserModule from angular platform
  • 在 python 中使用迭代器?

    我刚刚了解了 Python 中的迭代器 但是我很难实现它们 我正在尝试编写一个类以使该循环起作用 odds OddNumbers 13 for i in odds print i 我想编写一个 iter 函数和 next 函数来执行此操作
  • 如何使用自动布局将 UILabel 设置为 UICell 宽度的百分比

    I m wondering how to set a UILabel s width expressed as a of the Cell s total width I m using AutoLayout Normally I woul
  • AxiosError:getaddrinfo ENOTFOUND

    我是新手 正在学习使用 API 我在使用 axios 时收到 POST 请求错误 In docs我想要交互的API 他们给出了curl的例子 curl X POST https ssuploader streamsb com upload
  • Android:更改设备设置时布局尺寸问题

    我目前面临着尺寸变化的麻烦 我已经使用 dp 对 xml 文件进行了编码 但是当我更改设备屏幕尺寸时 布局会发生变化 例如 当我进入 设置 显示 屏幕缩放和字体 并将屏幕缩放从中到大时 布局中的某些元素 例如图像视图或按钮 会增大并超出屏幕
  • Geopy 太慢 - 一直超时

    我正在使用 geopy 获取城市名称的纬度 经度对 对于单个查询 这工作得很好 我现在尝试做的是迭代 城市名称的大列表 46 000 并获取每个城市的地理编码 然后 我通过一个检查循环运行它们 将城市 如果在美国 排序为正确的状态 我的问题
  • Powershell 来分割大型 csv。需要很长时间。希望通过代码审查来缩短流程

    csv 大约是一个演出 有超过 100 万行 我正在尝试将其分成 5 个 前 4 个大约需要 18 小时 第 5 个永远不会发生 或者我没有足够的耐心 我的电脑将处于睡眠模式 因为它不会解锁 function Split Csv Cmdle
  • 如果我使用 Javascript 和 CSS 动态获取数据库的文本,如何将文本划分为列?

    我认为一个脚本使得每个容器中一定数量的字符都可以工作 你知道这样的脚本吗 这是一种响应式设计 我可以使用多个 css 文件 但我只需要一个 html 文件 问题出在我将动态获取的文本中 所以我不知道我会得到多少个字符 在桌面大小中 段落排列
  • fgets() 没有像我期望的那样工作

    谁能告诉我为什么这段代码不起作用 当我运行时 它只是打印出 输入有关线索 1 的信息 并且没有任何输入 跳到另一个步骤 include
  • Windows 物理驱动器访问 fopen 和 fseek

    我目前正在尝试以 C 语言中的二进制数据流的形式访问物理硬盘 我已经安装了一个映像 img 并且可以从操作系统 Win 7 中读取它 我的 C 程序只是尝试以只读二进制模式打开物理驱动器 然后从驱动器读取一些数据 但是 如果我只是从流中读取
  • 将计算列添加到 pandas 中的数据框

    我有一个 OHLC 价格数据集 我已将其从 CSV 解析为 Pandas 数据框 并重新采样为 15 分钟柱
  • 验证 Thymeleaf 中的输入

    我有这个输入 Masa
  • Javascript多维数组返回错误的维度[重复]

    这个问题在这里已经有答案了 我这样初始化一个数组 imgArray imgArray 0 0 image1 imgArray 1 0 image2 imgArray 0 1 image3 imgArray 1 1 image4 imgArr
  • Java 程序的程序计数器寄存器值

    是否可以获取正在运行的 Java 应用程序 尤其是在 Android 模拟器中运行的应用程序 的程序计数器 PC 寄存器值 例如 gprof 会随机采样 PC 寄存器值 以便找出哪个函数正在消耗程序的运行时间 这样的概念对 JVM 有意义吗
  • 优化零重力二维空间中粒子的引力计算

    我用 python 创建了一个小的粒子可视化 我正在计算零重力二维空间中粒子的运动 每个粒子都会根据粒子质量和距离吸引所有其他粒子 我在 pygame 中做了一个可视化 一切都按计划进行 通过计算 但是我需要极大地优化计算 如今 该系统可以