【发布时间】:2018-11-30 00:31:58
【问题描述】:
使用 OpenMDAO v1.7.3 Alpha
我有一个由 2 个隐式组件组成的简单示例 OpenMDAO 问题:
- 第一个组件使用温度计算电压
- 第二个组件使用电压来计算温度
(问题底部的代码)
不幸的是,当我在 OpenMDAO 中运行它时,它无法收敛。我认为问题在于我没有设置初始参数值。由于 OpenMDAO 正在打印以下消息以输出:
以下参数连接到无序更新的未知数,因此它们的初始值可能包含未初始化的未知值:['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']))
输出:
#######################################设置:检查根问题是否存在潜在问题...
没有指定记录器,因此不会保存任何数据。团体 '' 有以下周期:[['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
残留物:BatteryVoltImplicitComp.delta:0.64291311
参数:BatteryVoltImplicitComp.temp:29.9
未知数:BatteryVoltImplicitComp.volt:12.0
残留物:BatteryVoltImplicitComp.delta:0.64291311
...
参数:BatteryVoltImplicitComp.temp:nan
未知数:BatteryVoltImplicitComp.volt:南
残留物:BatteryVoltImplicitComp.delta:0.64291311
[根] NL: 牛顿 1 | 1 次迭代后无法收敛
解决方案 (battery_volt_comp): volt = nan, temp = nan, resid = -inf
解决方案(battery_temp_comp):volt = nan,temp = nan,resid = -inf
【问题讨论】: