导弹太空物理学,宇宙飞船 - 学习微积分版

时间:2011-09-16 04:12:40

标签: math physics calculus

假设我们有导弹A,具有位置矢量和速度大小(忽略加速度,就像许多游戏一样)和太空飞船B,具有位置和速度矢量。现在,这种导弹是一个讨厌的寻找导弹,将试图找到最佳的太空船B拦截。

导弹A有两个优点:它知道微积分,它可以计算多项式的根。然而,导弹,或抽象的,程序员,仍在学习微积分,并想知道他是否有正确的方程式。 (多项式根源将由一个名为Jenkins-Traub Code的Netclib实现的好人解决)

即便:

  • mp =导弹位置

  • mv =导弹速度

  • sp =宇宙飞船位置

  • sv =宇宙飞船速度

  • t =时间

根据程序员的最佳猜测,拦截方程为: t sp sv + t sp mv - t mp sv - t mp mv

除非我非常确定我完全走错了轨道,因为在这个混乱中应该有一些指数;这是尝试解决: (SP-MP)(SV-MV)(t)的

我的另一个选择是区分(sp-mp)(sv-mv)^ 2,但我想先得到反馈,部分是因为,除非我弄错了,'(sp-mp)'解析为'1' 。这似乎......奇怪。 OTOH,这个功能正在改变的速度可能正是我正在寻找的。

那么 - 我有什么问题,在哪里以及为什么?

感谢。

Potentially-useful link to first thread.

编辑:

总结方程:

(a + bx)+(c + ex)

(a + 1bx ^ 0)+(c + 1ex ^ 0)

(a + 1)+(c + 1)

非存活的。

方程式的乘积:

(A + BX)(C + EX)

AC + AEX + CBX + BEX ^ 2

不是多项式(无法用Jenkins-Traub解决)并且看起来不太正确。

AC + 1aex ^ 0 + ^ 1cbx 0 + 2bex ^ 1

AC + AE + CB + 2bex

我认为绝对不是那样。

3 个答案:

答案 0 :(得分:2)

导弹的2D运动方程是(假设从t = 0开始)

[ mpx(t) = mpx(0) + mvx*t , mpy(t) = mpy(0) + mvy*t ]

宇宙飞船的动作是

[ spx(t) = spx(0) + svx*t , spy(t) = spy(0) + svy*t ]

其中mpx(0) mpy(0) spx(0) spy(0)是初始位置组件

因此要相交,您必须拥有mpx(t)=spx(t)mpy(t)=spy(t)。哪两个方程可以解决两个未知数。一个可能是拦截t的时间,另一个是slope=mvy/mvx给出的导弹的方向。或者它可能是导弹mpx(0)mpy(0)的初始位置,或者是给定目标拦截时间的速度分量。

从问题中不清楚你在寻找什么。

答案 1 :(得分:0)

瞬时解决方案

Position_Ship + t*Velocity_Ship = Position_Missile + t*Velocity_Missile

如果将它们设置为拦截,则可以在任意维度上轻松解决t

如果你想确定Velocity_Missile,我们还需要一个约束。

N = (Position_Missile - Position_Ship) ^ Velocity_Ship(跨产品)

N dot Velocity_Missle = 0

这将为您提供一对或线性联立方程。

动态解决方案

如果最初给出Velocity_Missile并且我们想要应用加速直到我们进入限制半径,那么它就变得棘手了。您可以使用简单的追踪曲线获得美观的解决方案,或者我们可以获得数值......

Velocity_Missile'成为上面的瞬时解,导出相应的t',给定电机的功效,您可以计算出t''时间来传递速度变化。添加此t''*Ship_Velocity以获取更新的目标位置。迭代。

答案 2 :(得分:0)

如果你有mp,mv和sp,那么计算sv和t:

mp+mv(t)=sp+sv(t) and |sv|=q (maxspeed)
mp+mv(t)-sp+sv(t)=0

mpx+mvx*t-spx+svx*t=0
mpy+mvy*t-spy+svy*t=0

svx^2+svy^2=q^2
svx^2+svy^2-q^2=0

然后我们可以解决:

(mpx-spx)/t+mvx=svx
(mpy-spy)/t+mvy=svy

((mpx-spx)/t+mvx)^2+((mpy-spy)/t+mvy)^2=q^2
(mpx-spx)^2/t^2+2*mvx*(mpx-spx)/t+mvx^2+(mpy-spy)^2/t^2+2*mvy*(mpy-spy)/t+mvy^2=q^2
((mpx-spx)^2+(mpy-spy)^2)/t^2+(2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/t+mvx^2+mvy^2-q^2=0
((mpx-spx)^2+(mpy-spy)^2)+(2*mvx*(mpx-spx)+2*mvy*(mpy-spy))*t+(mvx^2+mvy^2-q^2)*t^2=0
((mpx-spx)^2+(mpy-spy)^2)/(mvx^2+mvy^2-q^2)+(2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/(mvx^2+mvy^2-q^2)*t+t^2=0

c = (mvx^2+mvy^2-q^2)
if   a = (2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/c
and  b = ((mpx-spx)^2+(mpy-spy)^2)/c
then t = -a/2+-sqrt(a^2/4-b)

a/2 = (2*mvx*(mpx-spx)+2*mvy*(mpy-spy))/2c
a/2 = (mvx*(mpx-spx)+mvy*(mpy-spy))/c
a^2/4 = (mvx^2*(mpx-spx)^2+2*mvx*(mpx-spx)*mvy*(mpy-spy)+mvy^2*(mpy-spy)^2)/c^2

b/c^2=((mpx-spx)^2+(mpy-spy)^2)*c
b/c^2=((mpx-spx)^2+(mpy-spy)^2)*(mvx^2+mvy^2-q^2)
b/c^2=mvx^2(mpx-spx)^2+mvx^2(mpy-spy)^2+mvy^2(mpx-spx)^2+mvy^2(mpy-spy)^2-q^2(mpx-spx)^2-q^2(mpy-spy)^2

t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt((mvx^2*(mpx-spx)^2+2*mvx*(mpx-spx)*mvy*(mpy-spy)+mvy^2*(mpy-spy)^2)-(mvx^2(mpx-spx)^2+mvx^2(mpy-spy)^2+mvy^2(mpx-spx)^2+mvy^2(mpy-spy)^2-q^2(mpx-spx)^2-q^2(mpy-spy)^2))/c

t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt((2*mvx*(mpx-spx)*mvy*(mpy-spy))-(mvx^2(mpy-spy)^2+mvy^2(mpx-spx)^2)+q^2((mpx-spx)^2+(mpy-spy)^2)))/c

t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2((mpx-spx)^2+(mpy-spy)^2)))/c

t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2(c+q^2))/c
t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2(c+q^2))/c

t = -(mvx*(mpx-spx)+mvy*(mpy-spy))/c +- sqrt(-(mvx(mpy-spy)-mvy(mpx-spx))^2+q^2(c+q^2))/(mvx^2+mvy^2-q^2)

我没有时间进一步简化,但可以完成,或只是评估它。

然后插回:

svx=(mpx-spx)/t+mvx
svy=(mpy-spy)/t+mvy

获取s矢量。

也许我在某处犯了错误......