import numpy as np
import matplotlib.pyplot as plt
E = {
'PCB': 28.6,
'Solder': 40,
'BGA': 73.3
}
CTE = {
'PCB': 17,
'Solder': 22,
'BGA': 23.0
}
geometry = {
'package_size': 26,
'ball_matrix': 21,
'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
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)