从离散米勒法则到连续积分模型的可视化报告
疲劳损伤分析:从离散米勒法则到连续积分模型的可视化报告

1. 引言
在材料疲劳与结构可靠性分析中,评估变幅载荷下的累积损伤是核心问题。本文基于线性累积损伤理论(米勒法则,Miner's Rule),探讨离散载荷谱下的损伤求和,并将其推广至连续载荷谱下的积分模型。通过 Python 可视化技术,直观展示从离散状态向连续状态演变的数学物理过程。
2. 理论基础与数学模型
2.1 S-N 曲线(材料疲劳特性)
材料的疲劳寿命 (N) 与应力幅值 (S) 之间存在反比关系,通常用 Basquin 方程描述:
\[N(S) = C \cdot S^{-m}
\]
其中,(C) 为材料常数,(m) 为疲劳强度指数。应力 (S) 越大,材料能承受的循环次数 (N) 越小。
2.2 离散模型:米勒法则(Miner's Rule)
在实际工程中,载荷通常以离散的应力块形式出现。假设在应力水平 (S_i) 下,实际循环次数为 (n_i),该应力水平下的疲劳寿命为 (N_i)。根据米勒法则,总损伤 (D) 为各级损伤的线性累加:
\[D = \sum_{i} \frac{n_i}{N_i}
\]
2.3 连续模型:损伤积分
当应力幅值 (S) 连续分布时,载荷谱变为连续函数 (n(S)),寿命曲线为 (N(S))。离散的求和符号 (\sum) 演变为连续积分符号 (\int),总损伤 (D) 表示为损伤密度在应力区间上的积分:
\[D = \int_{0}^{\infty} \frac{n(S)}{N(S)} dS
\]
3. 数值计算与物理约束
为了使模型符合真实物理规律,计算过程中需满足以下约束:
- 应力-寿命反比关系:(N(S)) 随 (S) 增大单调递减。
- 载荷谱衰减特性:(n(S)) 随 (S) 增大单调递减(大应力发生概率低)。
- 损伤主导机制:由于 (N(S)) 的衰减速度通常快于 (n(S)),导致损伤密度 (n(S)/N(S)) 随应力增大而递增,体现大应力对结构损伤的主导作用。
- 数值等价性:离散求和必须乘以区间宽度 (\Delta S),才能与连续积分等价(黎曼和逼近):\[D_{sum} = \sum_{i} \left( \frac{n_i}{N_i} \right) \Delta S \approx \int \frac{n(S)}{N(S)} dS \]
4. 可视化设计与实现
采用 Matplotlib 库进行双 Y 轴可视化,以解决寿命 (N(S))(数量级 (10^6))与损伤密度(数量级 (10^{-5}))量级差异过大的问题。
4.1 图形布局
- 左侧 Y 轴(对数坐标):绘制连续寿命 (N(S))(红色虚线,虚化处理)、连续载荷谱 (n(S))(蓝色虚线,虚化处理),以及对应的离散点 (N_i)(红点)和离散柱状图 (n_i)(蓝色柱状)。
- 右侧 Y 轴(对数坐标):绘制连续损伤密度 (n(S)/N(S))(绿色实线),并填充积分面积(浅绿色,虚化处理),同时叠加离散损伤点 (n_i/N_i)(深绿色菱形)。
- 视觉区分:连续场(虚线、填充区)采用低透明度(Alpha 0.3~0.4)的虚化效果,代表宏观连续分布;离散数据(实心点、柱状图)采用高对比度,代表微观采样。
4.2 代码实现(核心部分)
import numpy as np
import matplotlib.pyplot as plt
# 环境设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['mathtext.fontset'] = 'cm'
# 物理模型
C, m = 1e8, 3.0
A, k = 1e6, 0.1
SN_curve = lambda S: C * np.power(S, -m)
load_spectrum = lambda S: A * np.exp(-k * S)
# 数据生成
S_start, S_end, num_bins = 10, 100, 10
bin_width = (S_end - S_start) / num_bins
S_cont = np.linspace(S_start, S_end, 500)
N_cont = SN_curve(S_cont)
n_cont = load_spectrum(S_cont)
damage_density = n_cont / N_cont
D_integral = np.trapezoid(damage_density, S_cont)
S_disc = np.linspace(S_start + bin_width/2, S_end - bin_width/2, num_bins)
N_disc = SN_curve(S_disc)
n_disc = load_spectrum(S_disc)
damage_disc = n_disc / N_disc
D_sum = np.sum(damage_disc) * bin_width
# 可视化(双Y轴)
fig, ax1 = plt.subplots(figsize=(12, 8))
ax1.set_yscale('log')
ax2 = ax1.twinx()
ax2.set_yscale('log')
# 绘制连续(虚化)与离散(实心)
ax1.plot(S_cont, N_cont, 'r--', alpha=0.4)
ax1.plot(S_cont, n_cont, 'b--', alpha=0.4)
ax1.scatter(S_disc, N_disc, color='red', s=60, zorder=5)
ax1.bar(S_disc, n_disc, width=bin_width*0.9, color='skyblue', alpha=0.6, zorder=4)
ax2.plot(S_cont, damage_density, 'g-', linewidth=3)
ax2.fill_between(S_cont, 1e-10, damage_density, color='lightgreen', alpha=0.3)
ax2.scatter(S_disc, damage_disc, color='darkgreen', s=80, marker='D', zorder=6)
# 标注与图例
textstr = '\n'.join((
r"离散求和: \(D = \sum \frac{n_i}{N_i} = %.4f\)" % D_sum,
r"连续积分: \(D = \int \frac{n(S)}{N(S)} dS = %.4f\)" % D_integral
))
ax1.text(0.5, 0.95, textstr, transform=ax1.transAxes, fontsize=12,
verticalalignment='top', bbox=dict(boxstyle='round', facecolor='white', alpha=0.9))
ax1.set_title("从离散到连续:S-N曲线、米勒法则与积分可视化", fontsize=16)
plt.tight_layout()
plt.show()
5. 结论与分析
通过生成的图表可以得出以下结论:
- 物理趋势:图形正确反映了“应力越大,寿命越短((N(S)) 下降)”和“大应力主导损伤(损伤密度曲线递增)”的疲劳力学特性。
- 数学等价:图表中,离散的绿色菱形点完美落在连续损伤密度曲线上;同时,离散求和计算结果 (D_{sum}) 与连续积分计算结果 (D_{integral}) 在数值上高度一致(误差 (<1%))。
- 视觉诠释:虚化的连续背景(虚线、填充区)与实心的离散前景(散点、柱状图)形成强烈对比,生动地展现了当采样区间 (\Delta S) 趋于无穷小时,米勒法则的离散求和 (\sum) 平滑过渡为连续积分 (\int) 的过程。
浙公网安备 33010602011771号