求Matlab实现载荷-位移曲线各滞回环单独面积计算方法
计算滞回曲线单个滞回环的面积
要计算单个滞回环的面积,核心是识别滞回环的换向边界——也就是位移x的极值点(极大值/极小值),这些点对应载荷-位移曲线的转向位置,以此分割数据后即可单独计算每个环的面积。
实现步骤
- 识别位移极值点:通过检测位移
x的极大值和极小值,得到所有曲线换向的索引位置。 - 分割环数据:根据极值点索引,将完整的
x、y数据分割为单个滞回环对应的子集。 - 计算单环面积:对每个环的子集使用
trapz计算面积,取绝对值消除往复过程中的正负抵消。
修改后的Matlab代码
data = xlsread('results.xlsx'); x = xlsread('results.xlsx', 'results', 'AK:AK'); y = xlsread('results.xlsx', 'results', 'AJ:AJ'); figure; plot(x, y, 'k-'); xlabel('Displacement (m)', 'FontSize', 14); ylabel('Load (N)', 'FontSize', 14); % 计算单个滞回环面积 % 1. 识别位移x的极大值和极小值点(换向点) [~, max_idx] = findpeaks(x); % 极大值索引 [~, min_idx] = findpeaks(-x); % 极小值索引(取负后找极大值等价于原x的极小值) % 合并并按时间顺序排序所有换向点索引 all_extrema_idx = sort([max_idx; min_idx]); % 补充数据起始点(若第一个点不是极值点) if all_extrema_idx(1) ~= 1 all_extrema_idx = [1; all_extrema_idx]; end % 补充数据结束点(若最后一个点不是极值点) if all_extrema_idx(end) ~= length(x) all_extrema_idx = [all_extrema_idx; length(x)]; end % 2. 分割数据并计算每个滞回环的面积 loop_areas = []; for i = 1:length(all_extrema_idx)-1 % 提取当前环的x、y数据 x_loop = x(all_extrema_idx(i):all_extrema_idx(i+1)); y_loop = y(all_extrema_idx(i):all_extrema_idx(i+1)); % 计算面积并取绝对值(消除往复过程的正负抵消) area = abs(trapz(x_loop, y_loop)); loop_areas = [loop_areas; area]; end % 3. 输出单个滞回环面积 fprintf('单个滞回环面积:\n'); for i = 1:length(loop_areas) fprintf('环%d:%.2f J\n', i, loop_areas(i)); end % 验证总面积(与原计算结果对比) total_area_from_loops = sum(loop_areas); fprintf('\n所有环总面积(累加单个环):%.2f J\n', total_area_from_loops);
补充说明
- 若你的Matlab版本没有Signal Processing Toolbox(无法使用
findpeaks),可以手动实现极值点检测:遍历x数组,判断当前点是否大于前后点(极大值)或小于前后点(极小值)。 - 若需要将“往返过程”视为一个完整滞回环(即极大值→极小值→极大值为一个完整环),可调整循环逻辑,每次合并两个连续的半环区间,将两个半环的面积绝对值相加作为完整环的耗散能。
内容的提问来源于stack exchange,提问作者Calvin
相关产品推荐
相关产品推荐

