You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行优化代码遇数组形状不均错误,求排查解决指导

问题描述

运行优化代码时触发如下错误:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:43:29