Неявный компонент OpenMDAO 1.2.0

Я новичок в OpenMDAO и все еще учусь формулировать проблемы. Для простого примера предположим, что у меня есть 3 входные переменные с заданными границами:

1 <= x <= 10
0 <= y <= 10
1 <= z <= 10

и у меня есть 4 выхода, определенные как:

f1 = x * y
f2 = 2 * z
g1 = x + y - 1
g2 = z

моя цель — минимизировать f1 * g1, но обеспечить ограничение f1 = f2 и g1 = g2. Например, одно решение: x=3, y=4, z=6 (не знаю, оптимально ли это).

Для этой простой задачи вы, вероятно, можете просто передать ограничения равенства вывода драйверу. Однако для моей актуальной задачи сложно найти начальную точку, удовлетворяющую всем ограничениям, и в результате оптимизатор ничего не сделал. Я полагаю, что, возможно, я мог бы определить y и z как состояния в неявном компоненте и заставить нелинейный решатель определить правильные значения y и z при заданном x, а затем передать x драйверу оптимизации.

Это возможный подход? Если да, то как в этом случае будет выглядеть неявный компонент? Я просмотрел учебник по проблеме Селлара, но не смог перевести его на этот случай.


person pkerichang    schedule 20.10.2015    source источник


Ответы (1)


Вы можете создать неявный компонент, если хотите. В этом случае вы должны определить метод apply_linear в своем компоненте. Это делается с помощью проблемы с селларом здесь.

В вашем случае, поскольку у вас есть набор остатков из двух уравнений, которые оба зависят от переменных состояния, я предлагаю вам создать одну переменную состояния массива длины 2, назовите ее foo (я использовал новую переменную, чтобы избежать путаницы, но имя да что хочешь!). Затем вы определите два остатка, по одному для каждого элемента остаточного массива новой переменной состояния.

Что-то типа:

resids['foo'][0] = params['x'] * unknowns['foo'][0] - 2 * unknowns['foo'][1]
resids['foo'][1] = params['x'] + unknowns['foo'][0] - 1 - unknowns['foo'][1]

Если вы хотите, чтобы имена переменных состояния были разделены, вы могли бы, и это все равно будет работать. Вам просто нужно произвольно присвоить одно уравнение невязки одной переменной, а другое — другой.

Тогда остается только добавить нелинейный решатель в группу, содержащую ваш неявный компонент, и он должен работать. Если вы решите использовать решатель Ньютона, вам нужно либо установить fd_options['force_fd'] = True, либо определить производные ваших остатков по всем параметрам и переменным состояния.

person Justin Gray    schedule 21.10.2015
comment
Спасибо за помощь, еще несколько вопросов: 1. foo должно быть s? Если нет, то почему мы не используем unknowns['foo'][1] и unknowns['s'][0]? 2. Меня всегда путают названия остатков; является остатком для переменной состояния, которая должна иметь то же имя, что и эта переменная? Означает ли это, что они каким-то образом являются одной и той же переменной? Если да, то всегда ли производная остатка по состоянию с тем же именем равна 1? - person pkerichang; 22.10.2015
comment
Прошу прощения за путаницу. Я отредактировал свой ответ, чтобы он был правильным. Везде должно быть "foo". - person Justin Gray; 23.10.2015