Неявные компоненты: установить начальные значения параметров - PullRequest
0 голосов
/ 30 ноября 2018

Использование OpenMDAO v1.7.3 Alpha

У меня есть простой пример проблемы OpenMDAO, состоящей из 2 неявных компонентов:

  1. Первый компонент использует температуру для расчетанапряжение
  2. , а второй компонент использует напряжение для вычисления температуры

(код внизу вопроса)

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

Следующие параметры связаны с неизвестными, которые обновляются не по порядку, поэтому их начальные значения могут содержать неинициализированные неизвестные значения: ['battery_temp_comp.volt']

Я изучал документацию , но не могу понять, как правильно настроить этот тип Проблемы (с неявными компонентами).Любая помощь приветствуется.Спасибо!


Код:

from __future__ import print_function
import math as m
import numpy

from openmdao.api import Component, Group, Problem, Newton, ScipyGMRES


class BatteryVoltImplicitComp(Component):
    """ A Simple Implicit Component modelling a Battery's Voltage"""
    def __init__(self):
        super(BatteryVoltImplicitComp, self).__init__()

        # Params
        self.add_param('temp', 30.0)

        # Unknowns
        self.add_output('volt', 12.0)

        # States
        self.add_state('delta', 0.0)

    def calc_voltage(self, params, unknowns, resids):
        temp = params['temp']
        voltage_shift = (25.667 - temp) * 0.02933
        return 12.77 + voltage_shift

    def solve_nonlinear(self, params, unknowns, resids):
        pass

    def apply_nonlinear(self, params, unknowns, resids):
        print("Params:   BatteryVoltImplicitComp.temp: {}".format(params['temp']))
        print("Unknowns: BatteryVoltImplicitComp.volt: {}".format(unknowns['volt']))
        print("Resids: BatteryVoltImplicitComp.delta: {}".format(resids['delta']))
        calculated_voltage = self.calc_voltage(params, unknowns, resids)

        resids['delta'] = calculated_voltage - unknowns['volt']


class BatteryTempImplicitComp(Component):
    """ A Simple Implicit Component modelling a Battery's Temperature"""
    def __init__(self):
        super(BatteryTempImplicitComp, self).__init__()

        # Params
        self.add_param('volt', 12.0)
        # Unknowns
        self.add_output('temp', 30.0)

        # States
        self.add_state('delta', 0.0)

    def calc_temp(self, params, unknowns, resids):
        v = params['volt']
        room_temp = 23.0            # celsius
        batt_resist = 50e-3
        power = v**2 / batt_resist
        temp_increase = power / 50  # magic number
        return room_temp + temp_increase

    def solve_nonlinear(self, params, unknowns, resids):
        pass

    def apply_nonlinear(self, params, unknowns, resids):
        print("Params:   BatteryTempImplicitComp.volt: {}".format(params['volt']))
        print("Unknowns: BatteryTempImplicitComp.temp: {}".format(unknowns['temp']))
        print("Resids: BatteryTempImplicitComp.delta: {}".format(resids['delta']))
        calculated_temp = self.calc_temp(params, unknowns, resids)

        resids['delta'] = calculated_temp - unknowns['temp']


if __name__ == '__main__':

    top = Problem()
    root = top.root = Group()

    root.add('battery_temp_comp', BatteryTempImplicitComp())
    root.add('battery_volt_comp', BatteryVoltImplicitComp())

    root.connect('battery_volt_comp.volt', 'battery_temp_comp.volt')
    root.connect('battery_temp_comp.temp', 'battery_volt_comp.temp')
    root.battery_temp_comp.deriv_options['type'] = 'fd'
    root.battery_temp_comp.deriv_options['form'] = 'central'
    root.battery_temp_comp.deriv_options['step_size'] = 1.0e-1
    root.battery_volt_comp.deriv_options['type'] = 'fd'
    root.battery_volt_comp.deriv_options['form'] = 'central'
    root.battery_volt_comp.deriv_options['step_size'] = 1.0e-1

    root.nl_solver = Newton()
    root.ln_solver = ScipyGMRES()

    top.setup()
    top.run()

    print('Solution (battery_volt_comp): volt = {}, temp = {}, resid = {}'.format(top['battery_volt_comp.volt'], top['battery_volt_comp.temp'], top['battery_volt_comp.delta']))
    print('Solution (battery_temp_comp): volt = {}, temp = {}, resid = {}'.format(top['battery_temp_comp.volt'], top['battery_temp_comp.temp'], top['battery_temp_comp.delta']))

Вывод:

###############################################

Настройка: Проверка проблем с корнем на возможные проблемы ...

Не заданы рекордеры,поэтому никакие данные не будут сохранены.Группа '' имеет следующие циклы: [['battery_temp_comp', 'battery_volt_comp']]

Следующие параметры связаны с неизвестными, которые обновляются не по порядку, поэтому их начальные значения могут содержать неинициализированные неизвестные значения: ['battery_temp_comp.volt']

Настройка: проверка корневой проблемы завершена.

###############################################

Параметры: BatteryTempImplicitComp.Вольт: 12,0
Неизвестные: BatteryTempImplicitComp.temp: 30,0
Resids: BatteryTempImplicitComp.delta: 0,0
Параметры: BatteryVoltImplicitComp.temp: 30,0
Неизвестные: BatteryVoltImplicitComp.volt: 12,0 *.delta: 0.0
Параметры: BatteryTempImplicitComp.volt: 12.1
Неизвестные: BatteryTempImplicitComp.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 50.6
Параметры: BatteryTempImplicitComp.volt: 11.9 * 10mp. Unknown. Unknown.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 50.6
Параметры: BatteryTempImplicitComp.volt: 12.0
Неизвестные: BatteryTempImplicitComp.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 50.6 * 10ompmp. Параметр: 50.6 * 10ompmp.Вольт: 12,0
Неизвестный: BatteryTempImplicitComp.temp: 30,0
Resids: BatteryTempImplicitComp.delta: 50,6
Параметры: BatteryVoltImplicitComp.temp: 30,1
Неизвестные: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.delta: 0.64291311
Параметры: BatteryVoltImplicitComp.temp: 29,9
Неизвестные: BatteryVoltImplicitComp.volt: 12,0 * 0,64 * *1263* 1065 *

...

Параметры: BatteryVoltImplicitComp.temp: nan
Неизвестные: BatteryVoltImplicitComp.volt: nan
Остатки: BatteryVoltImplicitComp.delta: 0.64291311
[root] NL: NEWTON 1 |Не удалось сойтись после 1 итерации
Решение (battery_volt_comp): вольт = nan, temp = nan, остаток = -inf
Solution (battery_temp_comp): volt = nan, temp = nan, остаток = -inf

1 Ответ

0 голосов
/ 30 ноября 2018

Я исправил проблему.Вместо

# Params
self.add_param('temp', 30.0)
# Unknowns
self.add_output('volt', 12.0)
# States
self.add_state('delta', 0.0)
...
resids['delta'] = calculated_temp - unknowns['temp']

мне нужно было сделать следующее:

# Params
self.add_param('temp', 30.0)
# Unknowns / Residuals
self.add_state('volt', 12.0)
...
resids['volt'] = calculated_voltage - unknowns['volt']

К сожалению, он не сходится, когда я запускаю его в OpenMDAO.Я думаю, проблема в том, что я не устанавливаю начальные значения параметров.

Хотя начальные значения параметров не были причиной моей проблемы, самый простой способ установить начальные значения:

top.setup()
top['battery_temp_comp.temp'] = 23.0
top.run()

Порядок 1-го исполнения определяется порядком connect операторов.Group.list_order() распечатает порядок выполнения Компонентов внутри группы.


Код:

from __future__ import print_function

from openmdao.api import Component, Group, Problem, Newton, ScipyGMRES


class BatteryVoltImplicitComp(Component):
    """ A Simple Implicit Component modeling a Battery's Voltage"""
    def __init__(self):
        super(BatteryVoltImplicitComp, self).__init__()

        # Params
        self.add_param('temp', 30.0)

        # Unknowns / Residuals
        self.add_state('volt', 12.0)

    def calc_voltage(self, params, unknowns, resids):
        temp = params['temp']
        voltage_shift = (25.667 - temp) * 0.02933
        return 12.77 + voltage_shift

    def solve_nonlinear(self, params, unknowns, resids):
        pass

    def apply_nonlinear(self, params, unknowns, resids):
        print("Params:   BatteryVoltImplicitComp.temp: {}".format(params['temp']))
        print("Unknowns: BatteryVoltImplicitComp.volt: {}".format(unknowns['volt']))
        print("Resids: BatteryVoltImplicitComp.volt: {}".format(resids['volt']))
        calculated_voltage = self.calc_voltage(params, unknowns, resids)

        resids['volt'] = calculated_voltage - unknowns['volt']


class BatteryTempImplicitComp(Component):
    """ A Simple Implicit Component modeling a Battery's Temperature"""
    def __init__(self):
        super(BatteryTempImplicitComp, self).__init__()

        # Params
        self.add_param('volt', 12.0)

        # Unknowns / Residuals
        self.add_state('temp', 30.0)

    def calc_temp(self, params, unknowns, resids):
        v = params['volt']
        room_temp = 23.0            # celsius
        batt_resist = 50e-3
        power = v**2 / batt_resist
        temp_increase = power / 50  # magic number
        return room_temp + temp_increase

    def solve_nonlinear(self, params, unknowns, resids):
        pass

    def apply_nonlinear(self, params, unknowns, resids):
        print("Params:   BatteryTempImplicitComp.volt: {}".format(params['volt']))
        print("Unknowns: BatteryTempImplicitComp.temp: {}".format(unknowns['temp']))
        print("Resids: BatteryTempImplicitComp.temp: {}".format(resids['temp']))
        calculated_temp = self.calc_temp(params, unknowns, resids)

        resids['temp'] = calculated_temp - unknowns['temp']


if __name__ == '__main__':

    top = Problem()
    root = top.root = Group()

    root.add('battery_volt_comp', BatteryVoltImplicitComp())
    root.add('battery_temp_comp', BatteryTempImplicitComp())

    root.connect('battery_volt_comp.volt', 'battery_temp_comp.volt')
    root.connect('battery_temp_comp.temp', 'battery_volt_comp.temp')
    root.battery_temp_comp.deriv_options['type'] = 'fd'
    root.battery_temp_comp.deriv_options['form'] = 'central'
    root.battery_temp_comp.deriv_options['step_size'] = 1.0e-4
    root.battery_volt_comp.deriv_options['type'] = 'fd'
    root.battery_volt_comp.deriv_options['form'] = 'central'
    root.battery_volt_comp.deriv_options['step_size'] = 1.0e-4

    root.nl_solver = Newton()
    root.ln_solver = ScipyGMRES()
    top.setup()
    top['battery_temp_comp.temp'] = 23.0
    top.run()

    print('Solution (battery_volt_comp): volt = {}, temp = {}'.format(top['battery_volt_comp.volt'], top['battery_volt_comp.temp']))
    print('Solution (battery_temp_comp): volt = {}, temp = {}'.format(top['battery_temp_comp.volt'], top['battery_temp_comp.temp']))

Вывод:

########################################

Настройка: проверка корневых проблем на возможные проблемы ...

Рекордер не указан, поэтому данные не будут сохранены.Группа '' имеет следующие циклы: [['battery_temp_comp', 'battery_volt_comp']]

Следующие параметры связаны с неизвестными, которые обновляются не по порядку, поэтому их начальные значения могут содержать неинициализированные неизвестные значения: ['battery_temp_comp.volt']

Настройка: проверка корневой проблемы завершена.

###############################################

Параметры: BatteryTempImplicitComp.Вольт: 12,0
Неизвестные: BatteryTempImplicitComp.temp: 100,0
Resids: BatteryTempImplicitComp.temp: 0,0
Параметры: BatteryVoltImplicitComp.temp: 100,0
Неизвестные: BatteryVoltImplicitComp.volt: 12,0 *.Вольт: 0.0
Параметры: BatteryVoltImplicitComp.temp: 100.0001
Неизвестные: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.volt: -1.41018689
Параметры: BatteryVoltImplicit 99.20 Неизвестный..volt: 12.0
Resids: BatteryVoltImplicitComp.volt: -1.41018689
Параметры: BatteryVoltImplicitComp.temp: 100.0
Неизвестные: BatteryVoltImplicitComp.volt: 12.0001
Resids: BatteryVolt.mpolt68mpmpt9mp9mp9689: BatteryVoltImplicitComp.temp: 100.0
Неизвестные: BatteryVoltImplicitComp.volt: 11.9999
Resids: BatteryVoltImplicitComp.volt: -1.41018689
Параметры: BatteryTempImplicitComp.volt: 12.0001
Неизвестные: BatteryTempImplicitComp.temp: 100.0
Resids: BatteryTempImplicitComp.temp: -19.4
Параметры: BatteryTempImplicitComp.volt: 11.9999
Неизвестные 100mpmp.: BatteryTempImplicitComp.temp: -19.4
Параметры: BatteryTempImplicitComp.volt: 12.0
Неизвестные: BatteryTempImplicitComp.temp: 100.0001
Остатки: BatteryTempImplicitComp.temp: -19.4
Параметры: BatteryTempvolt.* Неизвестные: BatteryTempImplicitComp.temp: 99,9999
Resids: BatteryTempImplicitComp.temp: -19,4
Параметры: BatteryTempImplicitComp.volt: 11,3436283598
Неизвестные: BatteryTempImplicitComp.temp: 10,29 Compmp.temp: 74.2988Tempmp:
Параметры: BatteryVoltImplicitComp.temp: 74.2988322548
Неизвестные: BatteryVoltImplicitComp.volt: 11.3436283598
Остатки: BatteryVoltImplicitComp.volt: -1.41018689
Параметры: BatteryVolt.mpimp 741071 * Неизвестные: BatteryVoltImplicitComp.volt: 11.3436283598
Resids: BatteryVoltImplicitComp.volt: 1.77166725734e-10
Параметры: BatteryVoltImplicitComp.temp: 74.2987322548
Непрямые аккумуляторные батареи.: 1.77166725734e-10
Параметры: BatteryVoltImplicitComp.temp: 74.2988322548
Неизвестные: BatteryVoltImplicitComp.volt: 11.3437283598
Остатки: BatteryVoltImplicitComp.volt: 1.7716672525-образная точка:* Неизвестные: BatteryVoltImplicitComp.volt: 11.3435283598
Resids: BatteryVoltImplicitComp.volt: 1.77166725734e-10
Параметры: BatteryTempImplicitComp.volt: 11.3437283598
Неизвестные: BatteryTempImplicitComp.temp: 74.2988322548
Resids: BatteryTempImplicitComp.temp: 0.172329491217
Параметры: BatteryTempImplicitComp.volt: 11.3435283598
Неизвестные: BatteryTempImplicitComp.mpmp2.888 * 288 888: 888.825 * 88.888 * 2888: 888.825 * 288: 2888: 888: 2848: * 2888: 2888: 2848: * * * * 288.888 * 2888: 2888: 2888: 2812: 2888: 2812: 2888: 2812: 2848: 2848: 2848: 2812: 2812: 2812: 2812: 2848: 2848: 2812: 2812: 2812: 2812: 2812: 2812: 2848: 2848: * * * * * * 28 * 28 * 28 * * * * 12: 812: 2812: 2848: * * * * * 8: 064: 812: 32-й пробный * 28-й пробникПараметры: BatteryTempImplicitComp.volt: 11.3436283598
Неизвестные: BatteryTempImplicitComp.temp: 74.2989322548
Resids: BatteryTempImplicitComp.temp: 0.172329491217
Параметры: BatteryTempImplicitCommp.Resids: BatteryTempImplicitComp.temp: 0.172329491217
Параметры: BatteryTempImplicitComp.volt: 11.3396364502
Неизвестные: BatteryTempImplicitComp.temp: 74.4349355547
Resids: BatteryTempImplicitComp.mpmp.mp4.Неизвестные: BatteryVoltImplicitComp.volt: 11.3396364502
Resids: BatteryVoltImplicitComp.volt: 1.77166725734e-10
Параметры: BatteryVoltImplicitComp.temp: 74.4350355547
Неизвестные: BatteryVoltImplicitComp.volt: 11.3396364502
Остатки: BatteryVoltImplicitComp.volt: 2.87769807983e-13 * 1103 Вольт.вольт: 11.3396364502
Resids: BatteryVoltImplicitComp.volt: 2.87769807983e-13
Параметры: BatteryVoltImplicitComp.temp: 74.4349355547
Неизвестные: BatteryVoltImplicitComp.volt * 1380.83 * 138.831109 * Params: BatteryVoltImplicitComp.temp: 74.4349355547
Неизвестные: BatteryVoltImplicitComp.volt: 11.3395364502
Resids: BatteryVoltImplicitComp.volt: 2.87769807983e-13 * 11mp3mpmp.: 74.4349355547
Resids: BatteryTempImplicitComp.temp: 6.37414106563e-06
Параметры: BatteryTempImplicitComp.volt: 11.3395364502
Неизвестные: BatteryTempImplicitComp.temp: 74.4349355547
Resids: BatteryTempImplicitComp.temp: 6.37414106563e-06
Параметры: BatteryTempImplicitComp.volt: 11.3396364502
Неизвестные: BatteryTempImplicitComp.temp: 74.4350355547 * 0615temptemptemp: 615 * .emp.1121 * Параметры: BatteryTempImplicitComp.volt: 11.3396364502
Неизвестные: BatteryTempImplicitComp.temp: 74.4348355547
Resids: BatteryTempImplicitComp.temp: 6.37414106563e-06
Параметры: BatteryTempImpject.Impject.Impject.: 74.4349405893
Resids: BatteryTempImplicitComp.temp: 6.37414106563e-06
Параметры: BatteryVoltImplicitComp.temp: 74.4349405893
Неизвестные: BatteryVoltImplicitComp.volt: 11,3396363030 * 133,83 * 137* Решение (battery_volt_comp): вольт = 11,3396363025, температура = 74,4349405893
Решение (battery_temp_comp): вольт = 11,3396363025, температура = 74,4349405893

...