编辑代码

import numpy as np
import matplotlib.pyplot as plt

# ======================
# 一、材料参数定义
# ======================
# (单位:GPa,1e-6 /°C)
E = {  # 各层弹性模量
    'PCB': 28.6,
    'Solder': 40,
    'BGA': 73.3
}

CTE = {  # 热膨胀系数
    'PCB': 17,
    'Solder': 22,
    'BGA': 23.0
}

# ======================
# 二、几何参数定义
# ======================
# (单位:mm)
geometry = {
    'package_size': 26,      # BGA封装边长
    'ball_matrix': 21,       # 焊接矩阵尺寸 (m×m)
    'ball_diameter': 0.5,    # 焊接点有效直径
    'thickness': {
        'PCB': 1.6,
        'Solder': 0.8,
        'BGA': 1.17
    }
}

# ======================
# 三、工程参数校验
# ======================
def validate_parameters():
    h = geometry['thickness']
    assert all(v > 0 for v in h.values()), "厚度参数必须为正值"
    
    L = geometry['package_size']
    diagonal_length = np.sqrt(2) * L
    total_ball_length = geometry['ball_matrix'] * geometry['ball_diameter']
    
    assert total_ball_length < diagonal_length, (
        f"几何冲突:焊接总长度({total_ball_length:.2f}mm) "
        f"超过封装对角线长度({diagonal_length:.2f}mm)"
    )

validate_parameters()

# ======================
# 四、等效参数计算
# ======================
def calculate_equivalent_properties():
    # 计算几何比例
    L = geometry['package_size']
    diagonal_length = np.sqrt(2) * L
    total_ball_length = geometry['ball_matrix'] * geometry['ball_diameter']
    remaining_length = diagonal_length - total_ball_length
    
    alpha = {
        'PCB': (remaining_length/2) / diagonal_length,
        'Solder': total_ball_length / diagonal_length,
        'BGA': (remaining_length/2) / diagonal_length
    }
    
    # 泊松比修正 (假设ν=0.3)
    ν = 0.3
    E_adj = {k: v/(1-ν**2) for k, v in E.items()}
    
    # 等效拉伸模量
    E_tensile = 1 / sum(alpha[k]/E_adj[k] for k in alpha)
    
    # 等效热膨胀系数
    numerator = sum(alpha[k] * E_adj[k] * CTE[k] for k in alpha)
    denominator = sum(alpha[k] * E_adj[k] for k in alpha)
    CTE_eq = numerator / denominator
    
    # 等效弯曲模量
    h = geometry['thickness']
    h_total = sum(h.values())
    
    # 计算中性轴位置
    neutral_axis = (
        E['PCB']*h['PCB']*(h['BGA']+h['Solder']+h['PCB']/2) +
        E['Solder']*h['Solder']*(h['BGA']+h['Solder']/2) +
        E['BGA']*h['BGA']*(h['BGA']/2)
    ) / (
        E['PCB']*h['PCB'] +
        E['Solder']*h['Solder'] +
        E['BGA']*h['BGA']
    )
    
    # 计算各层到中性轴的距离
    z = {
        'PCB': (h['BGA'] + h['Solder'] + h['PCB']/2) - neutral_axis,
        'Solder': (h['BGA'] + h['Solder']/2) - neutral_axis,
        'BGA': (h['BGA']/2) - neutral_axis
    }
    
    # 计算弯曲刚度
    EI = sum(
        E[k] * (h[k]**3/12 + h[k]*z[k]**2)
        for k in ['PCB', 'Solder', 'BGA']
    )
    
    # 等效弯曲模量
    E_bending = 12 * EI / h_total**3
    
    return E_tensile, CTE_eq, E_bending

E_tensile, CTE_eq, E_bending = calculate_equivalent_properties()

# ======================
# 五、结构可视化
# ======================
def plot_structure():
    layers = ['BGA', 'Solder', 'PCB']
    colors = ['#2ca02c', '#ff7f0e', '#1f77b4']
    h = geometry['thickness']
    
    fig, ax = plt.subplots(figsize=(6, 8))
    y_base = 0
    
    for layer in layers:
        height = h[layer]
        ax.barh(y=y_base + height/2, width=40, height=height,
                left=0, color=colors[layers.index(layer)],
                edgecolor='k', linewidth=0.5)
        
        # 添加层标注
        ax.text(20, y_base + height/2, 
                f'{layer}\n{height}mm',
                va='center', ha='center',
                fontsize=10, color='white',
                bbox=dict(facecolor='black', alpha=0.3, boxstyle='round'))
        
        y_base += height
    
    # 添加总厚度标注
    total_h = sum(h.values())
    ax.annotate(f'Total Thickness: {total_h:.2f}mm',
                xy=(0.5, 0.95), xycoords='axes fraction',
                ha='center', fontsize=10, 
                bbox=dict(facecolor='white', alpha=0.8))
    
    ax.set_title('BGA Package Cross-Section Analysis\n(Precision Optimized)',
                fontsize=12, pad=20)
    ax.set_xlim(0, 40)
    ax.set_ylim(0, y_base+1)
    ax.axis('off')
    plt.tight_layout()
    plt.show()

plot_structure()

# ======================
# 六、结果输出
# ======================
print("\n=== 等效材料特性计算结果 ===")
print(f"拉伸模量 (E_tensile): {E_tensile:.2f} GPa")
print(f"热膨胀系数 (CTE_eq): {CTE_eq:.2f} ×10⁻⁶/°C")
print(f"弯曲模量 (E_bending): {E_bending:.2f} GPa")
print("="*40)