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

Упражнения

4.1. Движение по скошенному и не скошенному лугу
4.2. Движение судна по течению +  без него
4.3. Кривая Бернулли - расчет и построение ЦФ 
Дополнительные упражнения
4.4. Определить в какой точке ракета поразит мишень
4.5. Определить движения судов, если одно из них  постоянно сворачивает на определенный угол.
 4.6. Движение яхты 
рис. 4.1
рис. 4.2
рис. 4.3
...............
рис. 4.4
рис. 4.5 
...............
 рис. 4.6
расч. 4.1
расч. 4.2 
расч. 4.3
................
.
................ 
................
 

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

Движение от точки р1 по направлению единичного вектора p99 задается:
p=p1+s*p99,                                                                                    (4.1)
где т. р определяется в зависимости от s - расстояния от р1.

В свою очередь, если отрезок задан двумя точками р1, р2, единичный вектор р99 вычисляется:

р99=(р2-р1)/|p2-p1|                                                                           (4.2)

Скорость: v=s/t,
откуда: s=vt.
Подставляя вместо  s  - vt получим искомую зависимость:
p =p1+v*t*p99,
где p99 - единичный вектор из 4.2.



Так, например, модель движение точки p от точки р1 до точки р2 в зависимости от скорости (величина постоянная) и времени (величина переменная) будет следующая:

Решение. Векторная запись такого условия будет:
        р=р1+s*s11*р99,
где s11 скорость движения точки, s - переменный параметр время
        р99= (p2-p1)/|p2-p1|



 
 
Упражнение 4.1. Движение по скошенноу и не скошенному лугам
 

4.1. Движение по скошенноу и не скошенному лугам

Алгоритмизация:
общее время 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

Решение заключается в формировании ЦФ (построении графика), нахождении ее минимального значения (времени, за которое путник пройдет весь путь) и нахождении маршрута движения.

Решение на языке VBS

' Минимизируем время
' t1 = s1/v1
' t2 = s2/v2
' определяем диапозон (область ограничений) в котором возможно
' движения пешехода на границе лугов - это p11-p12

' Задание исходных данных опускаем

tmin=1000   '  эталон

' Определяем минимум затраченного времени при занных скоростях движения путника в цикле

 For u = 0. To 1.01 Step 0.1
      x = (1.-u)*x11+ u*x12
      y = (1.-u)*y11+ u*y12
      z = 0
      s1=sqr((x1-x)*(x1-x)+(y1-y)*(y1-y))  ' расстояние которое путник может пройти по скошенному полю
      s2=sqr((x2-x)*(x2-x)+(y2-y)*(y2-y))  ' по не скошенному
      t1=s1/v1             ' время на скошенное поле
      t2=s2/v2             ' время на нескошенное
      t=t1+t2                ' общее время
      otrezok.s x103, y103, z103, x, t+7, 0      ' график ЦФ
      x103=x
      y103=t+7
      z103=0

      if  t  <  tmin Then    '  условие (блок) при котором выполнятся разные операции
       tmin=t                    '  выбор минимального числа
       otrezok.s x104, y104, z104, x, t+6, 0    '  построение ЦФ
       x104=x
       y104=t+6
       z104=0
       x99=x                    ' запоминание текущей точки при минимуме
       y99=y
      End if
 Next

' вывод сообщений о минимально-затраченном времени и в какой точке пешеход должен свернуть на нескошенное поле написать самостоятельно
 



 
Упражнение 4.2. Движение судна по течению +  без него
4.2. Оптимизация движения по течению и без него
v1=8 ' скорость судна
v2=6 ' скорость воды
' р1-р2 - вектор движение судна
' р1-р3 - вектор движение воды
 

tmin=1000

  For u = 0. To 1.01 Step 0.05
   x = (1.-u)*x1+ u*x3
   y = (1.-u)*y1+ u*y3
   otrezok.s x2, y2, 0, x, y, z
   s1=sqr((x1-x)*(x1-x)+(y1-y)*(y1-y))
   s2=sqr((x2-x)*(x2-x)+(y2-y)*(y2-y))
   v3=v1+v2   '  скорость судна с учетом течения
   t1=s1/v3
   t2=s2/v1
   t=t1+t2
   otrezok.s x99, y99, 0, x, t, 0
   x99=x
   y99=t

   If t < tmin Then
   tmin=t
   otrezok.s x98, y98, 0, x, t-1, 0
   x98=x
   y98=t-1
   krug.s x,y,0,0.1
   x90=x
   y90=y
   End If
  Next

VBSMsg "Минимально затраченное время  = " & tmin & vbCrLf & "в точке поворота"_
& vbCrLf & "х = " & x90 & vbCrLf & "y = " & y90МК

Примечание: задача полностью совпадет с движением по скошенному и не скошенному лугам, поэтому все комментарии см. там.



 
Упражнение 4.3. Кривая Бернулли - расчет и построение ЦФ
4.3. Кривая наискорейшего спуска - задача Бернулли

'заданы две точки: р1 - начало пути и р2 - конец. Найти на р11-р12
'такую точку р, чтобы ломаная линия р1-р-р2 была наибыстрейшего спуска

' вычисляем скорость в верхней части над границей р11-р12
v1=sqr(2.*9.8*(y1-y11))

' вычисляем скорость под р11-р12
v2=sqr(2.*9.8*y1)

etmin=10000. ' эталон

 For s = 0 To 1.001 Step 0.1
  x=(1-s)*x11+s*x12
  y=(1-s)*y11+s*y12
  z=0
  v1=sqr(2.*9.8*(y1-y11))
  v2=sqr(2.*9.8*y1)
' определяем затраченное  время на спуск в верхней и нжней части
  t1=sqr((x1-x)*(x1-x)+(y1-y)*(y1-y))/v1
  t2=sqr((x-x2)*(x-x2)+(y-y2)*(y-y2))/v2
  t=t1+t2  ' суммарное время
  otrezok.s x3, y3, z3, x, t+7, t+7   ' график ЦФ
  x3=x
  y3=t+7
  if t < etmin Then
   etmin = t
   otrezok.s x4, y4, z4, x, t+6, t+6
   x4=x
   y4=t+6
   z4=t+6
   x90=x
   y90=y
   krug.s x, y, z, 0.2
  end if
 Next

VBSMsg "Минимально затраченное время на спуск = " & etmin & vbCrLf & "в точке изгиба"_
& vbCrLf & "х = " & x90 & vbCrLf & "y = " & y90



 
Упражнение 4.4. Определить в какой точке ракета поразит мишень
 

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

' v1=4 - скорость самолета
' v2=6 - скорость ракеты

' единичный ыектор в сторону р10 движения мишени
s99=sqr((x1-x10)*(x1-x10)+(y1-y10)*(y1-y10))
x99=(x10-x1)/s99
y99=(y10-y1)/s99
....

VBSMsg "Минимальное расстояние между мишенью и ракетой = " & smin & vbCrLf & "в точке р"_
        & vbCrLf & "х = " & xx & vbCrLf & "y = " & yy



 
 
 
Упражнение 4.5. Определить движения судов, если одно из них  постоянно сворачивает на определенный угол.
Упражнение 4.5. Определить, на каком наикратчайшем расстоянии пройдут два судна (pi, и pj),
'   если известно, что первое судно идет со скоростью v1 по вектору p11-p12,
'   второе (скорость 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 - шаг приращения.
 

' единичный вектор в сторону р10 движения мишени
s99=sqr((x1-x10)*(x1-x10)+(y1-y10)*(y1-y10))
x99=(x10-x1)/s99
y99=(y10-y1)/s99
th = 0.1

smin=1000

For t =0 To 6 Step th           ' - шаг по времени до 12 часов
  xi=x1+t*v1*x99
  yi=y1+t*v1*y99
  krug.s xi, yi, 0,0.1
       x91=xj+s31
     if s32 < 0. Then s32=0.
       y91=yj+tan(s32)*x91
       s10=sqr((x91-xj)*(x91-xj)+(y91-yj)*(y91-yj))
       x98=(x91-xj)/s10
       y98=(y91-yj)/s10
       xj=xj+th*v2*x98
       yj=yj+th*v2*y98
       s=sqr((xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)) ' определяем минимум этого параметра
  If s < smin Then
   smin=s
   otrezok.s x103,y103,0, xi,s,0
   x103=xi
   y103=s
  xx=xi
  yy=yi
     End iF
    if s < 0.3 Then exit For    ' если суда сблизятся на расстояние меньше 0.2,
      ' будем считать, произошло столкновение
 s32=s32-(3.14/2.)/25.
next

VBSMsg "Минимальное расстояние между судами = " & smin & vbCrLf & "в точке р"_
        & vbCrLf & "х = " & xx & vbCrLf & "y = " & yy



' 4.6. Оптимизация движения яхты по курсу бакштаг (используя фордевинд)

Яхта движется из точки А в точку В. ПО направлению оси y яхта при попутном ветре идет со скоростью 16 узлов, поперек - 4, и напрямую - 7.7. Нужно ответить на вопрос будет ли путь на прямую от А до В  оптимальным

Решение задачи см. МК и рисунок

 



<MK5>
krug.ss p(0,0,0.25),0.25,p(0,0,1)   ' начало системы координат
SetFillColor 250, 250, 250
Otrezok.ss p(-5,0,0.25), p(11,0,0)  ' ось х
Otrezok.ss p(0,0,0.0), p(0,8.5,0)  ' ось y

v1=16               ' скорость яхты по ветру
v2=4  ' v1/2             ' скорость поперек ветра
v3=7.7 ' v2+v2/2          ' скорость яхты по прямой от A до В

Set A =p(0,8,0)     ' точка старта
Set B =p(6,-8,0)    ' финиш
Set p10 =p(0,-8,0)  ' p10 - направления движения яхты по ветру
Otrezok.ss A, B     ' отрезок дижения яхты на прямую от A до B
Otrezok.ss A, p10   ' отрезок дижения яхты по ветру
krug.s A.x,A.y,0.2,0.2   ' прдставление точки старта окружностью
SetFillColor 250, 0, 0   ' заливка окружности, заданной выше красным цветом
krug.s B.x,B.y,0.2,0.2
SetFillColor 250, 0, 0

m=4 ' масштаб ЦФ
tmin=1000  ' наперед заведомо большее заданное время на маршрут
' Далее идет цикл:
' 1) перебора всевозможных точек сворота,
' 2) вычисления времени проходения в каждом случае
' 3) выбора наименьшего времени (срока If t < tmin Then tmin=t )
' 4) построения графика ЦФ
' 5) и ряд для наглядности вспомогательных построений

x99=A.x
y99=A.y

x98=A.x
y98=A.y

For u = 0. To 1.01 Step 0.05   ' цикл
 x = (1.-u)*A.x+ u*p10.x ' цикл покоординатного перебора точек сворота
 y = (1.-u)*A.y+ u*p10.y
 krug.s x,y,0,0.1
 otrezok.s B.x, B.y, 0, x, y, z
 s1=sqr((A.x-x)*(A.x-x)+(A.y-y)*(A.y-y)) ' длина пути до точки сворота
 s2=sqr((B.x-x)*(B.x-x)+(B.y-y)*(B.y-y)) ' длина пути после точки сворота
 vg = (1-u)*v3+u*v2   ' зависимсть скорости при галсе
' vg - линейная зависимоть скорости при галсе:
'  при u=0, vg = v3 - cкорость напрямую
'  при u=1, vg = v2 - скорость поперек ветра
 t1=s1/v1 ' время затраченное по ветру
 t2=s2/vg ' время затраченное при левом галсе
 t=t1+t2  ' общее время затраченное

 otrezok.s x99, y99, 0, m*t, y, 0  ' построение ЦФ отрезками
 krug.s m*t,y,0,0.15      ' построение ЦФ окружностями
 SetFillColor 0, 0, 250            ' заливка цветом
 x99=m*t         ' переприсвоение ординат конца отрезка в начало
 y99=y
 If t < tmin Then    ' выбор минимально затраченного времени
  tmin=t
  otrezok.s x98, y98, 0, m*t+1, y, 0  ' строим ЦФ до ее минимума, сдвинутую на 1
  x98=m*t+1 ' опять переприсвоение
  y98=y
  krug.s m*t+1,y,0,0.1
  SetFillColor 250, 0, 250
  x90=x       ' фиксируем координаты точки сворота при минимуме
  y90=y
 End If
Next
VBSMsg "Минимально затраченное время = " & tmin & vbCrLf & "в точке поворота"_
& vbCrLf & "х =  " & x90 & vbCrLf & "y =  " & y90
otrezok.ss A, p(x90,y90,0)
SetColor 250, 0, 0
RoundPov.Cyl p(x90,y90,0), 0.15, -y90+A.y,  p(0,-1,0)

otrezok.ss B, p(x90,y90,0)
SetColor 250, 0, 0
s=sqr((B.x - x90)^2 + (B.y - y90)^2)
n99x= (B.x - x90)/s
n99y= (B.y - y90)/s
RoundPov.Cyl p(x90, y90, 0), 0.15, s,  p(n99x, n99y, 0)
VBSMsg " длина пути = " &  s + sqr((A.x - x90)^2 + (A.y - y90)^2)
krug.s x90,y90,0.25,0.25
SetFillColor 250, 0, 0

' VBSMsg " v1 " &  v1