Python openmdao:约束不存在,代码中存在值错误
我一直在创建一个项目来优化飞机形状以获得最低阻力,并且遇到了两个问题,一个是在应用约束时出现的,并收到了以下错误Python openmdao:约束不存在,代码中存在值错误,python,openmdao,Python,Openmdao,我一直在创建一个项目来优化飞机形状以获得最低阻力,并且遇到了两个问题,一个是在应用约束时出现的,并收到了以下错误 File "/home/name/Desktop/x1ac3opt.py", line 202, in <module> top.setup() File "/usr/local/lib/python2.7/dist-packages/openmdao/core/problem.py", line 498, in setup connections
File "/home/name/Desktop/x1ac3opt.py", line 202, in <module>
top.setup()
File "/usr/local/lib/python2.7/dist-packages/openmdao/core/problem.py", line 498, in setup
connections = self._setup_connections(params_dict, unknowns_dict)
File "/usr/local/lib/python2.7/dist-packages/openmdao/core/problem.py", line 197, in _setup_connections
connections = self.root._get_explicit_connections()
File "/usr/local/lib/python2.7/dist-packages/openmdao/core/group.py", line 685, in _get_explicit_connections
(src, tgt, tgt))
NameError: Source 'p.Sp1' cannot be connected to target 'con.Sp1': 'con.Sp1' does not exist.
`
你知道为什么会这样吗
编辑:
下面是代码的完整性
`对于打印,如果您正在运行Python2.x,请使用此导入
从未来导入打印功能
导入数学为m
从openmdao.api导入IndepVarComp、组件、问题、组、ExecComp、ScipyOptimizer、SqliteRecorder
类OutershellComponent:
包含外部外壳的组件
def __init__(self):
super(Outershell, self).__init__()
self.add_param('Sp1', val=23) #Sec1Span
self.add_param('Sp2', val=13) #Sec2Span
self.add_param('Sp3', val=20) #Sec3Span
self.add_param('Sp4', val=35) #Sec4Span
self.add_param('Sp5', val=35) #Sec5Span
self.add_param('Sw1', val=60) #Sec1Sweep
self.add_param('Sw2', val=60) #Sec2sweep
self.add_param('Sw3', val=50) #Sec3sweep
self.add_param('Sw4', val=37) #Sec4sweep
self.add_param('Sw5', val=35) #Sec5sweep
self.add_param('Rc', val=130) #Sec1RC
self.add_param('Tc1', val=90) #Sec1TC
self.add_param('Tc2', val=66) #Sec2TC
self.add_param('Tc3', val=42) #Sec3TC
self.add_param('Tc4', val=24) #Sec4TC
self.add_param('Tc5', val=10) #Sec5TC
self.add_output('Cdi', shape=1) #Objective output as low as possible
def solve_nonlinear(self, params, unknowns, resids):
#0.0324 and 0.775 are the squared Cl and the oswald efficiency number in the case that I can find a way to add in those values to the optimization problem
Sp1 = params['Sp1']
Sp2 = params['Sp2']
Sp3 = params['Sp3']
Sp4 = params['Sp4']
Sp5 = params['Sp5']
Sw1 = params['Sw1']
Sw2 = params['Sw2']
Sw3 = params['Sw3']
Sw4 = params['Sw4']
Sw5 = params['Sw5']
Rc = params['Rc']
Tc1 = params['Tc1']
Tc2 = params['Tc2']
Tc3 = params['Tc3']
Tc4 = params['Tc4']
Tc5 = params['Tc5']
unknowns['Cdi'] = (324/((7750)*(m.pi)*(((Sp1+Sp2+Sp3+Sp4+Sp5)**2)/(Sp1*(Rc+Tc1)/2+Sp2*(Tc1+Tc2)/2+Sp3*(Tc2+Tc3)/2+Sp4*(Tc3+Tc4)/2+Sp5*(Tc4+Tc5)/2))))
def linearize(self, params, unknowns, resids):
Sp1 = params['Sp1']
Sp2 = params['Sp2']
Sp3 = params['Sp3']
Sp4 = params['Sp4']
Sp5 = params['Sp5']
sw1 = params['Sw1']
sw2 = params['Sw2']
sw3 = params['Sw3']
sw4 = params['Sw4']
sw5 = params['Sw5']
Rc = params['Rc']
Tc1 = params['Tc1']
Tc2 = params['Tc2']
Tc3 = params['Tc3']
Tc4 = params['Tc4']
Tc5 = params['Tc5']
J ={}
J['Cdi', 'Sp1']=unknowns['Cdi']/Sp1
J['Cdi', 'Sp2']=unknowns['Cdi']/Sp2
J['Cdi', 'Sp3']=unknowns['Cdi']/Sp3
J['Cdi', 'Sp4']=unknowns['Cdi']/Sp4
J['Cdi', 'Sp5']=unknowns['Cdi']/Sp5
J['Cdi', 'Sw1']=unknowns['Cdi']/sw1
J['Cdi', 'Sw2']=unknowns['Cdi']/sw2
J['Cdi', 'Sw3']=unknowns['Cdi']/sw3
J['Cdi', 'Sw4']=unknowns['Cdi']/sw4
J['Cdi', 'Sw5']=unknowns['Cdi']/sw5
J['Cdi', 'Tc1']=unknowns['Cdi']/Tc1
J['Cdi', 'Tc2']=unknowns['Cdi']/Tc2
J['Cdi', 'Tc3']=unknowns['Cdi']/Tc3
J['Cdi', 'Tc4']=unknowns['Cdi']/Tc4
J['Cdi', 'Tc5']=unknowns['Cdi']/Tc5
J['Cdi', 'Rc']=unknowns['Cdi']/Rc
如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu:
`对于第一个错误:
没有看到你的实际模型,我无法诊断为什么会发生这种情况。但是你试图把我猜的IndepVarComp的输出连接到其他组件的输入,可能是exec comp。您可能已经提升了源、目标或两者。因此,考虑到促销活动,您没有使用正确的名称引用他们
如果您已经升级了这两个变量,因为它们都是Sp1名称,那么它们会自动连接。如果您只提升了其中一个,那么您需要在connect语句中说明这一点。例如:
self.connect('Sp1', 'con.Sp1')
对于第二个错误:
Cdi和您必须计算值的等式之间存在某种大小不匹配。看起来这个方程可能是标量的,但我不能确定,因为我不知道中间变量是什么。无论如何,该赋值的一侧或另一侧的大小都不正确。您可以通过添加一些print语句来调试它,看看它们的大小
print(unknowns['Cdi'])
print((324/((7750)*(m.pi)*(((Sp1+Sp2+Sp3+Sp4+Sp5)**2)/(Sp1*(Rc+Tc1)/2+Sp2*(Tc1+Tc2)/2+Sp3*(Tc2+Tc3)/2+Sp4*(Tc3+Tc4)/2+Sp5*(Tc4+Tc5)/2))))))
对于第一个错误:
L = (15067/100000000)/(Sp1(Rc+Tc1)/2+Sp2(Tc1+Tc2)/2+Sp3(Tc2+Tc3)/2+Sp4(Tc3+Tc4)/2+Sp5(Tc4+Tc5)/2)')
我想你需要明确地把乘法放进去,所以
L = (15067/100000000)/(Sp1*(Rc+Tc1)/2+Sp2*(Tc1+Tc2)/2+Sp3*(Tc2+Tc3)/2+Sp4*(Tc3+Tc4)/2+Sp5*(Tc4+Tc5)/2)')
缺少一个链接还是什么?我没有看到任何新的代码只是将其添加到原始问题中起作用,但似乎之前的一个错误发生了轻微的变化,现在显示为“File/usr/local/lib/python2.7/dist-packages/openmdao/core//u checks.py,第97行,在_check\u types\u match typetval,_two\u namestgt,to_prom_name TypeError:source'p16.Rc'的类型必须与target'con.Rc'的类型相同。您还希望使变量浮动类型:self.add_param'Sp1',val=23。作为一个简单的问题,我现在得到的结果不在我在top.driver.add_desvar'p15.Tc5',lower=5',upper=15中指定的范围内。它输出一个负值。这可能是使用root.add'p15',IndepVarComp'Tc5',1的结果。作为其中的一部分,我输入的参数名称后面的值的用途是什么?indepvarcomp中的值是变量p15.Tc5的初始值。我不知道为什么Cobyla会强迫它超越边界,但您可能想打开一些更详细的输出来查看它在做什么。有趣的是,将优化器更改为Nedler Mead似乎可以修复错误。。。
L = (15067/100000000)/(Sp1(Rc+Tc1)/2+Sp2(Tc1+Tc2)/2+Sp3(Tc2+Tc3)/2+Sp4(Tc3+Tc4)/2+Sp5(Tc4+Tc5)/2)')
L = (15067/100000000)/(Sp1*(Rc+Tc1)/2+Sp2*(Tc1+Tc2)/2+Sp3*(Tc2+Tc3)/2+Sp4*(Tc3+Tc4)/2+Sp5*(Tc4+Tc5)/2)')