Есть ли способ применить логарифмическое масштабирование к целям/ограничениям проекта в OpenMDAO? В моей задаче оптимизации мне приходится иметь дело с целевой функцией, которая принимает большие значения и значительно варьируется в пространстве проектирования (между порядками 10 ^ 6 и 10 ^ 7), поэтому в идеале я хотел бы, чтобы драйвер обрабатывал журнал Цель. Я пока модифицировал свою целевую функцию напрямую, но было бы удобнее сделать это на уровне драйвера. Это возможно?
В настоящее время драйверы openmdao не поддерживают нелинейное масштабирование, и правильным подходом является использование компонента. В прошлом я иногда делал отдельный «целевой» компонент, который существует для применения некоторых преобразований к необработанной цели. Это позволяет вам вставлять его в свою модель, когда это необходимо, без необходимости изменять исходные расчеты.
Золотая середина между «изменить компонент» и «попросить API-интерфейс драйвера OpenMDAO сделать это за вас» — использовать ExecComp.
prob.model.add_subsystem('log_scale', om.ExecComp('log_f = log(f)')
prob.model.connect('some_comp.f', 'log_scale.f')
prob.driver.add_objective('log_scale.log_f')
exec-comp будет обрабатывать производные этого преобразования для вас. Все, что вам нужно сделать, это подключить вашу цель к правильному входу экземпляра ExecComp.
Да. ExecComps использует дифференциацию сложных шагов внутри для вычисления своих частей. OpenMDAO автоматически объединит аналитические производные вашего компонента с ExecComp.
Если я предоставлю аналитические партиалы через метод calculate_derivatives в some_comp и свяжу some_comp.f с log_scale.f, как вы предложили, будут ли партиалы log_f автоматически вычислены exec-comp?