- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题与 Runge-Kutta 4 (RK4) 方法和轨道卫星状态向量所需的正确迭代步骤有关。下面的代码(在 Python 中)根据此链接 (http://www.navipedia.net/index.php/GLONASS_Satellite_Coordinates_Computation) 的描述描述了运动:
if total_step_number != 0:
for i in range(1, total_step_number+1):
#Calculate k1
k1[0] = (-cs.GM_GLONASS * XYZ[0] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ[0] * (1 - (5*(XYZ[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[0] + (cs.OMEGAE_DOT**2 * XYZ[0]) + (2 * cs.OMEGAE_DOT * XYZDot[1])
k1[1] = (-cs.GM_GLONASS * XYZ[1] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ[1] * (1 - (5*(XYZ[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[1] + (cs.OMEGAE_DOT**2 * XYZ[1]) - (2 * cs.OMEGAE_DOT * XYZDot[0])
k1[2] = (-cs.GM_GLONASS * XYZ[2] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ[2] * (3 - (5*(XYZ[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[2]
#Intermediate step to bridge k1 to k2
XYZ2[0] = XYZ[0] + (XYZDot[0] * h / 2) + (k1[0] * h**2 / 8)
XYZDot2[0] = XYZDot[0] + (k1[0] * h / 2)
XYZ2[1] = XYZ[1] + (XYZDot[1] * h / 2) + (k1[1] * h**2 / 8)
XYZDot2[1] = XYZDot[1] + (k1[1] * h / 2)
XYZ2[2] = XYZ[2] + (XYZDot[2] * h / 2) + (k1[2] * h**2 / 8)
XYZDot2[2] = XYZDot[2] + (k1[2] * h / 2)
radius = np.sqrt((XYZ2[0]**2)+(XYZ2[1]**2)+(XYZ2[2]**2))
....
还有更多代码,但我想限制我现在展示的内容,因为这是我最感兴趣解决的中间步骤。基本上,对于那些熟悉状态向量和使用 RK4 的人来说,您可以看到在中间步骤更新了位置和速度,但没有更新加速度。我的问题与更新加速度所需的计算有关。它将开始:
XYZDDot[0] = ...
XYZDDot[1] = ...
XYZDDot[2] = ...
...但具体是什么之后就不是很清楚了。欢迎任何建议。
完整代码如下:
for j in h_step_values:
h = j
if h > 0:
one_way_iteration_steps = one_way_iteration_steps -1
elif h < 0:
one_way_iteration_steps = one_way_iteration_steps +1
XYZ = initial_XYZ
#if total_step_number != 0:
for i in range(0, one_way_iteration_steps):
#Calculate k1
k1[0] = (-cs.GM_GLONASS * XYZ[0] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ[0] * (1 - (5*(XYZ[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[0] + (cs.OMEGAE_DOT**2 * XYZ[0]) + (2 * cs.OMEGAE_DOT * XYZDot[1])
k1[1] = (-cs.GM_GLONASS * XYZ[1] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ[1] * (1 - (5*(XYZ[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[1] + (cs.OMEGAE_DOT**2 * XYZ[1]) - (2 * cs.OMEGAE_DOT * XYZDot[0])
k1[2] = (-cs.GM_GLONASS * XYZ[2] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ[2] * (3 - (5*(XYZ[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[2]
#Intermediate step to bridge k1 to k2
XYZ2[0] = XYZ[0] + (XYZDot[0] * h / 2) + (k1[0] * h**2 / 8)
XYZDot2[0] = XYZDot[0] + (k1[0] * h / 2)
XYZDDot2[0] = XYZDDot[0] + (k1[0] * h / 2)
XYZ2[1] = XYZ[1] + (XYZDot[1] * h / 2) + (k1[1] * h**2 / 8)
XYZDot2[1] = XYZDot[1] + (k1[1] * h / 2)
XYZ2[2] = XYZ[2] + (XYZDot[2] * h / 2) + (k1[2] * h**2 / 8)
XYZDot2[2] = XYZDot[2] + (k1[2] * h / 2)
radius = np.sqrt((XYZ2[0]**2)+(XYZ2[1]**2)+(XYZ2[2]**2))
#Calculate k2
k2[0] = (-cs.GM_GLONASS * XYZ2[0] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[0] * (1 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[0] + (cs.OMEGAE_DOT**2 * XYZ2[0]) + (2 * cs.OMEGAE_DOT * XYZDot2[1])
k2[1] = (-cs.GM_GLONASS * XYZ2[1] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[1] * (1 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[1] + (cs.OMEGAE_DOT**2 * XYZ2[1]) - (2 * cs.OMEGAE_DOT * XYZDot2[0])
k2[2] = (-cs.GM_GLONASS * XYZ2[2] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[2] * (3 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[2]
#Intermediate step to bridge k2 to k3
XYZ2[0] = XYZ[0] + (XYZDot[0] * h / 2) + (k2[0] * h**2 / 8)
XYZDot2[0] = XYZDot[0] + (k2[0] * h / 2)
XYZ2[1] = XYZ[1] + (XYZDot[1] * h / 2) + (k2[1] * h**2 / 8)
XYZDot2[1] = XYZDot[1] + (k2[1] * h / 2)
XYZ2[2] = XYZ[2] + (XYZDot[2] * h / 2) + (k2[2] * h**2 / 8)
XYZDot2[2] = XYZDot[2] + (k2[2] * h / 2)
radius = np.sqrt((XYZ2[0]**2)+(XYZ2[1]**2)+(XYZ2[2]**2))
#Calculate k3
k3[0] = (-cs.GM_GLONASS * XYZ2[0] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[0] * (1 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[0] + (cs.OMEGAE_DOT**2 * XYZ2[0]) + (2 * cs.OMEGAE_DOT * XYZDot2[1])
k3[1] = (-cs.GM_GLONASS * XYZ2[1] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[1] * (1 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[1] + (cs.OMEGAE_DOT**2 * XYZ2[1]) - (2 * cs.OMEGAE_DOT * XYZDot2[0])
k3[2] = (-cs.GM_GLONASS * XYZ2[2] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[2] * (3 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[2]
#Intermediate step to bridge k3 to k4
XYZ2[0] = XYZ[0] + (XYZDot[0] * h) + (k3[0] * h**2 / 2)
XYZDot2[0] = XYZDot[0] + (k3[0] * h)
XYZ2[1] = XYZ[1] + (XYZDot[1] * h) + (k3[1] * h**2 / 2)
XYZDot2[1] = XYZDot[1] + (k3[1] * h)
XYZ2[2] = XYZ[2] + (XYZDot[2] * h) + (k3[2] * h**2 / 2)
XYZDot2[2] = XYZDot[2] + (k3[2] * h)
radius = np.sqrt((XYZ2[0]**2)+(XYZ2[1]**2)+(XYZ2[2]**2))
#Calculate k4
k4[0] = (-cs.GM_GLONASS * XYZ2[0] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[0] * (1 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[0] + (cs.OMEGAE_DOT**2 * XYZ2[0]) + (2 * cs.OMEGAE_DOT * XYZDot2[1])
k4[1] = (-cs.GM_GLONASS * XYZ2[1] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[1] * (1 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[1] + (cs.OMEGAE_DOT**2 * XYZ2[1]) - (2 * cs.OMEGAE_DOT * XYZDot2[0])
k4[2] = (-cs.GM_GLONASS * XYZ2[2] / radius**3) \
+ ((3/2) * cs.C_20 * cs.GM_GLONASS * cs.SEMI_MAJOR_AXIS_GLONASS**2 * XYZ2[2] * (3 - (5*(XYZ2[2]**2) / (radius**2))) / radius**5) \
+ XYZDDot[2]
for p in range(3):
XYZ[p] = XYZ[p] + XYZDot[p] * h + h**2 * ((k1[p] + 2*k2[p] + 2*k3[p] + k4[p]) / 12)
XYZDot[p] = XYZDot[p] + (h * (k1[p] + 2*k2[p] + 2*k3[p] + k4[p]) / 6)
radius = np.sqrt((XYZ[0])**2 + (XYZ[0])**2 + (XYZ[0])**2)
最佳答案
你正在求解的方程属于这种类型
ddot x = a(x)
其中 a(x)
是在您的 k1
计算中计算的加速度。事实上,一阶系统将是
dot v = a(x)
dot x = v
RK4 的实现因此开始于
k1 = a(x)
l1 = v
k2 = a(x+l1*h/2) = a(x+v*h/2)
l2 = v+k1*h/2
等l1,l2,...
的使用似乎隐含在代码中,将这些线性组合直接插入它们出现的位置。
简而言之,你没有错过加速计算,它是代码片段的主要部分。
更新:(8/22) 为了更接近中间桥接步骤的意图,抽象代码应该是 ( with (* .. *)
表示评论或不必要的计算)
k1 = a(x) (* l1 = v *)
x2 = x + v*h/2 (* v2 = v + k1*h/2 *)
k2 = a(x2) (* l2 = v2 *)
x3 (* = x + l2*h/2 *)
= x + v*h/2 + k1*h^2/4 (* v3 = v + k2*h/2 *)
k3 = a(x3) (* l3 = v3 *)
x4 (* = x + l3*h *)
= x + v*h + k2*h^2/2 (* v4 = v + k3*h *)
k4 = a(x4) (* l4 = v4 *)
delta_v = ( k1+2*(k2+k3)+k4 ) * h/6
delta_x (* = ( l1+2*(l2+l3)+l4 ) * h/6 *)
= v*h + (k1+k2+k3) * h^2/6
关于python - 使用 Runge-Kutta 4 计算卫星位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39035696/
我正在尝试用python解决系统问题: z &
我在MATLAB中编程了一个自适应步长RK4来求解ODE系统。代码运行时没有错误,但是当我尝试将x与y作图时,它不会产生所需的曲线。我不再是环形形状,而是获得了一条扁平线。从r输出恒定值这一事实可以明
我一直在尝试将 RK4 集成到我正在做的模拟中。下面的函数是我基于第 12 页 this 上的方程式使用 RK4 对 3 维力场进行积分的最佳尝试。网站。 在我的代码中,粒子类主要存储速度和位置列表,
我试图获得一个简单追逐问题的数值解 (动靶+定速模块火箭) 每次迭代我的速度模块都会减少一点,将误差加起来;在几百次迭代之后,错误爆发,速度急剧下降。 但是,使用 Euler 方法(大块下方的代码)时
有人要求我解这个微分方程: (x,y,vx,vy)'=(vx,vy,vy,-vx) 它应该返回周期为 2*pi 的圆周运动。我实现了功能: class FunzioneBase { public:
我一直在研究四阶龙格-库塔求解器,但遇到了一些困难。我已经根据文章 on gafferongames 编写了求解器,但是当我运行一个包含的小例子时,我得到的错误比我用简单的欧拉积分得到的错误要糟糕得多
几乎每个游戏都倾向于使用一些游戏循环。 Gafferongames 有一篇关于如何制作精心设计的游戏循环的好文章:http://gafferongames.com/game-physics/fix-y
我有以下微分方程组: 根据他们告诉我的论文,我可以使用 RK 四阶数值求解它。 如您所见,最后两个方程是耦合的,我构造了一个关联 xn 和 yn 的矩阵(概率),其中 n = 1..(例如,N- 对数
我正在使用 Runge-Kutta 四阶方法数值求解具有四次势的弯曲时空背景标量场的常见运动方程: $\phi^{''}=-3\left(1+\frac{H^{'}}{3H}\right)\phi^{
我有一个耦合方程组:流体静力学平衡方程、质量连续性方程和理想气体的状态方程。这些是,在数学语法中, \frac{dP}{dr}=-\rho*g, 其中 \rho 是密度,g 是重力加速度。 \frac
有人能告诉我,为什么它总是返回相同的“y”值吗?我在 Internet 上搜索了很多,但我仍然不知道为什么它不起作用。 using System; using System.Collections.G
下面是我用于求解一阶 ODE 的四阶 Runge-Kutta 算法。我正在根据找到的维基百科示例检查它 here解决: \frac{dx}{dt} = tan(x) + 1 不幸的是,它有点出局了。我
我正在尝试实现 Runge-Kutta Method for Systems of DEs在 MATLAB 中。我没有收到 correct answers ,我不确定代码或我用来运行它的命令是否有问题
尝试实现自适应步长 Runge-Kutta Cash-Karp 但失败并出现此错误: home/anaconda/lib/python3.6/site-packages/ipykernel_launc
我正在尝试编写一个函数,该函数将使用 4 阶隐式 Runge-Kutta 方法 (IRK) 求解 ODES 系统,但我无法正确定义循环。这里我们定义 IRK 任何建议将不胜感激! function [
Gaffer on Games 有一个 great article关于使用RK4 integration为了更好的游戏物理。实现很简单,但其背后的数学让我感到困惑。我在概念层面上了解导数和积分,但已经
这个公式主要是这个线程的结果:Differential Equations in Java . 基本上,我尝试遵循 Jason S. 的建议,并通过 Runge-Kutta 方法 (RK4) 实现微分
我是Python的新手,我对编程语言的了解还处于起步阶段,所以我复制了所示的Runge-Kutta Python脚本here并根据我的目的对其进行了修改。这是我当前的脚本: import numpy
我一直在将 4 个链接微分方程的欧拉方法实现转换为四阶龙格库塔实现。我相当确信我的一般方法是正确的,并且我已经了解如何应用 RK4,但我可能已经有 6 年没有做过任何半严肃的数学了,所以我可能会错过某
我尝试求解简单的数值方程 - 没有源的线性波动方程:utt = v2 uxx 其中 v - 波速。 我使用初始条件: u(x, 0) = sin(x) ux(x, 0) = -v * sin(x) 对
我是一名优秀的程序员,十分优秀!