Я стараюсь рассчитать маршрут, который требует меньше времени для перехода из точки А в точку В при наличии постоянного потока (т.е. простая версия проблемы навигации Цермело) с использованием программного обеспечения GAMS.Тем не менее, если я поставлю обе точки на прямой линии и установлю постоянный поток равным нулю, я не получу результаты, которые я должен получить.
$set n 10
set j /0*%n%/;
sets
jlast(j)
jnotlast(j);
jlast(j)$(ord(j)=card(j))=yes;
jnotlast(j)=not jlast(j);
scalar
v aeroplane velocity /10/
u wind velocity in the x axis /0/
n number of intervals /%n%/
density density /1.225/
variable
gamma(j),
x(j),
y(j),
time,
objective;
positive variable
t(j)
step;
equation
diffx(j),
diffy(j),
obj;
* diffx[j]$(jnotlast(j)).. x[j+1]-x[j] =e=0.5*(t(j+1)-t(j))*(v*cos(gamma(j+1)) + v*cos(gamma(j)) );
* diffy[j]$(jnotlast(j)).. y[j+1]-y[j] =e=0.5*(t(j+1)-t(j))*(v*sin(gamma(j+1)) + v*sin(gamma(j)) );
diffx[j]$(jnotlast(j)).. x[j+1]-x[j] =e=0.5*step*(v*cos(gamma(j+1))-u + v*cos(gamma(j))-u );
diffy[j]$(jnotlast(j)).. y[j+1]-y[j] =e=0.5*step*(v*sin(gamma(j+1)) + v*sin(gamma(j)) );
obj.. time =e= n*step;
x.fx('0') = 1.0e-12;
x.fx('%n%') = 1.0e-12;
y.fx('0') = 1.0e-12;
y.fx('%n%') = 10;
t.fx('0')= 1.0e-12;
y.up(j) = 10;
y.lo(j) = 1.0e-12;
t.lo(j)=1.0e-12;
gamma.up(j)=pi;
gamma.lo(j)=0;
model brahstron1 /all/;
option
nlp=ipopt;
solve brahstron1 using nlp minimize time;
В этом коде я определил два дифференциальных уравнения:для x '= dx / dt и y' = dy / dt с использованием правила трапеции.Здесь гамма является нашей управляющей переменной, и поэтому она бесплатна.Шаг - это разница между моментами времени j и j + 1, поэтому время равно n (количество интервалов) * шаг (размер интервала), и это то, что я стремлюсь уменьшить.
Ниже приведеноограничения, в том числе начальная и конечная точки для x и y, а также начальные t = 0.
В результате я бы обнаружил, что угловая гамма стала равной pi / 2, а y - между 0 и 10,однако я нахожу странные результаты, так как Y на всех шагах - 5.
Я некоторое время смотрел на этот код и не могу найти, где моя ошибка.
Может кто-нибудь подсказать, пожалуйстамне что я делаю не так?Большое спасибо за чтение.