Skyfield 轨道与太阳系重力场的整合 - 速度问题

2024-02-19

在下面所示的时间测试中,我发现Skyfield http://rhodesmill.org/skyfield/需要几百微秒到一毫秒才能返回obj.at(jd).position.km对于单个时间值jd,但较长时间的增量成本JulianDate对象(时间点列表)每个点大约只有一微秒。我看到类似的速度使用Jplephem https://pypi.python.org/pypi/jplephem并有两个不同的星历表。

我的问题是:如果我想随机访问时间点,例如作为使用其自己的变量步长的外部 Runge-Kutta 例程的从属,有没有一种方法可以在 python 中更快地完成此操作(无需学习编译代码) ?

我明白这根本不是 Skyfield 的典型使用方式。通常我们会加载一个JulianDate对象具有一长串时间点,然后立即计算它们,并且可能会这样做几次,而不是像轨道积分器那样数千次(或更多)。

解决方法:我可以想象一种解决方法,我可以自己构建NumPy通过运行 Skyfield 一次使用JulianDate具有精细时间粒度的对象,然后编写我自己的 Runge-Kutta 例程,该例程以离散量上下更改步长,以便时间步始终直接对应于 NumPy 数组的跨步。

或者我什至可以尝试重新插值。我没有进行高精度计算,因此简单的 NumPy 或 SciPy 二阶可能就可以了。

最终我想尝试整合太阳系重力场影响下的物体(例如深空卫星、彗星、小行星)的路径。在寻找轨道解时,人们可能会在 6D 相空间中尝试数百万个起始状态向量。我知道我应该使用类似的东西ob.at(jd).observe(large_body).position.km方法,因为引力像其他东西一样以光速传播。这似乎花费了大量时间,因为(我猜)这是一个迭代计算(“让我们看看……木星会在哪里,让我现在感觉到它的引力”)。但让我们一次剥一层宇宙洋葱。

图1。Skyfield 和 JPLephem 在我的笔记本电脑上不同长度的性能JulianDate对象,适用于 de405 和 de421。它们都大致相同 - 第一个点(非常)大约为半毫秒,每个附加点为一微秒。还有第一点脚本运行时计算(地球(蓝色)与len(jd) = 1)有一个额外的毫秒伪影。

地球和月球速度较慢,因为它内部是两步计算(地月重心加上绕重心的各个轨道)。水星可能会更慢,因为与星历时间步长相比,它移动得如此之快,以至于在(昂贵的)切比雪夫插值中需要更多系数?

天场数据脚本JPLephem 脚本位于更下方

import numpy as np
import matplotlib.pyplot as plt
from   skyfield.api import load, JulianDate
import time

ephem = 'de421.bsp'
ephem = 'de405.bsp'

de = load(ephem)  

earth            = de['earth']
moon             = de['moon']
earth_barycenter = de['earth barycenter']
mercury          = de['mercury']
jupiter          = de['jupiter barycenter']
pluto            = de['pluto barycenter']

things = [ earth,   moon,   earth_barycenter,   mercury,   jupiter,   pluto ]
names  = ['earth', 'moon', 'earth barycenter', 'mercury', 'jupiter', 'pluto']

ntimes = [i*10**n for n in range(5) for i in [1, 2, 5]]

years  = [np.zeros(1)] + [np.linspace(0, 100, n) for n in ntimes[1:]] # 100 years

microsecs = []
for y in years:

    jd = JulianDate(utc=(1900 + y, 1, 1))
    mics = []
    for thing in things:

        tstart = time.clock()
        answer = thing.at(jd).position.km
        mics.append(1E+06 * (time.clock() - tstart))

    microsecs.append(mics)

microsecs = np.array(microsecs).T

many = [len(y) for y in years]

fig = plt.figure()
ax  = plt.subplot(111, xlabel='length of JD object',
                       ylabel='microseconds',
                       title='time for thing.at(jd).position.km with ' + ephem )

for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(item.get_fontsize() + 4) # http://stackoverflow.com/a/14971193/3904031

for name, mics in zip(names, microsecs):
    ax.plot(many, mics, lw=2, label=name)
plt.legend(loc='upper left', shadow=False, fontsize='x-large')
plt.xscale('log')
plt.yscale('log')
plt.savefig("skyfield speed test " + ephem.split('.')[0])
plt.show()

JPLEPHEM 数据脚本Skyfield 脚本在上面

import numpy as np
import matplotlib.pyplot as plt
from jplephem.spk import SPK
import time

ephem = 'de421.bsp'
ephem = 'de405.bsp'

kernel = SPK.open(ephem)

jd_1900_01_01 = 2415020.5004882407

ntimes = [i*10**n for n in range(5) for i in [1, 2, 5]]

years  = [np.zeros(1)] + [np.linspace(0, 100, n) for n in ntimes[1:]] # 100 years

barytup  = (0, 3)
earthtup = (3, 399)
# moontup  = (3, 301)

microsecs = []
for y in years:
    mics = []
    #for thing in things:

    jd = jd_1900_01_01 + y * 365.25 # roughly, it doesn't matter here

    tstart = time.clock()
    answer = kernel[earthtup].compute(jd) + kernel[barytup].compute(jd)
    mics.append(1E+06 * (time.clock() - tstart))

    microsecs.append(mics)

microsecs = np.array(microsecs)

many = [len(y) for y in years]

fig = plt.figure()
ax  = plt.subplot(111, xlabel='length of JD object',
                       ylabel='microseconds',
                       title='time for jplephem [0,3] and [3,399] with ' + ephem )

#   from here: http://stackoverflow.com/a/14971193/3904031
for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(item.get_fontsize() + 4)

#for name, mics in zip(names, microsecs):
ax.plot(many, microsecs, lw=2, label='earth')
plt.legend(loc='upper left', shadow=False, fontsize='x-large')
plt.xscale('log')
plt.yscale('log')
plt.ylim(1E+02, 1E+06)

plt.savefig("jplephem speed test " + ephem.split('.')[0])

plt.show()

None

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

Skyfield 轨道与太阳系重力场的整合 - 速度问题 的相关文章

  • JavaFX 中 WebView 的性能

    我有一个 HTML5 UI 和一个 Java 后端 并且希望避免在纯 java 中重建 HTML ui 所以我的想法是运行本地 Web 服务器并使用 WebView 在 本机 窗口中呈现它 解决方案似乎是使用可以嵌入到 swing 中的 J
  • linq2sql,存储库模式 - 如何从两个或多个表查询数据?

    我使用存储库模式 和 linq2sql 作为数据访问 并拥有例如 ProductsRep 和 CustomersRep 在非常简单的场景中 数据库有两个表 产品 产品 ID 客户 ID 产品名称 日期 和顾客 客户 ID 名字 姓氏 每个存
  • IIS7 上的 ASP.NET 应用程序 - iisreset 后启动速度非常慢

    我有一个在 Windows 2008 上的 IIS7 下运行的 ASP NET 3 5 网站 当我重新启动 IIS iisreset 然后点击一个页面时 初始启动非常慢 我在 Process Explorer 中看到以下活动 w3wp ex
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • NHibernate - CreateCriteria 与 CreateAlias

    假设以下场景 class Project public Job Job class Job public Name 假设我想使用 Criteria API 搜索其 Job 名称为 sumthing 的所有项目 我可以使用 CreateAli
  • 如何检查设备是否“快”足够

    我找不到更好的措辞来回答我的问题 在我的应用程序中的某个时刻 我设置了一些非常密集的动画 事实是 在高端设备上 动画运行流畅且赏心悦目 另一方面 我测试的一款低端设备在制作动画时的性能非常糟糕 为了将用户体验放在第一位 我想在计算能力足够的
  • 如何在 Debian 上的 virtualenv 中安装 numpy?

    注 参见这另一篇文章 https stackoverflow com questions 6442754 how to install h5py numpylibhdf5 as non root on a debian linux syst
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • Python if 与 try- except

    我想知道为什么下面程序中的 try except 比 if 慢 def tryway try while True alist pop except IndexError pass def ifway while True if alist
  • TypeScript 编译速度极慢 > 12 秒

    只是把它放在那里看看其他人是否也遇到这个问题 我已经使用 webpack 作为我的构建工具 使用 typescript 构建了一个 Angular 2 应用程序 一切都运行良好 但是我注意到 typescript 编译超级超级慢 我现在只有
  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • IronPython 中批量求值表达式的性能

    在 C 4 0 应用程序中 我有一个具有相同长度的强类型 IList 的字典 一个基于动态强类型列的表 我希望用户根据将在所有行上聚合的可用列提供一个或多个 python 表达式 在静态上下文中它将是 IDictionary
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的

随机推荐

  • 定义指向 const 字符串的 const 指针

    阅读了 Ulrich Drepper 的博文 发现两个条目看起来相互矛盾 In the 第一 http udrepper livejournal com 13851 html 全局空间中的字符串 Ulrich 指出该字符串应定义为 cons
  • Linux下如何用C写文件?

    我想重写Linux的 cp 命令 所以这个程序会像这样工作 a out originalfile copiedfile 我可以打开文件 创建新文件 但无法写入新文件 什么也没写 可能是什么原因 当前的C代码是 include
  • 无法将类型“TEnum”转换为“int”

    我正在尝试将枚举转换为列表 如中所述this https stackoverflow com questions 3489453 how can i convert an enumeration into a listselectlisti
  • 降低 jquery UI 中手风琴的速度

    我对这段代码有两个问题 首先我想降低效果的速度 其次 就像您对效果进行操作以关闭选项卡一样 然后将出现以下新选项卡 if sidebar ul length sidebar ul accordion event mouseover acti
  • 从 SQLite 中的 INSERT OR IGNORE 语句查找自动递增值

    我有一个名为 图像 的表 CREATE TABLE images id INTEGER PRIMARY KEY AUTOINCREMENT url TEXT NOT NULL UNIQUE caption TEXT 插入行时 我希望 URL
  • `npm install` 和 `npmaudit` 计数之间的区别?

    最近添加后npm audit 用于审核依赖关系 我注意到有多少个包之间存在巨大差异added 安装在node modules 以及有多少个audited by npm 这是一个例子 这是我的问题 我说得对吗281已安装的软件包总数是多少 W
  • Selenium 单击与文本对应的 JavaScript 按钮

    我的网页中有很多按钮 它们也是 javascript 按钮 所有这些按钮都有相同的 TagName 但 id 不同 但我不能使用 ID 因为我无法预测必须单击哪个按钮 Selenium 将搜索内容 问题here https stackove
  • 在网络上创建电子邮件表单时的安全注意事项

    我知道我必须考虑 邮件头注入 还有更多的事情吗在发送表格邮件之前我需要知道吗 我想要邮件 我觉得我必须设置表单邮件在我的页面上 但我听说邮件事情很危险 如果我 不考虑所有安全问题 1 避免垃圾邮件 使用验证码或其他东西来防止垃圾邮件 链接谈
  • 返回位于本地堆栈上的块

    clang 分析器可以检查返回的基于堆栈的内存 dispatch block t getPrintBlock const char msg return printf s msg 引发此错误 returning block that liv
  • 无法在 iOS8 上设置交互式推送通知

    我已经能够设置交互式本地通知 但远程通知不起作用 我正在使用 Parse com 发送 JSON 我的 AppDelegate Swift 看起来像这样 AppDelegate swift SwifferApp Created by Tra
  • knitr 中 python 块的根目录?

    我希望这并不像我感觉的那么简单 我已经设置了一个基本目录 root gt Paper gt Code 对于我正在写的一篇论文 我想从 Paper 目录中的knitr 文档调用 Code 目录中的 Python 脚本 类似于this http
  • Pandas:如何将列中的多个列表拆分为多行?

    我有一只熊猫DataFrame看起来像下面这样 bus uid bus type type obj uid 0 biomass DEB31 biomass output Simple 139804698384200 0 biomass DE
  • 是否可以在 docker 构建期间挂载 tmpfs?

    我目前正在构建包含交叉编译器的容器 由于这些必须在构建阶段构建 如果我可以使用 tmpfs 来实现这一点 那将非常有用 因为一旦安装了各种软件包 构建目录将毫无意义 有什么方法可以说服 docker 在构建时挂载 tmpfs 分区吗 Non
  • 打开的设备太多[重复]

    这个问题在这里已经有答案了 我试图将许多图表写入一个位置 但它却写入了一堆空白图片 我的代码如下所示 titleplot lt NULL for i in 1 99 titleplot lt colnames data i mypath l
  • 从列表中获取随机元素

    我基本上是在寻找 Ruby 的 Elixir 等价物Array sample http ruby doc org core 2 2 0 Array html sample method 可以让我这样做的东西 list 1 2 3 4 5 6
  • IvyDE + WTP:如何解决 Ivy 库被 WTP 忽略的问题?

    我发现 IvyDE 允许我解决 Web 应用程序的冻结核心版本的突出问题 该版本需要能够从更新库中提取额外的代码 以便它位于 Web 应用程序的类路径上 为了提高开发速度 我发现 在工作区中解析 功能允许 Eclipse 将更新库项目的文件
  • java.lang.NoSuchMethodError:没有接口方法 onTransitionToIdle()V

    请告诉我 我是 Android 测试新手 我一直在尝试修复初始 NavigationView 测试 但收到错误 我只是想打开抽屉并单击菜单以进入新活动 java lang NoSuchMethodError No interface met
  • 如何将 CloudStorageAccount 输入绑定到 Azure Function?

    我的简化代码示例 我在 Visual Studio 2017 中构建了以下简化的 Azure Function 代码 public static class FunctionApp FunctionName MyFunction publi
  • 如何删除内联/内联块元素之间的空格?

    这些之间将有 4 像素宽的空间span要素 span display inline block width 100px background color palevioletred p span Foo span span Bar span
  • Skyfield 轨道与太阳系重力场的整合 - 速度问题

    在下面所示的时间测试中 我发现Skyfield http rhodesmill org skyfield 需要几百微秒到一毫秒才能返回obj at jd position km对于单个时间值jd 但较长时间的增量成本JulianDate对象