普通网友 2024-03-04 14:51 采纳率: 14.3%
浏览 23
已结题

abaqus随机生成二维颗粒

在abaqus中的随机生成二位颗粒python算法中如何实现每个颗粒的半径在指定范围内随机?

import numpy as np
import random

xmin=0.0
xmax=20.0
ymin=0.0
ymax=20.0
r=random.uniform(1.5,3)
beta=0.30
Sph=[]
Sum=0
while True:
    flag = True
    if Sum>=xmax*ymax*beta:
        print('Bones Area is %f mm^2' %Sum)
        print('Total Area is %f mm^2' %(xmax*ymax))
        print('Bones Area is %f%% of Total Area' %(100*Sum/xmax/ymax))
        break
    x=random.uniform(xmin,xmax)
    y=random.uniform(ymin,ymax)
    if ((x- r>xmin and x+r<xmax) and (y- r>ymin and y+r<ymax)):
        if not Sph:
            Sph.append([x,y,r])
            Sum = Sum + np.pi*(r-0.1)**2
            continue
        else:
            for s in Sph:
                D=np.sqrt((s[0]- x)**2+(s[1]- y)**2)
                if D<s[2]+r:
                    flag = False
                    break
        if flag==True:
            Sph.append([x,y,r])
            Sum = Sum + np.pi*(r-0.1)**2

a=[x[0] for x in Sph]
b=[x[1] for x in Sph]
print(a)
print('========')
print(b)


for index,item in enumerate(Sph):
    s1.CircleByCenterPerimeter(center=(item[0], item[1]), point1=(item[0], item[1]+item[2]))
    ii = int(2*index+6)
    s1.offset(distance=0.1, objectList=(g[ii], ), side=LEFT)
    p = mdb.models['Model-1'].parts['Part-1']

f = p.faces

pickedFaces = f.getSequenceFromMask(mask=('[#1 ]', ), )
e1, d2 = p.edges, p.datums
p.PartitionFaceBySketch(faces=pickedFaces, sketch=s1)
s1.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']

  • 写回答

10条回答 默认 最新

  • 关注

    (请勿充值客服免费代买) 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    为了在abaqus中实现每个颗粒的半径在指定范围内随机生成,可以修改原始代码如下:

    import numpy as np
    import random
    
    xmin = 0.0
    xmax = 20.0
    ymin = 0.0
    ymax = 20.0
    beta = 0.30
    Sph = []
    Sum = 0
    
    while True:
        flag = True
        if Sum >= xmax * ymax * beta:
            print('Bones Area is %f mm^2' % Sum)
            print('Total Area is %f mm^2' % (xmax * ymax))
            print('Bones Area is %f%% of Total Area' % (100 * Sum / xmax / ymax))
            break
        
        r = random.uniform(1.5, 3)  # 生成随机的半径
        x = random.uniform(xmin + r, xmax - r)  # 保证颗粒完全位于边界内
        y = random.uniform(ymin + r, ymax - r)  # 保证颗粒完全位于边界内
        
        if not Sph:
            Sph.append([x, y, r])
            Sum = Sum + np.pi * (r - 0.1) ** 2
            continue
        else:
            for s in Sph:
                D = np.sqrt((s[0] - x) ** 2 + (s[1] - y) ** 2)
                if D < s[2] + r:
                    flag = False
                    break
        if flag == True:
            Sph.append([x, y, r])
            Sum = Sum + np.pi * (r - 0.1) ** 2
    
    a = [x[0] for x in Sph]
    b = [x[1] for x in Sph]
    print(a)
    print('========')
    print(b)
    

    修改步骤:

    1. 在循环开始之前,使用random.uniform函数生成每个颗粒的随机半径,设置范围为1.5到3.
    2. 在生成随机的x和y坐标时,需要保证颗粒完全位于边界内,需要分别设置x和y的范围为(xmin+r, xmax-r)和(ymin+r, ymax-r),其中r为颗粒半径。

    以上代码修改后,每个颗粒的半径将在指定范围内随机生成。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表