Я пытаюсь найти траекторию полета вокруг (а не над) прямоугольного препятствия в плоскости xy. Моя первая попытка сделать это заключалась в создании четырех связанных фаз, каждая из которых находится в ограниченной области (ограничения на координаты x, y и z), связанных в конечных точках. Тем не менее, похоже, что это с трудом сходится и имеет некоторое неожиданное поведение (например, при построении узлов дискретизации состояния во время решения траектория имеет некоторые большие изломы, хотя я ожидаю, что она будет гладким овалом (минимизация квадрата интегрированного дросселя)) . Возможно, объединение четырех траекторий в круг — это особенно сложный набор ограничений для удовлетворения оптимизатора?
Другой способ, который я могу придумать, — это использовать одну фазу, связанную с самой собой, и наказать оптимизатора, если траектория попадает в зону действия здания. Прямоугольник можно построить как произведение двух сумм гиперболических функций тангенса, и это можно добавить в цель как плавный штраф, чтобы целевая функция выглядела примерно так:
Код: Выделить всё
# Add the building constraints
h = 10000
k = 10000
x0 = 10
x1 = 50
y0 = 20
y1 = 100
prob.model.add_subsystem('obj', om.ExecComp("v = sum_throttle_effort + h*sum((tanh(k*(x - x0))+1) - (tanh(k*(x - x1))+1))*(tanh(k*(y - y0))+1) - (tanh(k*(y - y1))+1)))",
h={'val': h},
k={'val': k},
x0={'val': x0},
x1={'val': x1},
y0={'val': y0},
y1={'val': y1},
x={'shape_by_conn':True},
y={'shape_by_conn':True}
))
# Link to position states
prob.model.connect('traj.phase0.timeseries.x', 'obj.x')
prob.model.connect('traj.phase0.timeseries.y', 'obj.y')
prob.model.add_objective('obj.v')
где k — «вертикальность» сторон здания (чем больше, тем лучше), а h — большая константа, налагающая штраф за нахождение в пределах области здания. Однако раньше я использовал этот подход только для соединения отдельных значений с ExecComp, используя src_indices в prob.model.connect. Возможно ли, чтобы эта целевая функция была большой, когда какой-либо из узлов дискретизации состояния находится в пределах области построения? Это то, чего я пытался добиться с помощью суммы в целевой функции и аргументов shape_by_conn, но это в основном догадки.
А может быть, это совершенно неправильный подход, и есть еще одна причина, по которой связанные фазы не работают?
Подробнее здесь:
https://stackoverflow.com/questions/791 ... o-execcomp