首页 > 解决方案 > 隐式组件:设置初始参数值

问题描述

使用OpenMDAO v1.7.3 Alpha

我有一个由 2 个隐式组件组成的简单示例 OpenMDAO 问题:

  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.volt:12.0
未知:BatteryTempImplicitComp.temp:30.0 残差:BatteryTempImplicitComp.delta
:0.0
参数:BatteryVoltImplicitComp.temp:30.0
未知:BatteryVoltImplicitComp.volt:12.0
残差:BatteryVoltImplicitComp.delta:0.0
参数:BatteryTempImplicitComp.volt:12.1
未知:BatteryTempImplicitComp.temp:30.0
残差:BatteryTempImplicitComp.delta:50.6
参数:BatteryTempImplicitComp.volt:11.9
未知数:BatteryTempImplicitComp.temp:30.0
残差:BatteryTempImplicitComp.delta:50.6
参数:BatteryTempImplicitComp.volt:12.0
未知数:BatteryTempImplicitComp.temp:30.0
残差: BatteryTempImplicitComp.delta :50.6 参数:
BatteryTempImplicitComp.volt :12.0 未知数:BatteryTempImplicitComp.temp:
30.0残差:BatteryTempImplicitComp.delta
:50.6
参数:BatteryVoltImplicitComp.temp:30.1
未知数:BatteryVoltImplicitComp.volt:12.0
残差:BatteryVolt291311
参数:0.6 :BatteryVoltImplicitComp.temp:29.9
未知数:BatteryVoltImplicitComp.volt:12.0
Resids:BatteryVoltImplicitComp.delta:0.64291311

...

参数:BatteryVoltImplicitComp.temp:nan
未知数:BatteryVoltImplicitComp.volt:nan
Resids:BatteryVoltImplicitComp.delta:0.64291311
[root] NL:NEWTON 1 | 1 次迭代后无法收敛
解决方案 (battery_volt_comp): volt = nan, temp = nan, resid = -inf
解决方案 (battery_temp_comp): volt = nan, temp = nan, resid = -inf

标签: pythonopenmdao

解决方案


我解决了这个问题。代替

# 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()

第一次执行的顺序由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.volt:12.0
未知数:BatteryTempImplicitComp.temp:100.0 Resids:BatteryTempImplicitComp.temp
:0.0
参数:BatteryVoltImplicitComp.temp:100.0
未知数:BatteryVoltImplicitComp.volt:12.0 Resids: BatteryVoltImplicitComp.volt
:0.0
参数:BatteryVoltImplicitComp.temp:100。
:BatteryVoltImplicitComp.volt:12.0
Resids:BatteryVoltImplicitComp.volt:-1.41018689
参数:BatteryVoltImplicitComp.temp:99.9999
未知数:BatteryVoltImplicitComp.volt:12.0
Resids:BatteryVoltImplicitComp.volt:-1.41018689
参数:BatteryVoltImplicitComplicits12.00
UnmplicitComplicit.0.0
残差:BatteryVoltImplicitComp.volt:-1.41018689
参数:BatteryVoltImplicitComp.temp:100.0
未知数:BatteryVoltImplicitComp.volt:11.9999 残差
:BatteryVoltImplicitComp.volt:-1.41018689
参数:BatteryTempImplicitComp.volt:12.0001
未知数:BatteryTempImplicitComp.Temp
: ResourceComplicit.00000000000000 -19.4
参数:BatteryTempImplicitComp.volt:11.9999
未知数:BatteryTempImplicitComp.temp:100.0残基:BatteryTempImplicitComp.temp
:-19.4
参数:BatteryTempImplicitComp.volt:12.0
未知数:BatteryTempImplicitComp.temp:100.0001 残基:BatteryTempImplicitComp.temp
:-19.4
参数: BatteryTempImp伏特:12.0
Unknowns: BatteryTempImplicitComp.temp: 99.9999
Resids : BatteryTempImplicitComp.temp : -19.4
Params : BatteryTempImplicitComp.volt: 11.3436283598 Unknowns: BatteryTempImplicitComp.temp: 74.2988322548 Resids: BatteryTempImplicitComp.temp : -19.4 Params: BatteryVoltImplicitComp.temp: 74.2988322548 Unknowns: BatteryVoltImplicitComp.volt: 11.3436283598 Resids : BatteryVoltImplicitComp.volt: -1.41018689 Params: BatteryVoltImplicitComp.temp: 74.2989322548 Unknowns: BatteryVoltImplicitComp.volt: 11.3436283598 Resids : BatteryVoltImplicitComp.volt: 1.77166725734e-10 Params: BatteryVoltImplicitComp.temp: 74.2987322548









Unknowns: BatteryVoltImplicitComp.volt: 11.3436283598 Resids
: BatteryVoltImplicitComp.volt: 1.77166725734e-10
Params: BatteryVoltImplicitComp.temp: 74.2988322548
Unknowns: BatteryVoltImplicitComp.volt: 11.3437283598 Resids
: BatteryVoltImplicitComp.volt: 1.77166725734e-10
Params: BatteryVoltImplicitComp.temp: 74.2988322548
Unknowns: BatteryVoltImplicitComp.volt: 11.3435283598 Resids
: BatteryVoltImplicitComp.volt: 1.77166725734e-10
Params: BatteryTempImplicitComp.volt: 11.3437283598
Unknowns: BatteryTempImplicitComp.temp: 74.2988322548 Resids: BatteryTempImplicitComp.temp
: 0.172329491217
Params: BatteryTempImplicitComp.volt: 11.3435283598
Unknowns: BatteryTempImplicitComp.temp
: 74.2988322548 Resids: BatteryTempImplicitComp.temp: 0.172329491217
Params: BatteryTempImplicitComp.volt: 11.3436283598
Unknowns: BatteryTempImplicitComp.temp: 74.2989322548 Resids: BatteryTempImplicitComp.temp
: 0.172329491217
Params: BatteryTempImplicitComp.volt: 11.3436283598
Unknowns: BatteryTempImplicitComp.temp: 74.2987322548
Resids :BatteryTempImplicitComp.temp:0.172329491217
参数:BatteryTempImplicitComp.volt:11.3396364502
未知数:BatteryTempImplicitComp.temp :74.4349355547 残留物:BatteryTempImplicitComp.temp
:0.172329491217
参数:BatteryVoltImplicit355547477
Unknowns: BatteryVoltImplicitComp.volt: 11.3396364502 Resids
: BatteryVoltImplicitComp.volt: 1.77166725734e-10
Params: BatteryVoltImplicitComp.temp: 74.4350355547
Unknowns: BatteryVoltImplicitComp.volt: 11.3396364502 Resids
: BatteryVoltImplicitComp.volt: 2.87769807983e-13
Params: BatteryVoltImplicitComp.temp: 74.4348355547
Unknowns: BatteryVoltImplicitComp.volt: 11.3396364502 Resids
: BatteryVoltImplicitComp.volt: 2.87769807983e-13
Params: BatteryVoltImplicitComp.temp: 74.4349355547
Unknowns: BatteryVoltImplicitComp.volt: 11.3397364502 Resids
: BatteryVoltImplicitComp.volt: 2.87769807983e-13
Params: BatteryVoltImplicitComp.temp: 74.4349355547
Unknowns: BatteryVoltImplicitComp.volt: 11.3395364502 Resids
: BatteryVoltImplicitComp.volt: 2.87769807983e-13
Params: BatteryTempImplicitComp.volt: 11.3397364502
Unknowns : BatteryTempImplicitComp.temp: 74.4349355547 Resids: BatteryTempImplicitComp.temp
: 6.37414106563e-06
Params: BatteryTempImplicitComp.volt: 11.3395364502
Unknowns: BatteryTempImplicitComp.temp : 74.4349355547 Resids: BatteryTempImplicitComp.temp
: 6.37414106563e-06
Params: BatteryTempImplicitComp.volt: 11.3396364502
Unknowns: BatteryTempImplicitComp.temp: 74.4350355547 Resids: BatteryTempImplicitComp.temp
: 6.37414106563e-06
Params: BatteryTempImplicitComp.volt: 11.3396364502
Unknowns: BatteryTempImplicitComp.temp
: 74.4348355547
Resids
: BatteryTempImplicitComp.temp : 6.37414106563e-06 Params: BatteryTempImplicitComp.volt: 11.3396363025 Unknowns: BatteryTempImplicitComp.temp: 74.4349405893 Resids: BatteryTempImplicitComp.temp
: 6.37414106563e-06
Params: BatteryVoltImplicitComp.temp: 74.4349405893
Unknowns: BatteryVoltImplicitComp.volt:11.3396363025 残差
:BatteryVoltImplicitComp.volt:2.87769807983e-13
解决方案(battery_volt_comp):伏特 = 11.3396363025,温度 = 74.4349405893
解决方案(电池_温度补偿):伏特 = 1058974636349393


推荐阅读