Космическая физика для ракет, космических кораблей - издание «Учебное исчисление» - PullRequest
5 голосов
/ 16 сентября 2011

Предположим, у нас есть ракета A с вектором положения и величиной скорости (игнорируя ускорение, как это делают многие игры) и космический корабль B с векторами положения и скорости.Теперь эта ракета, будучи противной ракетой поиска, попытается найти лучший перехват для космического корабля B.

Ракета A имеет два преимущества: она знает исчисление и может вычислять корни полиномов.Тем не менее, ракета, или абстракция, программист все еще изучает исчисление и хочет знать, имеет ли он правильное уравнение.(Полиномиальные корни будут определены хорошим парнем по имени Код Дженкинса-Трауба, реализованный из 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'.И это кажется ... странным.OTOH, скорость, с которой эта функция меняется, может быть той, что я ищу.

Итак - Что я ошибся, где и почему?

Спасибо.

Потенциально полезная ссылка на первый поток.

Редактировать:

Суммирование уравнений:

(a + bx) + (c + ex)

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

(a + 1) + (c + 1)

нежизнеспособно.

Произведение уравнений:

(a + bx) (c + ex)

ac + aex + cbx + bex ^ 2

Не многочлен (не может решить с Дженкинсом-Траубом) и выглядит не совсем правильно.

ac + 1aex ^ 0 + 1bbx ^ 0 + 2bex ^ 1

ac + ae + cb + 2bex

И, конечно, не то, я думаю.

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

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), или компоненты скорости с учетом времени перехвата цели.

Из вопроса не ясно, что вы ищете.

0 голосов
/ 16 сентября 2011

Если у вас есть 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.

Возможно я 'мы где-то совершили ошибку ...

0 голосов
/ 16 сентября 2011

Мгновенное решение

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, чтобы получить обновленную целевую позицию. Итерации.

...