混凝土二维随机骨料模型 MATLAB 实现

一、模型构建核心流程

混凝土二维随机骨料模型的构建需遵循 骨料生成→随机投放→碰撞检测→模型导出 的流程,其核心难点在于 骨料形状控制空间分布合理性


二、关键技术与代码实现
1. 骨料形状生成
  • 多边形基骨料生成

    以随机圆为基础,通过极角控制生成凸多边形,控制边数范围(4-10边)和边长波动(±10%):

    matlab 复制代码
    function poly = generate_polygon(center, radius)
        num_sides = randi([4,10]); % 随机边数angles = linspace(0, 2*pi, num_sides+1);
        % 顶点坐标扰动(极角随机偏移±0.5rad)
        theta = angles(1:end-1) + 0.5*randn(1,num_sides);
        x = center(1) + radius*(1+0.1*randn(1,num_sides)).*cos(theta);
        y = center(2) + radius*(1+0.1*randn(1,num_sides)).*sin(theta);
        poly = polyshape(x, y);
    end
  • 界面过渡区(ITZ)模拟

    在骨料表面生成厚度为骨料半径5%的过渡区,通过偏移多边形边界实现:

    matlab 复制代码
    function ITZ = create_ITZ(poly, thickness)
        [vertices, ~] = vertices(poly);
        offset = thickness*mean(vecnorm(vertices - mean(vertices), 2, 2));
        ITZ = offset(poly, offset, 'inward');
    end
2. 随机投放算法
  • 蒙特卡罗投放策略

    基于面积分数(如骨料体积占比30%)生成随机位置,采用 空间网格划分法 加速碰撞检测:

    matlab 复制代码
    function positions = random_packing(model_size, agg_size, area_frac)
        grid_size = max(agg_size)*2; % 网格尺寸为骨料最大尺寸的2倍
        [X, Y] = meshgrid(0:grid_size:model_size(2), 0:grid_size:model_size(1));
        occupied = false(size(X));
    
        while true
            x = rand*model_size(2);
            y = rand*model_size(1);
            idx = sub2ind(size(X), round(y/grid_size)+1, round(x/grid_size)+1);
            if ~occupied(idx)
                % 生成骨料并检查重叠
                agg = generate_polygon([x,y], agg_size);
                if all(~doOverlap(agg, agg))
                    occupied(idx) = true;
                    positions = [positions; x, y];
                end
            end
            if sum(occupied(:)) >= area_frac*model_size(1)*model_size(2)
                break
            end
        end
    end
3. 碰撞检测优化
  • 快速重叠判断函数

    基于包围盒(Bounding Box)的快速初步筛选,结合精确多边形相交检测:

    matlab 复制代码
    function overlap = doOverlap(poly1, poly2)
        % 包围盒快速筛选
        min1 = min(poly1.Vertices(:,1)); max1 = max(poly1.Vertices(:,1));
        min2 = min(poly2.Vertices(:,1)); max2 = max(poly2.Vertices(:,1));
        if max1 < min2 || max2 < min1, overlap = false; return; end
    
        % 精确相交检测(调用MATLAB内置函数)
        overlap = ~isempty(intersect(poly1, poly2, 'rows'));
    end

三、模型参数控制与可视化
1. 关键参数设置
参数 典型值 控制方法
骨料面积分数 30%-40% 调整投放终止条件
最大骨料尺寸 80mm 限制生成多边形的最大半径
ITZ厚度 骨料半径5% 基于半径比例动态计算
界面过渡区弹性模量 降低30% 通过属性映射实现
2. 可视化与导出
  • 图形绘制

    使用 pcolorfill函数分层显示骨料、砂浆和界面:

    matlab 复制代码
    figure; hold on;
    p = pcolor(model_size(2), model_size(1), agg_mask);
    shading interp; colormap(gray);
    hold on; fill(poly.Vertices(:,1), poly.Vertices(:,2), 'r', 'FaceAlpha', 0.5);
  • 有限元模型导出

    将MATLAB图形转换为DXF格式供COMSOL/ANSYS调用:

    matlab 复制代码
    dxf_export('concrete_model.dxf', agg_poly, ITZ_poly);

四、模型验证与应用案例
1. 验证方法
  • 面积分数验证

    对比实际截面骨料面积占比(如文献中再生骨料占比28%-48%)与模拟值,误差应<5%。

  • 断裂模式对比

    通过COMSOL模拟轴拉试验,裂缝扩展路径需与文献中描述的"多分支裂缝"一致。

2. 工程应用
  • 配合比优化

    调整骨料级配(如三级配:3:3:4)模拟不同强度等级混凝土(C30-C50)。

  • 耐久性分析

    在ITZ区域设置腐蚀介质渗透率(如1e-12 m/s),模拟氯离子侵蚀过程。


五、改进方向与挑战
  1. 三维扩展

    需解决三维空间碰撞检测效率问题(如八叉树算法)。

  2. 动态加载模拟

    结合显式动力学模块(如ABAQUS/Explicit)分析冲击荷载下的骨料破碎。

  3. 机器学习辅助

    使用GAN生成更符合真实骨料分布的形态(参考文献的随机边数生成策略)。


六、完整代码示例
matlab 复制代码
%% 参数设置
model_size = [100, 100]; % 模型尺寸(mm)
agg_min_rad = 5; agg_max_rad = 20; % 骨料半径范围
area_frac = 0.35; % 骨料面积分数

%% 生成骨料群
positions = [];
while true
    % 随机生成骨料参数
    radius = agg_min_rad + (agg_max_rad - agg_min_rad)*rand;
    center = [rand*model_size(2), rand*model_size(1)];
    poly = generate_polygon(center, radius);
    
    % 碰撞检测
    if isempty(find_overlapping(positions, poly))
        positions = [positions; struct('center', center, 'poly', poly)];
    end
    if sum(cellfun(@(p) polyarea(p.poly.Vertices(:,1), p.poly.Vertices(:,2)), positions)) / (model_size(1)*model_size(2)) > area_frac
        break
    end
end

%% 可视化
figure; hold on;
for i = 1:length(positions)
    fill(positions(i).poly.Vertices(:,1), positions(i).poly.Vertices(:,2), 'r', 'FaceAlpha', 0.4);
end
axis equal; title('二维随机骨料模型'); xlabel('X (mm)'); ylabel('Y (mm)');

参考代码 混凝土二维随机骨料模型 www.youwenfan.com/contentcsq/50692.html

七、参考文献与工具
  1. 核心文献
    • 王菁等. 三级配混凝土二维随机多边形骨料模型数值模拟[J]. 人民长江,2015.
    • 胡大琳等. 二维细观随机混凝土模型的建立和应用[J]. 长安大学学报,2017.
  2. 工具包
    • Comsol-Matlab联合建模工具 :支持直接导出.mph文件进行有限元分析。
    • OpenFOAM骨料生成插件:适用于多尺度耦合模拟。
相关推荐
我爱C编程2 小时前
5G下行信号的频谱结构及模糊函数特征matlab仿真与分析
5g·matlab·模糊函数·频谱结构
酉鬼女又兒2 小时前
JAVA牛客入门11~20
算法
代码游侠2 小时前
C语言核心概念复习(二)
c语言·开发语言·数据结构·笔记·学习·算法
XX風2 小时前
2.1_binary_search_tree
算法·计算机视觉
不想写bug呀2 小时前
买卖股票问题
算法·买卖股票问题
-Try hard-2 小时前
完全二叉树、非完全二叉树、哈希表的创建与遍历
开发语言·算法·vim·散列表
茉莉玫瑰花茶3 小时前
C++ 17 详细特性解析(4)
开发语言·c++·算法
long3163 小时前
K‘ 未排序数组中的最小/最大元素 |期望线性时间
java·算法·排序算法·springboot·sorting algorithm
进击的小头3 小时前
FIR滤波器实战:音频信号降噪
c语言·python·算法·音视频