python - 隐式组件:设置初始参数值
问题描述
使用OpenMDAO v1.7.3 Alpha
我有一个由 2 个隐式组件组成的简单示例 OpenMDAO 问题:
- 第一个组件使用温度计算电压
- 第二个组件使用电压来计算温度
(问题底部的代码)
不幸的是,当我在 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
解决方案
我解决了这个问题。代替
# 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
推荐阅读
- python - 获取某人的头像并将其用于我的个人资料 discord.py
- python - Scrapy 不会消耗所有 start_urls
- javascript - Javascript find the closest number in an array of objects and retrieve the object's key value
- xml - 将变量中的值连接到 xml 文件中
- flutter - 通过 Google 登录获取生日和性别在颤动中失败
- java - 尝试运行我的 Spring Boot 应用程序 JAR 时无法确定合适的驱动程序类
- python - 为什么我在 CodeChef 中收到运行时 NZEC 错误?
- python - 如何用python制作一个列表循环
- python - 将装饰器添加到库函数而不修改其代码
- r - 如何在 ggplot2 中使用 gg.gap 和 facet_wrap?