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