- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将状态向量(位置和速度)转换为开普勒元素,但是我遇到了问题,在尝试计算真正的异常时,负速度或位置会给我错误的结果。
以下是我尝试计算真实异常的不同方法:
/// <summary>
/// https://en.wikipedia.org/wiki/True_anomaly#From_state_vectors
/// </summary>
public static double TrueAnomaly(Vector4 eccentVector, Vector4 position, Vector4 velocity)
{
var dotEccPos = Vector4.Dot(eccentVector, position);
var talen = eccentVector.Length() * position.Length();
talen = dotEccPos / talen;
talen = GMath.Clamp(talen, -1, 1);
var trueAnomoly = Math.Acos(talen);
if (Vector4.Dot(position, velocity) < 0)
trueAnomoly = Math.PI * 2 - trueAnomoly;
return trueAnomoly;
}
//sgp = standard gravitational parameter
public static double TrueAnomaly(double sgp, Vector4 position, Vector4 velocity)
{
var H = Vector4.Cross(position, velocity).Length();
var R = position.Length();
var q = Vector4.Dot(position, velocity); // dot product of r*v
var TAx = H * H / (R * sgp) - 1;
var TAy = H * q / (R * sgp);
var TA = Math.Atan2(TAy, TAx);
return TA;
}
public static double TrueAnomalyFromEccentricAnomaly(double eccentricity, double eccentricAnomaly)
{
var x = Math.Sqrt(1 - Math.Pow(eccentricity, 2)) * Math.Sin(eccentricAnomaly);
var y = Math.Cos(eccentricAnomaly) - eccentricity;
return Math.Atan2(x, y);
}
public static double TrueAnomalyFromEccentricAnomaly2(double eccentricity, double eccentricAnomaly)
{
var x = Math.Cos(eccentricAnomaly) - eccentricity;
var y = 1 - eccentricity * Math.Cos(eccentricAnomaly);
return Math.Acos(x / y);
}
编辑:Spectre 指出的另一种方法:
public static double TrueAnomaly(Vector4 position, double loP)
{
return Math.Atan2(position.Y, position.X) - loP;
}
位置都是相对于父实体的。
如果 position.x、position.y 和 velocity.y 都为正,则这些函数都一致。如何解决这些问题,以便在位置和速度为负时获得一致的结果?
澄清一下:我的角度似乎有点正确,只是根据位置和/或速度矢量指向错误的象限。
所以我发现了一个边缘情况,上面的大部分计算都失败了。给定位置和速度:
pos = new Vector4() { X = -0.208994076275941, Y = 0.955838328099748 };
vel = new Vector4() { X = -2.1678187689294E-07, Y = -7.93096769486992E-08 };
我得到一些奇怪的结果,即 ~ -31.1 度,当我认为它应该返回 `31.1(非负)。其中一个返回 ~ 328.8。
然而用这个位置和速度测试结果似乎没问题:
pos = new Vector4() { X = -0.25, Y = 0.25 };
vel = new Vector4() { X = Distance.KmToAU(-25), Y = Distance.KmToAU(-25) };
请参阅我的答案以获取有关我如何测试以及我对其他一些变量使用的数学的额外代码。
我在这个问题上兜圈子。这是我现有代码中的一个错误的结果,该错误在某些情况下出现,但在其他情况下不会出现。我想现在真正的问题是为什么我得到的位置/速度高于我的预期或彼此不匹配的不同结果?
最佳答案
假设 2D 情况...我的做法不同:
计算半轴半径和旋转
因此您需要记住整个轨道并在其上找到 2 个最远的点,即长轴 a
。短轴 b
通常与长轴成 90 度角,但要确保只有 2 个垂直于您的轨道上与长轴最远的点。所以现在你有两个半轴。初始旋转由 atan2
从主轴计算。
计算真实异常 E
所以如果中心是 x0,y0
(a,b
的交点或两者的中心点)初始旋转是 ang0
(角度a
) 并且你在轨道上的点是 x,y
那么:
E = atan2(y-y0,x-x0) - ang0
然而,为了将牛顿/达朗贝尔物理学与开普勒轨道参数相匹配,您需要像我在这里所做的那样提高积分精度:
请参阅那里的[Edit3] Improving Newton D'ALembert integration precision even more。
有关更多信息和方程式,请参阅:
[Edit1] 所以你想计算 V
我是这样看的:
当您获得相对于父级的坐标时,您可以假设它们已经位于焦点中心,因此不再需要 x0,y0
。如果你想要高精度并且有超过 2 个物体(焦点质量 + 物体 + 接近物体,如卫星),那么母质量将不再位于轨道的焦点但靠近它......并进行补救你需要使用真实的焦点位置,所以 x0,y0 再次......那么怎么做:
计算中心点(cx,cy)
和a,b半轴
所以它与前面的文本相同。
在轨道轴对齐坐标中计算焦点(x0,y0)
简单:
x0 = cx + sqrt( a^2 + b^2 );
y0 = cy;
a
的初始角度ang0
设xa,ya
为轨道与长轴a
在速度较大的一侧(靠近父对象焦点)的交点。然后:
ang0 = atan2( ya-cy , xa-cx );
最后是 V
代表你的 x,y
V = atan2( y-y0 , x-x0 ) - ang0;
关于c# - 从状态向量中找到真正的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317928/
我想用一个向量执行以下操作。 a = np.array(np.arange(0, 4, 1)) 我想得到一个乘法,结果是一个矩阵 | 0 1 2 3 4 -| - - - - - - - 0
正如标题所述,我正在尝试使用 gsub,其中我使用向量作为“模式”和“替换”。目前,我的代码如下所示: names(x1) names(x1) [1] "2110023264A.Ms.Amp
所以当我需要做一些线性代数时,我更容易将向量视为列向量。因此,我更喜欢 (n,1) 这样的形状。 形状 (n,) 和 (n,1) 之间是否存在显着的内存使用差异? 什么是首选方式? 以及如何将 (n,
我不明白为什么 seq() 可以根据元素中是否存在小数点输出不同的类,而 c() 总是创建一个 num向量,无论是否存在小数。 例如: seqDec <- seq(1, 2, 0.5) # num v
机器学习与传统编程的一个重要区别在于机器学习比传统编程涉及了更多的数学知识。不过,随着机器学习的飞速发展,各种框架应运而生,在数据分析等应用中使用机器学习时,使用现成的库和框架成为常态,似乎越来越不需
寻找有关如何将 RegEnable 用作向量的示例/建议。此外,我想控制输入和使能信号成为 Vector 中寄存器索引的函数。 首先,我如何声明 RegEnable() 的 Vector,其次如何迭代
假设我有一个包含变量名称的向量 v1,我想为每个变量分配一个值(存储在单独的向量中)。我如何在没有迭代的情况下做到这一点? v1 <- c("a","b","c") v2 <- c(1,2,3) 我想
R 提供了三种类型来存储同质对象列表:向量、矩阵 和数组。 据我所知: 向量是一维数组的特殊情况 矩阵是二维数组的特例 数组还可以具有任意维度级别(包括 1 和 2)。 在向量上使用一维数组和在矩阵上
我正在绕着numpy/scipy中的所有选项转圈。点积、乘法、matmul、tensordot、einsum 等 我想将一维向量与二维矩阵(这将是稀疏csr)相乘并对结果求和,这样我就有了一个一维向量
我是一个 IDL 用户,正在慢慢切换到 numpy/scipy,并且有一个操作我在 IDL 中非常经常做,但无法用 numpy 重现: IDL> a = [2., 4] IDL> b = [3., 5
在python计算机图形工具包中,有一个vec3类型用于表示三分量向量,但是我如何进行以下乘法: 三分量向量乘以其转置结果得到 3*3 矩阵,如下例所示: a = vec3(1,1,1) matrix
我正在构建一款小型太空射击游戏。当涉及到空间物理学时,我曾经遇到过数学问题。 用文字描述如下:有一个最大速度。因此,如果您全速行驶,您的飞船将在屏幕上一遍又一遍地移动,就像在旧的小行星游戏中一样。如果
我正在尝试在 python 中实现 Vector3 类。如果我用 c++ 或 c# 编写 Vector3 类,我会将 X、Y 和 Z 成员存储为 float ,但在 python 中,我读到鸭式是要走
我是 Spark 和 Scala 的新手,我正在尝试阅读有关 MLlib 的文档。 http://spark.apache.org/docs/1.4.0/mllib-data-types.html上的
我有一个包含四个逻辑向量的数据框, v1 , v2 , v3 , v4 是对还是错。我需要根据 boolean 向量的组合对数据帧的每一行进行分类(例如, "None" , "v1 only" , "
我正在创建一个可视化来说明主成分分析的工作原理,方法是绘制一些实际数据的特征值(为了说明的目的,我将子集化为二维)。 我想要来自 this fantastic PCA tutorial 的这两个图的组
我有以下排序向量: > v [1] -1 0 1 2 4 5 2 3 4 5 7 8 5 6 7 8 10 11 如何在不遍历整个向量的情况下删除 -1、0 和 11
有什么方法可以让 R 对向量和其他序列数据结构使用基于零的索引,例如在 C 和 python 中。 我们有一些代码在 C 中进行一些数值处理,我们正在考虑将其移植到 R 中以利用其先进的统计功能,但是
我有一个函数可以查询我的数据库中最近的 X 个条目,它返回一个 map 向量,如下所示: [{:itemID "item1" :category "stuff" :price 5} {:itemI
我有 ([[AA ww me bl qw 100] [AA ee rr aa aa 100] [AA qq rr aa aa 90]] [[CC ww me bl qw 100] [CC ee rr
我是一名优秀的程序员,十分优秀!