- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果您不想阅读太多背景信息,请跳至下面的更新 2。
我正在尝试实现一个用于简单轨道模拟(两个物体)的模型。
但是,当我尝试使用我编写的代码时,从结果生成的图看起来很奇怪。
程序使用初始状态向量(位置和速度)来计算开普勒轨道元素,然后使用这些元素计算下一个位置,并作为接下来的两个状态向量返回。
这似乎工作正常,并且只要我将绘图保持在轨道平面上,它本身就可以正确绘制。但我想将绘图旋转到引用系(父体),以便我可以看到轨道外观的酷炫 3D View (obvs)。
现在,我怀疑问题在于如何将轨道平面中的两个状态向量转换为将它们旋转到引用系。我使用 this document 第 6 步中的方程创建以下代码(但应用单独的旋转矩阵 [ copied from here ]):
from numpy import sin, cos, matrix, newaxis, asarray, squeeze, dot
def Rx(theta):
"""
Return a rotation matrix for the X axis and angle *theta*
"""
return matrix([
[1, 0, 0 ],
[0, cos(theta), -sin(theta) ],
[0, sin(theta), cos(theta) ],
], dtype="float64")
def Rz(theta):
"""
Return a rotation matrix for the Z axis and angle *theta*
"""
return matrix([
[cos(theta), -sin(theta), 0],
[sin(theta), cos(theta), 0],
[0, 0, 1],
], dtype="float64")
def rotate1(vector, O, i, w):
# The starting value of *vector* is just a 1-dimensional numpy
# array.
# Transform into a column vector.
vector = vector[:, newaxis]
# Perform the rotation
R = Rz(-O) * Rx(-i) * Rz(-w)
res2 = dot(R, vector)
# Transform back into a row vector (because that's what
# the rest of the program uses)
return squeeze(asarray(res2))
(作为上下文,我使用 this is the full class 作为轨道模型。)
当我根据结果绘制 X 和 Y 坐标时,我得到:
但是当我将旋转矩阵更改为R = Rz(-O) * Rx(-i)
时,我得到了这个更合理的图(尽管明显缺少一次旋转,并且稍微偏离中心) ):
当我进一步将其减少到 R = Rx(-i)
时,正如人们所期望的那样,我得到了这个:
正如我所说,我相当确定不是轨道计算代码表现得很奇怪,而是旋转代码中出现了一些错误。但我不确定在哪里缩小范围,因为我对 numpy 和矩阵数学总体来说都很陌生。
<小时/> 更新:基于 stochastic's answer,我转置了矩阵(R = Rz(-O).T * Rx(-i).T * Rz(-w).T
) ,但后来得到了这个情节:
这让我想知道我对屏幕坐标的转换是否在某种程度上是错误的 - 但它对我来说看起来是正确的(并且与旋转较少的更正确的绘图相同的代码)即:
def recenter(v_position, viewport_width, viewport_height):
x, y, z = v_position
# the size of the viewport in meters
bounds = 20000000
# viewport_width is the screen pixels (800)
scale = viewport_width/bounds
# Perform the scaling operation
x *= scale
y *= scale
# recenter to screen X and Y measured from the top-left corner
# of the viewport
x += viewport_width/2
y = viewport_height/2 - y
# Cast to int, because we don't care about pixel fractions
return int(x), int(y)
<小时/>
更新2
虽然我在随机的帮助下对方程的实现以及旋转进行了三次检查,但我仍然无法得到正确的轨道。它们看起来仍然与上面的图中基本相同。
使用来自 NASA Horizon 系统的数据,我设置了一条具有来自 ISS 的特定状态向量的轨道 (2457380.183935185 = A.D. 2015-Dec-23 16:24:52.0000 (TDB)),并根据开普勒轨道元素对其进行了检查在同一时刻,产生以下结果:
inclination :
0.900246137041
0.900246137041
true_anomaly :
0.11497063007
0.0982485984565
long_of_asc_node :
3.80727461492
3.80727461492
eccentricity :
0.000429082122137
0.000501850615905
semi_major_axis :
6778560.7037
6779057.01374
mean_anomaly :
0.114872215066
0.0981501816537
argument_of_periapsis :
0.843226618347
0.85994864996
顶部的值是我的(计算的)值,底部的值是 NASA 的值。显然,一些浮点精度误差是可以预料的,但 mean_anomaly
和 true_anomaly
的变化确实让我觉得比我预期的要大。 (我目前正在 64 位系统上使用 float128
数字运行所有 numpy 计算)。
此外,生成的轨道仍然看起来像上面的(相当)偏心的第一个图(尽管我知道这个 LEO ISS 轨道是相当圆形的)。所以我有点困惑问题的根源可能是什么。
最佳答案
我相信您至少有两个问题。
在更仔细地研究了您正在做的轨道模拟之后(请参阅评论中的 this additional document ),我认为主要问题是最初非常合理但不真实的假设,即最终情节应该看起来像一个椭圆。一般来说不会,因为绕轨道运行的物体不一定会停留在一个平面上。
我认为另一个问题是,根据您描述的文档(见下文),您的旋转矩阵是它们应有的转置。
转置旋转矩阵
您引用的文档没有直接指定 R_x 和 R_z 是否应该是轴的右旋或它们将相乘的矢量的右旋,尽管您可以从方程 9(或 10)中计算出来。事实证明,它们应该是轴的右旋,而不是矢量。这意味着它们应该这样定义:
return matrix([
[1, 0, 0 ],
[0, cos(theta), sin(theta) ],
[0,-sin(theta), cos(theta) ],
], dtype="float64")
而不是像这样:
return matrix([
[1, 0, 0 ],
[0, cos(theta),-sin(theta) ],
[0, sin(theta), cos(theta) ],
], dtype="float64")
我通过在纸上手工重现方程 9 发现了这一点。
-(sin(omega)*cos(Omega)+cos(omega)*cos(i)*sin(Omega))
。 您的 Rx 和 Rz 函数当前正在定义向量的右手旋转,而不是轴。
您可以通过以下任一方式解决此问题(所有三个都是等效的):
删除欧拉角上的减号:Rz(O) * Rx(i) * Rz(w)
转置旋转矩阵:Rz(-O).T * Rx(-i).T * Rz(-w).T
将 Rx 和 Rz 定义中的 -
符号移至第二行正弦项,如上所示
关于python - 二体轨道建模问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34434772/
我正在寻找可以从 Eclipse 的 UML 图生成代码的工具。该工具应该从 UML 图生成代码,进行逆向工程以查看代码更改,并提供合并选项以防止因任何更改而删除文件。 是否有工具可以做到这一点,或者
我正在寻找有关建模的见解。我有一个关于设计模式和基本类图、序列图和用例的介绍类(class)。 我发现类图作为我编程中的组织工具非常宝贵。到目前为止,用例还算有用。 本学期我正在上课,更深入地学习 U
如何使用 flutter 数据建模技术访问“HH”和“mm”。我一直在尝试按以下方式使用它,但是下面给出了错误。 我的数据模型当前为它的简化版本。 class Week { final Strin
我正在使用 Neo4j 和 PHP。在我的项目中,我有餐厅节点。每个节点都有纬度、经度和分类属性。 我需要返回与用户给定分类相匹配的餐厅节点,其结果按距用户位置的距离排序(即第一个最近的餐厅)。 最简
我希望 POJO 包含一个 Status 字段(只有两个可能的值 SUCCESS、FAILED),并且根据此状态,第二个字段需要为 POJO 对象(如果 Status 为 SUCCESS) 或只是字符
我正在尝试将我的办公室迁移到数据库应用程序中。这是我得到的: (来源:phunkei.de) 公司和个人从客户继承(1:1关系)。这是因为他们都可以是“客户”并收到账单,我想引用订单中的单个表。公司和
我目前有这个数据库结构: 一个条目可以有多个"file"、“文本”和“url”类型的项目。 这些项目中的每一项在文本、网址或文件表(存储数据的位置)中都有一个对应的项目。 我需要一个查询来有效地选择一
下面的代码不应该像“if(condition)”语句一样工作吗,当它在另一个循环中并且“body”有自己的 break 或 continue 语句时,会出现明显的错误行为: for( ; condit
我一直在像这样存储和递增下载计数器: INCRBY downloads: 1 但现在我想要下载:* 按值排序,以便显示热门下载列表。 我觉得我可以更好地存储它。我愚弄了: ZINCRBY downlo
我开始使用图形数据库,在我的团队中,我们已经开始为我们的软件建模图形。当我们尝试“记录”模型以查看数据库的结构时,问题就出现了。对于 SQL 数据库,您只需查看 SQL 模式。 我们花了一些时间阅读
我正在做一个固定效应回归并且遇到了自相关问题,为了解决这个问题,我正在使用预测、lmtest 和 plm 包进行 ARIMA 建模。我的数据是一般面板数据,looks like this ,我正在尝试
我想知道是否有任何工具可以帮助我对 C 应用程序(即函数式编程)进行建模。例如。我目前正在构建一个共享库。但是为了直观地传达我的设计,我需要类似 UML 的东西。我想这样做,以便审查我的设计的人不需要
我正在尝试将 JSON 转换为 GSON ,但我无法建模。谁能给我举个例子。 [ { "id": "1", "name": "lalala",
正如标题所说,在 中建模 optional 参数的最佳方法是什么?斯卡拉 ? 对于 optional 参数,我的意思是执行函数体不需要的值。 要么因为该参数存在默认值,要么根本不需要该参数本身(例如配
我发现 UML 可用于记录 OO 系统的各个方面,尤其是用于整体架构的类图和用于说明特定例程的序列图。我想为我的 clojure 应用程序做同样的事情。我目前对模型驱动开发不感兴趣,只是在交流应用程序
我想知道是否有人知道如何使用 UML 在属性中建模 DateTime 基元类型? 最佳答案 我想这取决于日期的格式......请参阅下面的示例,其中我使用两个整数(分别为日和年)和一个名为“Month
我有一些与我的问题建模相关的问题。我正在研究基于模型的测试的论文项目。还想从专家的角度了解我是否采用正确的方法来建模我的场景。我正在对 Android 应用程序的 UI 进行建模,遍历它们,生成测试用
我正在尝试建立对 CouchDB 以及如何为某些现实世界场景建模数据的理解。我现在已经尽可能多地“按日期获取我的博客文章”;) 给定这样的文件: { "_id": "couch1",
一个模型资源是如何分层的?例如假设一个人有一个“留言板”并且“消息”是一种资源。假设“消息”可以有回复,从而形成一个讨论线程。如何模拟线程的概念? “消息”是否包含它的子项? “线程”是它自己的资源吗
我正在尝试创建一个像通用 POJO 一样工作的对象,因为我必须通过不同的对象传递它,并且我需要一个接口(interface)来访问其属性。 目前,我使用具有 getField 方法的基础对象来完成此操
我是一名优秀的程序员,十分优秀!