导弹、宇宙飞船的空间物理学 - 学习微积分版

5
假设我们有导弹A,具有位置向量和速度大小(忽略加速度,因为许多游戏都是这样),以及飞船B,具有位置和速度向量。现在,这个导弹,作为一枚寻找目标的卑劣导弹,将尝试找到与飞船B最佳的相遇点。
导弹A有两个优势:它懂微积分,可以计算多项式的根。然而,导弹或者说程序员仍在学习微积分,并想知道他是否有正确的方程式。(多项式的根将由一个名叫Jenkins-Traub Code Implemented From Netlib的好家伙解决)
具体如下:
- 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'。这似乎有点奇怪。另一方面,该函数正在变化的速度可能就是我要找的。
所以 - 我错在哪里,为什么错?
谢谢。 第一个线程的潜在有用链接。 编辑:
求方程的和:
(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

我认为肯定不是这个。


1
你忘了提到太空飞船和导弹能控制什么。它们能加速或减速吗?它们能改变方向吗,... - user707582
我的建议是始终从好的草图开始。一旦你在草图上放置了所有对象和变量,解决方案就会变得更加明显。你提醒了我当我学习使用基本编程语言时为一个游戏解决了这个问题(使用重力)。当你自己想出来的时候是你最好的学习方式。 - John Alexiou
什么是未知数?你想要计算什么数量?"截距方程"是什么意思? - Jean-François Corbett
啊,抱歉。顺序是:那个被忽略了,那时最好的拦截就足够了。嗯,是的,我正在尝试自己解决这个问题;感谢您建议将其草图出来。我正在推导一个多项式方程,它将给出在这一瞬间的值下,导弹可以拦截飞船的时间。为什么是多项式方程?嗯,必须是某种类型的方程。而且我知道多项式会起作用。 - Narf the Mouse
没有加速度时,方程是线性的。不需要多项式。加上重力你将得到一个二次多项式。 - John Alexiou
啊,我之前表达不清楚 - 当出现线性方程时,我将其视为最高指数为1的多项式。 - Narf the Mouse
3个回答

2
导弹的二维运动方程式为(假设从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),或者是给定目标拦截时间的速度分量。

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


它必须是“两个”东西,因为有两个方程式。 - John Alexiou
啊,那就说得通了。另一件事就是导弹移动的方向。 - Narf the Mouse

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)

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

然后将 t 插回到:

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

获取 s 向量。

也许我在某个地方做错了什么......


谢谢,但我正在寻求帮助解决问题,而不是寻找解决方案。 :) - Narf the Mouse

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添加到目标位置以获取更新后的目标位置。迭代。


谢谢,但我正在寻求帮助解决问题,而不是寻找解决方案。 :) - Narf the Mouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接