从离散米勒法则到连续积分模型的可视化报告

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

image

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. 数值计算与物理约束

为了使模型符合真实物理规律,计算过程中需满足以下约束:

  1. 应力-寿命反比关系:(N(S)) 随 (S) 增大单调递减。
  2. 载荷谱衰减特性:(n(S)) 随 (S) 增大单调递减(大应力发生概率低)。
  3. 损伤主导机制:由于 (N(S)) 的衰减速度通常快于 (n(S)),导致损伤密度 (n(S)/N(S)) 随应力增大而递增,体现大应力对结构损伤的主导作用。
  4. 数值等价性:离散求和必须乘以区间宽度 (\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. 结论与分析

通过生成的图表可以得出以下结论:

  1. 物理趋势:图形正确反映了“应力越大,寿命越短((N(S)) 下降)”和“大应力主导损伤(损伤密度曲线递增)”的疲劳力学特性。
  2. 数学等价:图表中,离散的绿色菱形点完美落在连续损伤密度曲线上;同时,离散求和计算结果 (D_{sum}) 与连续积分计算结果 (D_{integral}) 在数值上高度一致(误差 (<1%))。
  3. 视觉诠释:虚化的连续背景(虚线、填充区)与实心的离散前景(散点、柱状图)形成强烈对比,生动地展现了当采样区间 (\Delta S) 趋于无穷小时,米勒法则的离散求和 (\sum) 平滑过渡为连续积分 (\int) 的过程。
posted @ 2026-10-09 11:09  redufa  阅读(9)  评论(0)    收藏  举报