使用openmdaov1.7.3 Alpha
我有一个简单的例子OpenMDAO问题由两个隐式组件组成:
(问题底部的代码)
不幸的是,当我在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
我解决了这个问题。而不是
我需要这样做:
虽然初始参数值不是问题的原因,但设置初始值的最简单方法是:
第一次执行的顺序由
connect
语句的顺序决定。Group.list_order()
将打印出组内组件的执行顺序。你知道吗代码:
输出:
相关问题 更多 >
编程相关推荐