Ограничение области в целевой функции с помощью OpenMDAO ExecCompPython

Программы на Python
Ответить
Anonymous
 Ограничение области в целевой функции с помощью OpenMDAO ExecComp

Сообщение Anonymous »

Я пытаюсь найти траекторию полета вокруг (а не над) прямоугольного препятствия в плоскости 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»