隐式组件:设置初始参数值

2024-10-01 04:49:54 发布

您现在位置:Python中文网/ 问答频道 /正文

使用openmdaov1.7.3 Alpha

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

  1. 第一个组件使用温度来计算电压
  2. 第二个分量用电压来计算温度

(问题底部的代码)

不幸的是,当我在OpenMDAO中运行它时,它无法收敛。我想问题是我没有设置初始参数值。OpenMDAO正在打印以下消息以输出:

The following params are connected to unknowns that are updated out of order, so their initial values may contain uninitialized unknown values: ['battery_temp_comp.volt']

我一直在仔细研究documentation,但不知道如何正确设置这类问题(使用隐式组件)。感谢您的帮助。谢谢您!你知道吗


代码:

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']))

输出:

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

Setup: Checking root problem for potential issues...

No recorders have been specified, so no data will be saved. Group '' has the following cycles: [['battery_temp_comp', 'battery_volt_comp']]

The following params are connected to unknowns that are updated out of order, so their initial values may contain uninitialized unknown values: ['battery_temp_comp.volt']

Setup: Check of root problem complete.

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

Params: BatteryTempImplicitComp.volt: 12.0
Unknowns: BatteryTempImplicitComp.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 0.0
Params: BatteryVoltImplicitComp.temp: 30.0
Unknowns: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.delta: 0.0
Params: BatteryTempImplicitComp.volt: 12.1
Unknowns: BatteryTempImplicitComp.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 50.6
Params: BatteryTempImplicitComp.volt: 11.9
Unknowns: BatteryTempImplicitComp.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 50.6
Params: BatteryTempImplicitComp.volt: 12.0
Unknowns: BatteryTempImplicitComp.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 50.6
Params: BatteryTempImplicitComp.volt: 12.0
Unknowns: BatteryTempImplicitComp.temp: 30.0
Resids: BatteryTempImplicitComp.delta: 50.6
Params: BatteryVoltImplicitComp.temp: 30.1
Unknowns: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.delta: 0.64291311
Params: BatteryVoltImplicitComp.temp: 29.9
Unknowns: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.delta: 0.64291311

。。。你知道吗

Params: BatteryVoltImplicitComp.temp: nan
Unknowns: BatteryVoltImplicitComp.volt: nan
Resids: BatteryVoltImplicitComp.delta: 0.64291311
[root] NL: NEWTON 1 | FAILED to converge after 1 iterations
Solution (battery_volt_comp): volt = nan, temp = nan, resid = -inf
Solution (battery_temp_comp): volt = nan, temp = nan, resid = -inf


Tags: selfrootparamstempdeltabatterycompvolt
1条回答
网友
1楼 · 发布于 2024-10-01 04:49:54

我解决了这个问题。而不是

# 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']

Unfortunately, it's failing to converge when I run it in OpenMDAO. I think the problem is that I am not setting initial parameter values.

虽然初始参数值不是问题的原因,但设置初始值的最简单方法是:

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']))

输出:

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

Setup: Checking root problem for potential issues...

No recorders have been specified, so no data will be saved. Group '' has the following cycles: [['battery_temp_comp', 'battery_volt_comp']]

The following params are connected to unknowns that are updated out of order, so their initial values may contain uninitialized unknown values: ['battery_temp_comp.volt']

Setup: Check of root problem complete.

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

Params: BatteryTempImplicitComp.volt: 12.0
Unknowns: BatteryTempImplicitComp.temp: 100.0
Resids: BatteryTempImplicitComp.temp: 0.0
Params: BatteryVoltImplicitComp.temp: 100.0
Unknowns: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.volt: 0.0
Params: BatteryVoltImplicitComp.temp: 100.0001
Unknowns: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.volt: -1.41018689
Params: BatteryVoltImplicitComp.temp: 99.9999
Unknowns: BatteryVoltImplicitComp.volt: 12.0
Resids: BatteryVoltImplicitComp.volt: -1.41018689
Params: BatteryVoltImplicitComp.temp: 100.0
Unknowns: BatteryVoltImplicitComp.volt: 12.0001
Resids: BatteryVoltImplicitComp.volt: -1.41018689
Params: BatteryVoltImplicitComp.temp: 100.0
Unknowns: BatteryVoltImplicitComp.volt: 11.9999
Resids: BatteryVoltImplicitComp.volt: -1.41018689
Params: BatteryTempImplicitComp.volt: 12.0001
Unknowns: BatteryTempImplicitComp.temp: 100.0
Resids: BatteryTempImplicitComp.temp: -19.4
Params: BatteryTempImplicitComp.volt: 11.9999
Unknowns: BatteryTempImplicitComp.temp: 100.0
Resids: BatteryTempImplicitComp.temp: -19.4
Params: BatteryTempImplicitComp.volt: 12.0
Unknowns: BatteryTempImplicitComp.temp: 100.0001
Resids: BatteryTempImplicitComp.temp: -19.4
Params: BatteryTempImplicitComp.volt: 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
Params: BatteryTempImplicitComp.volt: 11.3396364502
Unknowns: BatteryTempImplicitComp.temp: 74.4349355547
Resids: BatteryTempImplicitComp.temp: 0.172329491217
Params: BatteryVoltImplicitComp.temp: 74.4349355547
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
Resids: BatteryVoltImplicitComp.volt: 2.87769807983e-13
Solution (battery_volt_comp): volt = 11.3396363025, temp = 74.4349405893
Solution (battery_temp_comp): volt = 11.3396363025, temp = 74.4349405893

相关问题 更多 >