Чтобы ответить на ваши вопросы в обратном порядке:
1) Можете ли вы FD по всей модели вместо каждого отдельного компонента?Да!
Вы можете настроить FD для любой группы в вашей модели, включая группу верхнего уровня.Затем FD берется через эту группу, а не через каждый компонент в ней.Мы называем это вычислением полу-полной производной, потому что в целом вы можете выбрать подгруппу в вашей модели, и в этом случае FD приближает полную производную по этой группе, но эта полная производная все еще фактически является частной производнойдля общей модели.следовательно, полу-полная производная.
2) Почему вычисление конечных разностей выполняется для этих статических входных переменных?
Теоретически, вы правы, что вам не нужны частные производные от входных данных, которые не могут измениться.Начиная с OpenMDAO 2.4, мы не обрабатываем эту ситуацию автоматически, и у нас нет планов добавлять это в ближайшем будущем.Тем не менее, фреймворк принимает FD только через те части, о которых вы говорите.Звучит так, как будто вы объявляете свои партиалы следующим образом:
self.declare_partials(of=['*'], wrt=['*'], method='fd')
Итак, вы специально просите платформу вычислить все эти партиалы.Вместо этого вы можете указать в аргументе wrt
только те входные данные, которые, как вы знаете, действительно меняются.Конечно, это математически неверно, потому что есть производная по отношению к статическим входам.Если кто-то позже подключит что-то к этим входам и попытается провести оптимизацию, он получит неправильный ответ.Но пока вы осторожны, вы можете специально запрашивать только те части, которые вы хотели от любого компонента, и просто оставить неизменяемые входные данные настолько эффективными, насколько это будет 0.