GAMS, как двигать частицу по самому эффективному пути - PullRequest
0 голосов
/ 25 ноября 2018

Я стараюсь рассчитать маршрут, который требует меньше времени для перехода из точки А в точку В при наличии постоянного потока (т.е. простая версия проблемы навигации Цермело) с использованием программного обеспечения 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.

Я некоторое время смотрел на этот код и не могу найти, где моя ошибка.

Может кто-нибудь подсказать, пожалуйстамне что я делаю не так?Большое спасибо за чтение.

...