Почему некоторые переменные привязаны к себе в видео "Указание разреженных частных производных для простого векторизованного компонента"? - PullRequest
0 голосов
/ 27 апреля 2020

В этом видео Джастин написал в функции вычисления своего компонента следующее:

def compute(self, inputs, outputs):

    self.alp_sc = 0.91
    T0 = 28. #reference temperature
    eff0 = .285 #efficiency at ref temp
    T1 = -150.
    eff1 = 0.335

    delta_T = inputs['T'] - T0
    self.slope = (eff1 - eff0) / (T1 - T0)

    outputs['eta'] = (eff0 + self.slope * delta_T)/self.alp_sc

Почему он решил использовать self.slope и self.alp_sc вместо просто переменные? Это что-то важное для openMDAO / векторизованных компонентов или просто произвольный выбор?

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Атрибуты (например, self.alp_sc) - это константы, которые никогда не предназначались для изменения для этого примера компонента. Они не должны быть входными переменными, потому что они никогда не будут связаны с.

Лучшей практикой считается для определения частных производных для всех выходов по всем входам в любом компоненте. Поэтому, придавая этим значениям атрибуты, мы можем уважать лучшие практики и избегать объявления частичных значений для вещей, которые, как мы знаем, никогда не изменятся.

1 голос
/ 27 апреля 2020

Если вы продолжаете смотреть видео , , self.slope и self.alp_sc также используются в методе compute_partials. self.alp_sc является константой, поэтому я думаю, что она могла быть объявлена ​​в методе initialize класса (если это параметр, который вы хотите потенциально изменить для разных экземпляров) или вне класса (если это действительно постоянная). self.slope в этом случае также является константой, поэтому то же самое относится. Но представьте, что наклон будет зависеть от входных данных вашего компонента, и вам нужно будет пересчитывать его в каждой итерации (и, скажем, это также очень дорого в вычислительном отношении, чего в примере явно нет). В этом случае вы можете сохранить некоторые вычисления, сохранив значение в атрибуте класса (self.slope) и просто повторно использовав его в производных вычислениях. Необходимо убедиться в том, что в каждой итерации compute вызывается до compute_partials (в противном случае вы можете использовать устаревшее значение из предыдущей итерации в вычислении производной), но я думаю, что это всегда так в текущем OpenMDAO 3.0.

Довольно часто вам нужно вычислять одинаковые величины для функции и для производных. Хранить его в атрибуте - это один из способов (меньше вычислений), или вызывать ту же функцию в compute, а compute_partials (вдвое больше вычислений, меньше памяти) - еще один способ.

0 голосов
/ 27 апреля 2020

Из фрагмента кода похоже, что def compute(self, inputs, outputs) - это метод внутри объекта / класса. Это видно из того, что self находится в процессе инициализации.

self.slope и метод self.alp_s cwill be variables that are declared within the scope of the object that the compute () `является частью.

См. классов в Python Подробнее об этом.

...