标准线性固体(SLS)蠕变函数绘图不符,求代码问题排查
标准线性固体(SLS)模型蠕变函数代码问题排查与修正
核心问题分析
- 时间范围缺失:你的
t从t0=15开始,漏掉了t < t0的初始阶段(此时无应力,应变应为0),无法还原参考图的完整蠕变-恢复过程。 - 松弛时间计算错误:SLS模型的蠕变特征时间应为
τ = η / E2(Kelvin并联单元的松弛时间),而非η/E1 + η/E2,这个错误直接导致蠕变/恢复速率完全偏离预期。 - 蠕变公式逻辑错误:
- 加载阶段(
t0 < t < t1):SLS蠕变是瞬时弹性应变+粘弹性蠕变应变的叠加,你错误引入eps0构建公式,完全不符合模型的物理逻辑。 - 卸载阶段(
t > t1):你写的公式没有体现“瞬时弹性恢复+粘弹性缓慢恢复”的过程,形态完全错误。
- 加载阶段(
- 冗余参数误用:
eps0是参考图公式中不存在的变量,属于错误引入,直接干扰了曲线形态。
修正后的代码
import numpy as np import matplotlib.pyplot as plt # 参数定义(匹配SLS模型物理意义) t0 = 15 # 加载起始时间 t1 = 85 # 卸载时间 E1 = 10 # 串联弹簧模量 E2 = 8 # Kelvin单元弹簧模量 eta = 40 # Kelvin单元粘度(调大后蠕变/恢复过程更直观) sigma = 20 # 施加的恒定应力 # 正确的松弛时间 tau = eta / E2 # 生成完整时间轴:覆盖初始、加载、卸载全阶段 t = np.linspace(0, 100, 200) creep = np.zeros(len(t)) for i in range(len(t)): ti = t[i] if ti < t0: # 初始阶段:无应力,应变为0 creep[i] = 0 elif t0 <= ti < t1: # 加载阶段:瞬时弹性应变 + 粘弹性蠕变应变 instantaneous_strain = sigma / (E1 + E2) viscoelastic_creep = (sigma / E2) * (1 - np.exp(-(ti - t0)/tau)) creep[i] = instantaneous_strain + viscoelastic_creep else: # 卸载阶段:先计算加载结束时的总应变 eps_t1 = sigma/(E1+E2) + (sigma/E2)*(1 - np.exp(-(t1 - t0)/tau)) # 瞬时弹性恢复 + 粘弹性缓慢恢复 instantaneous_recovery = sigma/(E1+E2) viscoelastic_recovery = (sigma/E2)*np.exp(-(ti - t1)/tau) creep[i] = eps_t1 - instantaneous_recovery - viscoelastic_recovery # 绘图设置 plt.plot(t, creep) plt.xlabel('Time') plt.ylabel('Strain') plt.title('Creep Function of Standard Linear Solid Model') plt.grid(True) plt.show()
关键说明
- 调整
eta为40是为了让蠕变和恢复的过程更明显,和参考图的视觉效果匹配;你可以根据需求微调参数。 - 修正后的曲线特征:初始阶段应变0,加载时先跳变到瞬时弹性应变再缓慢上升,卸载时先跳变下降再缓慢趋近于0,完全符合SLS模型的蠕变-恢复行为,与参考图形态一致。
内容的提问来源于stack exchange,提问作者acme_2020
相关产品推荐
相关产品推荐

