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

如何将列表添加至NumPy矩阵?解决形状不均错误

问题分析与解决方案

错误根源

  1. 循环逻辑错误:内层j循环中每次迭代都执行return Q,导致仅处理第一个铺层(j=0)就提前返回,且此时Q11_B等列表仅包含1个元素,与矩阵中的标量0混合,造成numpy无法生成形状均匀的数组。
  2. 矩阵构建方式错误:直接将整个Qxx_B列表作为矩阵元素,而非将列表中的每个元素对应到矩阵的位置,导致矩阵元素类型混合(列表+标量),触发形状不均的错误。
  3. 公式语法错误:Q66_B的计算中误用了幂运算符**替代乘法*,Q26_B的公式中错误重复了Q12(应为Q66),这不仅会导致计算结果错误,也会间接影响数组形状。

修正方案

为每个铺层单独构建5x5的Q矩阵,最终组合成一个三维数组(形状为(PlyNumber, 5, 5)),既符合复合材料层合板的力学模型,也方便后续对特定铺层或行列进行操作。

修正后的代码

import numpy as np

def FSDT(a,b,E11,E22,Nu12,Nu21,G12,G13,G23,theta,PlyNumber,K,h):
    h = PlyNumber * LaminaThickness
    # 计算铺层位置Z(原代码保留,后续力学分析可能用到)
    Z = [-h/2.0]
    for j in range(1, PlyNumber+1):
        Z.append(Z[-1] + LaminaThickness)
    
    # 计算单层基础刚度系数(材料参数统一,只需计算一次)
    Q11 = E11 / (1 - Nu12 * Nu21)
    Q12 = (Nu12 * E22) / (1 - Nu12 * Nu21)
    Q22 = E22 / (1 - Nu12 * Nu21)
    Q44 = G23
    Q66 = G12
    Q55 = G13

    # 存储每个铺层的5x5 Q矩阵
    Q_list = []
    
    for j in range(PlyNumber):
        theta_rad = theta[j] * np.pi / 180.0
        cos_t = np.cos(theta_rad)
        sin_t = np.sin(theta_rad)
        cos2_t = cos_t ** 2
        sin2_t = sin_t ** 2
        cos4_t = cos_t ** 4
        sin4_t = sin_t ** 4
        
        # 计算转换后的刚度系数
        Q11_B = Q11 * cos4_t + 2*(Q12 + 2*Q66)*sin2_t*cos2_t + Q22*sin4_t
        Q12_B = (Q11 + Q22 - 4*Q66)*sin2_t*cos2_t + Q12*(sin4_t + cos4_t)
        Q16_B = (Q11 - Q12 - 2*Q66)*sin_t*cos_t**3 + (Q12 - Q22 + 2*Q66)*cos_t*sin_t**3
        Q22_B = Q11 * sin4_t + 2*(Q12 + 2*Q66)*sin2_t*cos2_t + Q22*cos4_t
        # 修正原Q26_B的公式错误
        Q26_B = (Q11 - Q12 - 2*Q66)*sin_t**3*cos_t + (Q12 - Q22 + 2*Q66)*cos_t**3*sin_t
        # 修正原Q66_B的运算符错误
        Q66_B = (Q11 + Q22 - 2*Q12 - 2*Q66)*sin2_t*cos2_t + Q66*(sin4_t + cos4_t)
        Q44_B = Q44 * cos2_t + Q55 * sin2_t
        Q55_B = Q44 * sin2_t + Q55 * cos2_t
        Q45_B = (Q55 - Q44)*cos_t*sin_t
        
        # 构建当前铺层的5x5矩阵
        ply_Q = np.array([
            [Q11_B, Q12_B, Q16_B, 0, 0],
            [Q12_B, Q22_B, Q26_B, 0, 0],
            [Q16_B, Q26_B, Q66_B, 0, 0],
            [0, 0, 0, Q44_B, Q45_B],
            [0, 0, 0, Q45_B, Q55_B]
        ])
        Q_list.append(ply_Q)
    
    # 转为三维numpy数组,形状(PlyNumber,5,5)
    Q = np.array(Q_list)
    return Q

# 输入参数
a = 10
b = 5
E11 = 131000
E22 = 32750
Nu12 = 0.25
Nu21 = 0.33
G12 = 19785
G13 = 16854
G23 = 19785
rho = 1650
K= np.pi**2/12

theta = [0,90,0,90,0]
PlyNumber = len(theta)
LaminaThickness = 0.01
h = 0.5
Q = FSDT(a,b,E11,E22,Nu12,Nu21,G12,G13,G23,theta,PlyNumber,K,h)

# 示例操作:删除第2个铺层(索引1)
Q_removed_layer = np.delete(Q, 1, axis=0)
# 示例操作:删除所有铺层的第3列(索引2)
Q_removed_col = np.delete(Q, 2, axis=2)

关键修改说明

  • 简化基础刚度计算:材料参数统一,无需重复计算基础Q值,直接用标量存储,提升效率。
  • 逐铺层构建矩阵:每个铺层生成独立的5x5数组,确保数组形状均匀,符合numpy的要求。
  • 修复公式错误:修正了Q66_B和Q26_B中的运算符与公式错误,保证力学计算的正确性。
  • 优化三角函数计算:提前计算三角函数的幂次,避免重复运算。

内容的提问来源于stack exchange,提问作者Ayoub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:42:02