运行优化代码遇数组形状不均错误,求排查解决指导
问题描述
运行优化代码时触发如下错误:
Structure' <class Structure>: Error calling compute(), setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (4,) + inhomogeneous part.
相关的structure函数及Structure类代码如下:
import numpy as np from openmdao.api import ExplicitComponent def structure(pf, x_str, Z, L, WE): t = Z[0]*Z[5]/(np.sqrt(abs(Z[5]*Z[3]))) b = np.sqrt(abs(Z[5]*Z[3]))/2.0 R = (1.0+2.0*x_str[0])/(3.0*(1.0+x_str[0])) Theta = pf([abs(x_str[1]), b, R, L], [2, 4, 4, 3], [0.25]*4, "twist") Fo1 = pf([x_str[1]], [1], [.008], "Fo1") WT_hat = L WW = Fo1 * (0.0051 * abs(WT_hat*NZ)**0.557 * \ abs(Z[5])**0.649 * abs(Z[3])**0.5 * abs(Z[0])**(-0.4) \ * abs(1.0+x_str[0])**0.1 * (0.1875*abs(Z[5]))**0.1 \ / abs(np.cos(Z[4]*np.pi/180.))) WFW = 5.0/18.0 * abs(Z[5]) * 2.0/3.0 * t * 42.5 WF = WFW + WFO WT = WO + WW + WF + WE sigma = np.zeros(5) sigma[0] = pf([Z[0], L, x_str[1], b, R], [4, 1, 4, 1, 1], [0.1]*5, "sigma[1]") sigma[1] = pf([Z[0], L, x_str[1], b, R], [4, 1, 4, 1, 1], [0.15]*5, "sigma[2]") sigma[2] = pf([Z[0], L, x_str[1], b, R], [4, 1, 4, 1, 1], [0.2]*5, "sigma[3]") sigma[3] = pf([Z[0], L, x_str[1], b, R], [4, 1, 4, 1, 1], [0.25]*5, "sigma[4]") sigma[4] = pf([Z[0], L, x_str[1], b, R], [4, 1, 4, 1, 1], [0.30]*5, "sigma[5]") return Theta, WF, WT, sigma class Structure(ExplicitComponent): def __init__(self, scalers): super(Structure, self).__init__() # scalers values self.scalers = scalers # Polynomial function initialized with given constant values self.pf = PolynomialFunction() def setup(self): # Global Design Variable z=(t/c,h,M,AR,Lambda,Sref) self.add_input('z', val=np.ones(6)) # Local Design Variable x_str=(lambda,section caisson) self.add_input('x_str', val=np.ones(2)) # Coupling parameters self.add_input('L', val=1.0) self.add_input('WE', val=1.0) # Coupling output self.add_output('WT', val=1.0) self.add_output('Theta', val=1.0) self.add_output('WF', val=1.0) self.add_output('sigma', val=np.ones(5)) self.declare_partials('*', '*') def compute(self, inputs, outputs): Z = inputs['z']*self.scalers['z'] x_str = inputs['x_str']*self.scalers['x_str'] L = inputs['L']*self.scalers['L'] WE = inputs['WE']*self.scalers['WE'] Theta, WF, WT, sigma = structure(self.pf, x_str, Z, L, WE) #Unknowns outputs['Theta'] = Theta/self.scalers['Theta'] outputs['WF'] = WF/self.scalers['WF'] outputs['WT'] = WT/self.scalers['L'] outputs['sigma'] = np.zeros(5) for i in range(5): outputs['sigma'][i] = sigma[i]/self.scalers['sigma'][i]
问题分析与解决方法
这个错误的核心是尝试将序列(如数组)赋值给单一标量元素,导致数组形状不匹配。结合代码排查,主要问题点及解决方式如下:
1. PolynomialFunction返回值类型不匹配
错误提示的(4,)形状与调用pf时传入的4个参数对应,说明pf返回的是长度为4的数组,而非预期的标量。
- 检查
PolynomialFunction的实现逻辑,确保多参数输入时返回单个标量值; - 如果
pf确实需要返回数组,需明确提取所需标量元素,例如Theta = pf(...)[0](根据实际业务逻辑调整索引)。
2. 未定义变量引发的异常
代码中存在多个未定义变量:
NZ:计算WW时用到,未在函数内定义,需补充定义或修正拼写;WFO、WO:计算WF和WT时用到,同样未定义,需补充变量定义或修正变量名。
这些未定义变量可能生成意外的序列/数组,触发形状不匹配错误。
3. sigma赋值的潜在问题
虽然初始化了sigma = np.zeros(5),但如果pf返回数组而非标量,sigma[i] = pf(...)会将数组塞进标量位置,直接触发错误。需确保每个pf调用返回的是标量值。
4. 输出变量的形状匹配检查
setup方法中Theta、WF、WT都被定义为标量(val=1.0),如果structure函数返回的对应值是数组,赋值时会报错:
- 确认
structure返回的Theta、WF、WT为标量; - 如果这些值确实是数组,需在
setup中修改输出形状,例如self.add_output('Theta', val=np.ones(4))(对应形状调整)。
内容的提问来源于stack exchange,提问作者musa
相关产品推荐
相关产品推荐

