2. 案例2

任务说明

本案例提供一组超高强钢单轴拉伸试验的原始数据(工程应力与工程应变),需要完成以下工作:

  1. 将工程应力-应变数据转换为真实应力-应变数据;
  2. 对真实应力-应变曲线进行分段拟合(弹性段+塑性段);
  3. 提取关键力学参数:弹性模量E、屈服强度σ0.2、抗拉强度σb、均匀延伸率δu、强度系数K与应变硬化指数n。

数据与转换原理

设工程应力为σeng,工程应变为εeng。在均匀塑性变形阶段(颈缩前),真实应力σtrue与真实应变εtrue按下式转换:

σtrue = σeng × (1 + εeng)

εtrue = ln(1 + εeng)

颈缩点(抗拉强度对应点)之后,上述公式不再适用,因此本案例仅处理至抗拉强度点为止的数据。

Python实现

import numpy as np
from scipy.optimize import curve_fit

# ========== 输入数据:工程应力(MPa)与工程应变 ==========
# 数据点按加载顺序排列,覆盖弹性段、屈服平台、均匀塑性段至颈缩点
eng_stress = np.array([0, 200, 400, 600, 800, 900, 950, 980, 1000, 1020, 1040, 1055, 1070, 1080, 1090, 1095, 1100, 1102])
eng_strain = np.array([0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.010, 0.011, 0.012, 0.013, 0.014, 0.015, 0.016, 0.0165])

# ========== 1. 工程→真实应力应变转换 ==========
true_stress = eng_stress * (1 + eng_strain)
true_strain = np.log(1 + eng_strain)

# ========== 2. 弹性模量E:取弹性段(前5个点)线性拟合 ==========
elastic_end = 5
slope, intercept = np.polyfit(true_strain[:elastic_end], true_stress[:elastic_end], 1)
E = slope  # 弹性模量,单位MPa

# ========== 3. 屈服强度σ0.2:0.2%残余应变偏移法 ==========
offset_strain = 0.002
# 偏移线: σ = E*(ε - 0.002),求与真实应力曲线的交点
# 在塑性段搜索交点
plastic_start = elastic_end
intersection_idx = None
for i in range(plastic_start, len(true_strain) - 1):
    line_val_i = E * (true_strain[i] - offset_strain)
    line_val_next = E * (true_strain[i+1] - offset_strain)
    if true_stress[i] >= line_val_i and true_stress[i+1] <= line_val_next:
        # 线性插值求交点
        eps1, sig1 = true_strain[i], true_stress[i]
        eps2, sig2 = true_strain[i+1], true_stress[i+1]
        eps_line1 = line_val_i
        eps_line2 = line_val_next
        # 交点应变
        eps_interp = eps1 + (eps2 - eps1) * (eps_line1 - sig1) / ((sig2 - sig1) - (eps_line2 - eps_line1))
        sigma_02 = E * (eps_interp - offset_strain)
        intersection_idx = i
        break

# ========== 4. 抗拉强度与均匀延伸率 ==========
sigma_b = np.max(true_stress)  # 真实抗拉强度
idx_b = np.argmax(true_stress)
delta_u = true_strain[idx_b]   # 均匀延伸率(真实应变)

# ========== 5. 塑性段Hollomon拟合: σ = K·ε^n ==========
# 取屈服后至颈缩前的塑性段数据
plastic_start_idx = intersection_idx if intersection_idx else plastic_start
plastic_end_idx = idx_b + 1  # 包含颈缩点
eps_plastic = true_strain[plastic_start_idx:plastic_end_idx]
sig_plastic = true_stress[plastic_start_idx:plastic_end_idx]

# 对数线性化拟合: ln(σ) = ln(K) + n·ln(ε)
log_eps = np.log(eps_plastic)
log_sig = np.log(sig_plastic)
coeffs = np.polyfit(log_eps, log_sig, 1)
n = coeffs[0]           # 应变硬化指数
K = np.exp(coeffs[1])   # 强度系数(MPa)

# ========== 输出结果 ==========
print(f"弹性模量 E = {E:.0f} MPa = {E/1000:.1f} GPa")
print(f"屈服强度 σ0.2 = {sigma_02:.1f} MPa")
print(f"真实抗拉强度 σb = {sigma_b:.1f} MPa")
print(f"均匀延伸率 δu = {delta_u:.4f} ({delta_u*100:.2f}%)")
print(f"强度系数 K = {K:.1f} MPa")
print(f"应变硬化指数 n = {n:.4f}")

# ========== 生成拟合曲线数据用于绘图 ==========
eps_fit = np.linspace(eps_plastic[0], eps_plastic[-1], 100)
sig_fit = K * eps_fit**n
print("\n拟合曲线数据点(用于绘图):")
for e, s in zip(eps_fit[::10], sig_fit[::10]):
    print(f"  ε={e:.4f}, σ={s:.1f} MPa")

运行方式

安装依赖后直接运行:

pip install numpy scipy
python tensile_data_processing.py

验证方法与判定标准

运行程序后,检查输出参数是否满足以下物理合理性条件:

  • 弹性模量E在190~220 GPa范围内(超高强钢典型值);
  • 屈服强度σ0.2在900~1200 MPa范围内;
  • 真实抗拉强度σb大于屈服强度,且与工程抗拉强度(1102 MPa)接近但略高;
  • 均匀延伸率δu在0.01~0.05之间(超高强钢塑性较低);
  • 应变硬化指数n在0.05~0.15之间,K在1500~2500 MPa范围内。

若输出参数落入上述区间,则说明数据转换与拟合流程正确。可进一步将拟合曲线与真实应力-应变数据点绘制在同一坐标系中,观察拟合曲线是否与塑性段数据吻合。

真实应力-应变曲线与分段拟合结果 真实应变 ε 真实应力 σ (MPa) 0 500 1000 1500 0.005 0.010 0.015 0.020 σ₀.₂ σ_b 真实应力数据点 弹性段拟合 (E) 塑性段拟合 (K, n) 提取参数 E ≈ 200 GPa σ₀.₂ ≈ 990 MPa σ_b ≈ 1120 MPa n ≈ 0.08, K ≈ 1800 MPa

结果说明

程序输出参数即为从该组试验数据中提取的关键力学性能指标。其中弹性模量由弹性段线性拟合斜率确定;屈服强度采用0.2%残余应变偏移法求得;抗拉强度取真实应力最大值;应变硬化指数与强度系数由塑性段Hollomon关系拟合得到。上述参数可直接用于后续超高强钢构件有限元仿真中的材料本构定义。