Урок 4. ДВИЖЕНИЕ В ЗАДАННОМ НАПРАВЛЕНИИ И ГРАФОЧИСЛЕННАЯ ОПТИМИЗАЦИЯ ЗАДАЧ, СВЯЗАННЫХ СО СКОРОСТЬЮ

Теоретические положения

Движение от точки р1 по направлению единичного вектора p99 задается:
p=p1+s*p99
Точка р определяется в зависимости от расстояния (длины отрезка).
В свою очередь, если отрезок задан двумя точками р1, р2, единичный вектор р99 вычисляется:
р99=(р2-р1)/|p2-p1|
Скорость: v=s/t, откуда s=vt.
Подставляя вместо  s  - vt, получим искомую зависимость:
p =p1 + v*t*p99,
где p99 - единичный вектор из 4.2.

Упражнения

 n/n   Название упражнений и обращение к тексту МК   Рисунок 
1  4.1. Смоделировать движение точки p от точки р1 до точки р2 в зависимости от скорости (величина постоянная) и времени (переменная). 
4.1.1. Формируем исходные vpd.mac 
4.1.1. Формируем исходные  vpc.mac 
Контрольные вопросы
Рис.4.1.2 
 
2 4.2. Определить движение путника по скошенному и нескошенному лугам из точки р1 в точку р2 так, чтобы время прохождения было наименьшим. Скорость движения по скошенному лугу и нескошенному лугам заданы v1, v2. 
4.2.1. Формируем данные отдельным файлом (МК) tzd20.mac 
4.2.2. Поиск минимума затраченного времени  в МК tzd21.mac 
4.2.3  Поиск искомой точки сворота на границе полей  tzd212.mac 
Контрольные вопросы
Рис.4.3.1 
Рис.4.3.2 
 
3 4.3. Требуется определить маршрут движения судна из точки р1 в точку р2 из условия того, что часть пути судно может двигаться по течению воды (р1-p10). Известны скорость судна и скорость течения. 
4.3.1. Формируем данные отдельным файлом (МК) tship0.mac 
4.3.2. Поиск минимума затраченного времени  tship.mac 
4.3.3  Поиск точки сворота и вид графика tship2.mac 
Контрольные вопросы
Рис.4.2.1 
Рис.4.2.2 
 
ПРИМЕРЫ 
4 4.4. Определить момент поражения мишени pj ракетой pi, если известны скорость v1 и траектория (вектор p1p10) движения мишени. Ракета движется все время по направлению мишени со скоростью v2 (v2>v1). 
4.4.1. Формируем данные upr0.mac 
4.4.2. Определяем минимум расстояния между ними upr.mac 
4.4.3. Определяем точку поражения (вторым запусом upr.mac, поставив условие  при достижении минимума расстояния выйти.
Рис.4.4.1 
Рис.4.4.2
5 4.5.  Определить, на каком наикратчайшем расстоянии пройдут два судна (pi, и pj), если известно, что первое судно идет со скоростью v1 по век-тору p11p12, второе (скорость v2), пытаясь уйти от столкновения, идет, все время сворачивая на угол. 
4.5.1. t2shipd.mac  - МК данных 
4.5.2. t2ship.mac  - поиск мин. расстояния между судами и графика ЦФ 
4.5.3. Фиксирум ситуацию, когда расстояние между судами минимально (в МК поставим соответствующее условие выхода)
Рис.4.5.2 
Рис.4.5.2 
 
Самостоятельно 
6 Задача 1. (Задача Снеллиуса). Определить траекторию движения луча света из точки p1 в точку p2 по двум разным средам, если известно, что скорость распространения света в верхней среде v1, а в нижней - v2. 
Решение - см. задачу по скошенному не скошенному лугу. 
7 Задача 2. (Задача Бернулли о брахистохроне). В вертикальной плоскости определить путь p1 - pi - p2, спускаясь по которому под действием собственной тяжести тело, начав двигаться из точи p1, достигнет точки p2 в кратчайшее время. Используем уравнение ускорения падающего под действием силы тяготения тела a=gt2 и упрощенно будем считать, что в произвольной точке p(x,y) скорость движения над точкой будет v1=sqrt(2gyi) а под точкой - v2=sqrt(2gy2) Задача сводится к задаче движения путника по скошенному и не скошенному лугам и решается с помощью двух циклов
.
Базовые макрокоманды
Язык системы Вектор (краткая подсказка)
Использование клавиатуры при работе в “Вектор”
Использование клавиатуры при редактировании текста в DOS



Упражнение 1. Смоделировать движение точки p от точки р1 до точки р2 в зависимости от скорости (величина постоянная) и времени (переменная).
Решение. Векторная запись такого условия будет:

р=р1+s*s11*р99,

где s11 скорость движения точки, s - переменный параметр время

р99= (p2-p1)/|p2-p1|

Формируем две МК исходных данных и цикла (исполнительной МК).

vpd.mac
print$on
: p1=40.,50. p2=260.,110.
s11=7.0      $ скорость движения точки от р1 к р2
otrezok: p101=p1 p102=p2
s1=$sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) $ длина отрезка
p99=(p2-p1)/s1      $ удиничный вектор направления от р1 к р2
s21=s1/s11  $ время за которое точка пройдет от р1 до р2
vpc: s=0.

vpc.mac
s > s21 ? exit
p=p1+s*s11*p99
okr: p100=p s100=3.0
vpc: s=s+1.0

Контрольные вопросы.
1. Что означает команда: s > s21 ? exit
2. Что означает команда: vscikl: s=s+1.
3. Что означает формула: р=р1+s* s11*p99
4. Как определяется р99? И что это такое?



Упражнение 2. Определить движение путника по скошенному и неско-шенному лугам из точки р1 в точку р2 так, чтобы время прохождения было наименьшим. Скорость движения по скошенному лугу и нескошенному лу-гам заданы v1, v2.

Алгоритмизация: общее время t определяется суммой t1 и t2 :

t=t1+t2=|p-p1|/v1 + |p-p2|/v2
где
p=(1-s)*p11+s*p12 при   0. <s <1.
Формируем ЦФ:
F=t1+t2=|p-p1|/v1 + |p-p2|/v2 -> min
Решение заключается в формировании ЦФ (построении графика), нахожде-нии ее минимального значения (времени, за которое путник пройдет весь путь) и нахождении маршрута движения.


tzd20.mac
$ Задача о пешеходе  из точки p1 в p2  по скошенному и не скошенному лугу
: p1=30.,140. p2=220.,0.
: s11=8.0 s12=4.0
: p10=30.,70. p11=220.,70.  $  граница скошенного и не скошенного луга
otrezok: p101=p10 p102=p11
tzd21 : s99=100. s=0. p90=x10,s99


tzd21.mac
s > 1.001 ? exit
p=(1.-s)*p10+ s*p11
otrezok: p101=p1 p102=p
otrezok: p101=p2
s1=$sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y))
s2=$sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y))
s21=s1/s11  $  время по скошенному лугу
s22=s2/s12  $  время по не скошенному лугу
s23=s21+s22 $  время затраченное по тому и другому полю
s23 < s99 ? s99=s23   $  в s99  наименьшее затраченное время
$ строим график зависимости времени от точки на границе
otrezok: p101=p90 p102=x,s23+100.
p90=p102
n50=s99*1000.
$  n50 <> 40830 ? exit
tzd21: s=s+0.05

tzd212.mac
s > 1.001 ? exit
p=(1.-s)*p10+ s*p11
otrezok: p101=p1 p102=p
otrezok: p101=p2
s1=$sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y))
s2=$sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y))
s21=s1/s11  $  время по скошенному лугу
s22=s2/s12  $  время по не скошенному лугу
s23=s21+s22 $  время затраченное по тому и другому полю
s23 < s99 ? s99=s23   $  в s99  наименьшее затраченное время
$ строим график зависимости времени от точки на границе
otrezok: p101=p90 p102=x,s23+100.
p90=p102
n50=s99*1000.
n50 <> 40830 ? exit
tzd212: s=s+0.05
 



Упражнение 3. Судно движется из р1 в пункт р2. Получены данные о направлении потока воды, не совпадающего с курсом судна. Требуется определить маршрут движения судна из точки р1 в точку р2 из условия того, что часть пути судно может двигаться по течению воды (р1-p10). Известны скорость судна и скорость течения.
Формализация (алгоритмизация) задачи. Время движения судна по течению воды (р1-p) и далее по прямой (р-p2) определяется как сумма t=s12/(v1+v2)+s11/v1 и стремиться к минимуму. Время является ЦФ, минимум которой даст минимальное значение времени движения судна по мар-шруту. Таким образом, задача сводится к простому перебору точек на пря-мой р1-р10, вычислению значений времени на прохождение маршрута, сравнению их и выбору из них наименьшего в s99.

tship0.mac
$ print$on
$ Оптимальный маршрут судна-(минимально-затраченное время)
$ Известны скорость судна s1 и скорость воды(ветра) s2
: s1=8.0 s2=5.0   $ скорость воды
$ примем время по прямой s21, а минимальное затраченное время в s99
$ в s78  текущее время
$ Известны направления движения судна p1-p2
: p1=60., 25. p2=170., 125.
$ и напрвление движения воды (ветра) p1-p11
p11 = 260.,65.
$ Задаем направление движения воды
otrezok: p101=p1 p102=p11
$ Определим время за которое судно пройдет путь напрямую
s11=$sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
$  Рассчитываем время затраченное по прямой
 s21=s11/s1 $ время (путь разделить на скорость) затр. по прямой
p99=x1,s21  $ вспомогат. точка для графика времени от точки сворота
tship : s=0.0  s99=1000.

tship.mac
s > 1.001 ? exit
p=(1.-s)*p1+s*p11
otrezok: p101=p p102=p2
$  определяем время затраченное от начала пути p1 до р и от р до р2
$ скорость на отрезке p1-p
 s3=s1+s2
$ расстояние s10 от р1 до р
s10=$sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1))
s7=s10/s3  $  время затраченное от р1 до р
$  определяем время затраченное от р до р2
$  определяем расстояние p-p2
 s20= $sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y))
$ и время затраченное по пути р-p2
s8=s20/s1
$ суммарное время
 s78=s7+s8
$ Минимально-затраченное время зафиксируем в регистре s99
s78 < s99 ? s99=s78
$ Построим график зависимости  времени от точки (х) сворота движения
otrezok : p101=p99  p102=x,s78
p99=p102
 tship : s=s+0.05

tship2.mac
s > 1.001 ? exit
p=(1.-s)*p1+s*p11
otrezok: p101=p p102=p2
$  определяем время затраченное от начала пути p1 до р и от р до р2
$ скорость на отрезке p1-p
 s3=s1+s2
$ расстояние s10 от р1 до р
s10=$sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1))
s7=s10/s3  $  время затраченное от р1 до р
$  определяем время затраченное от р до р2
$  определяем расстояние p-p2
 s20= $sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y))
$ и время затраченное по пути р-p2
s8=s20/s1
$ суммарное время
 s78=s7+s8
$ Минимально-затраченное время зафиксируем в регистре s99
s78 < s99 ? s99=s78
$ Построим график зависимости  времени от точки (х) сворота движения
otrezok : p101=p99  p102=x,s78
p99=p102
n50=s99*1000.
n50 <> 17347 ? exit
tship2 : s=s+0.05

Контрольные вопросы.
1. В каком регистре будет минимально затраченное время?
2. Как определить точку сворота р
3. Что обозначает параметр s
4.  Что означает строчка:s78 < s99 ? s99=s78
5.  Как строится график ЦФ?
6.  Что от чего зависит при построении графика ЦФ
7.  С каким шагом выполняется вычисление?
8.  Запишите минимум затраченного времени и координаты точки сворота.


Пример 4.1. Определить момент поражения мишени pj ракетой pi, если из-вестны скорость v1 и траектория (вектор p1p10) движения мишени. Ракета движется все время по направлению мишени со скоростью v2 (v2>v1).
Формализация.
s= |pi-pj| -> min
pi=p1+t*v1*(p10-p1)/|p10-p1|
pj=p3+t*v1*(p-pj)/|p-pj|

upr0.mac
print$on
$ s11 - скорость самолета
$ s12 - скорость ракеты
ck
: s11=10.0  s12=15.0
: p10=70.,0. p11=50.,105. p12=250.,125.
otrezok: p101=0.,0. p102=200.,0.
otrezok: p101=p11 p102=p12
okr: p100=p10 s100=2.0
p99=(p12-p11)/$sqrt((x12-x11)*(x12-x11)+(y12-y11)*(y12-y11))
upr: s=0. s33=0.25 p77=p11 s99= 1000.

upr.mac
s > 20. ? exit
p=p11+s*s11*p99
okr: p100=p s100=5.0
s10=$sqrt((x-x10)*(x-x10)+(y-y10)*(y-y10))
p98=(p-p10)/s10
p3=p10+s33*s12*p98
okr: p100=p3 s100=3.0
otrezok: p101=p3 p102=p
p10=p3
s21=$sqrt((x-x10)*(x-x10)+(y-y10)*(y-y10))
otrezpk: p101=p77 p102=x,s21
p77=p102
s21 < s99 ? s99=s21
$ s21 < s33 ? exit
n50 = s99*100000.
$ n50 <> 6666 ? exit
upr: s=s+s33



Пример 4.2. Определить, на каком наикратчайшем расстоянии пройдут два судна (pi, и pj), если известно, что первое судно идет со скоростью v1 по век-тору p11p12, второе (скорость v2), пытаясь уйти от столкновения, идет, все время сворачивая на угол.
Формализация.
s= |pi-pj| -> min
pi=p1+t*v1*(p10-p1)/|p10-p1|
pj=p2+t*v2*(p10+dx)-p3)/|p10+dx)-p3|
где t - переменный параметр, dx - шаг приращения.

t2shipd.mac
$ print$on
$ s11 - скорость 1-го судна
$ s12 - скорость 2-го судна
ck
: s11=8.0  s12=18.0
: p10=50.,0. p11=50.,105. p12=250.,125.
otrezok: p101=0.,0. p102=200.,0.
otrezok: p101=p11 p102=p12
okr: p100=p10 s100=2.0
p99=(p12-p11)/$sqrt((x12-x11)*(x12-x11)+(y12-y11)*(y12-y11))
t2ship: s=0. s33=0.3 p77=p11 y90=y10 s32=3.14/2. s31=20. s99=1000.

t2ship.mac
s > 20. ? exit
p=p11+s*s11*p99
x91=x10+s31
s32 < 0. ? s32=0.
y91=y10+tan(s32)*x91
s10=$sqrt((x91-x10)*(x91-x10)+(y91-y10)*(y91-y10))
p98=(p91-p10)/s10
p3=p10+s33*s12*p98
otrezok: p101=p3 p102=p
p10=p3
s21=$sqrt((x-x10)*(x-x10)+(y-y10)*(y-y10))
otrezok: p101=p77 p102=x,s21
p77=p102
s21 < s99 ? s99=s21
n50=s99*1000.
n50 <> 13312  ? exit
t2ship: s=s+s33   s32=s32-(3.14/2.)/20. $ s32=s32-0.05



 
 

Базовые МК

<ck.mac> МК визуализации осей на комплексном чертеже

_Система_коодинат_экрана
 _Начало_СК_:_x0=    40.0      0
 _НСК_на_проекции_YZ_=_(   145.0    95.0     0.0
 _ВИзуализация_Осей_СК__по_ст._проекциям_ 0
 _ВИзуализация_Осей_СК__по_ст._проекциям_ 2
 _ВИзуализация_Осей_СК__по_ст._проекциям_ 3
 _ВИзуализация_Осей_СК__по_ст._проекциям_ 5


<otrezok.mac>  базовая МК построения отрезка прямой

_Линии_общего_назначения
 _Отрезок_прямой____________________________
 _Начальная_точка___=_( x101    y101    z101
 _Кoнeчная_точка____=_( x102    y102    z102
 _Визуализация__по_стандартным_проекциям_ n

<okr.mac>  базовая МК построения окружности

_Линии_общего_назначения
 _Окружность
 _Цeнтр_=_( x100    y100    z100
 _Горизонт._п/ось__= s100
 _Вертик._П/ось____= s100
 _Визуализация_по_стандартным_проекциям_ n

Примечание. Зная номера строк (команд) меню системы можно МК формировать через номера их строк с заданием, если в команде этого требуется, соответст-вующих параметров. Например.

<otrezok.mac>  базовая МК построения отрезка прямой
1                                                (_Линии_общего_назначения)
1                                (_Отрезок_прямой____________________________)
  1   х101 y101 z101      (_Начальная_точка___=_( x101    y101    z101 )
 2   х102 y102 z102      (_Кoнeчная_точка____=_( x102    y102    z102 )
 _ 4 n                          ( Визуализация__по_стандартным_проекциям_ n

<okr.mac>  базовая МК построения окружности

1
 1
  1  x100 y100 z100
 2  s100
  4 n

<ck.mac> МК визуализации осей на комплексном чертеже

23
1  40.0      0
3 145.0    95.0     0.0
4  0
4  2
4  3
4  5


 

Язык системы "Вектор" /кратко/

Переменные хранятся в:
n-n199 - целые числа;
s-s199 - вещественные;
p(x,y,z) - p199 (х-x199, y- y199, z - z199) - типа “точка” (вектора).
Операции: + сложение; - вычитание; * умножение; / деление, = присвоение

Операторы:  ? - условный "если" /ставится после условия /; exit - выход.

Операции: <> - равенство;  > - больше; < - меньше; &  - и; ! - или; ^ - не.

Функции: sin - синус; cos - косинус; tan - тангенс, sqrt - кв. корень.

Директивы:  print$on/off - включить/выключить печать в mgd.log.

Вызов МК: имя МК: список присвоений. Если МК начинается с n, s, p, x, y, z, то при ее вызове перед именем МК ставится (без пробела) символ $.

Комментарии ставится после символа $ с пробелом.



 

Использование клавиатуры при работе в “Вектор”:

enter - ввод команд -строк,

alt+c - вызов командной строки,

alt+s - очистка экрана от рисунков,
alt+M - удаление/восстановление меню,

alt+j - включить/выключить джойстик,

Esc - выход из подсостояний и из системы (подтвердить “y”).


Использование клавиатуры при редактировании текста в DOS

enter - вставить строку (если курсор стоит вначале строки),

enter - переместить все, что за курсором, на новую строку,

Delete - операция, обратная предыдущей, если курсор в конце строки, Delete -  удаление  символа, стоящего после курсора,

Backspase -  удаление впередистоящего символа,

Ctrl+y  удаление непустой строки,

Delete - удаление пустой строки,