有多名读者给我发邮件,问过类似的问题:有限元建模过程中,某些参数是变化的、随机的(例如,混凝土结构中不同级配的骨料、地下开采过程中大小、形状不同的砾石等),该如何建模?
当遇到随机分布的变量时,则通常需要用到 Python 标准库中的 random 模块,该模块中包含多个函数,可以生成随机的浮点数、整数、字符串类型的数据、或随机选择列表序列中的一个元素、打乱一组数据等。
下面简单介绍 random 模块中的常用函数:
1. random()函数
该函数是 random 模块中最常用的方法,将随机生成一个0.0~1.0之间的浮点数。例如:
--------------------------------
>>> import random
>>> print random.random()
0.809221478124
--------------------------------
☞提示:循环调用 random 模块中的 random 函数,可以生成读者需要的所有浮点数,下同。
2. uniform()函数
该函数的原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数 a 和 b 分别表示上下限。如果a > b,则生成的随机数n: a < = n < = b。如果 a < b,则 b < = n < = a。例如:
--------------------------------
>>> import random
>>> print random.uniform(10,20)
13.2960134544
>>> printrandom.uniform(20,10)
15.9038751838
--------------------------------
3. randint()函数
该函数的原型为 random.randint(a, b),用于生成一个指定范围内的整数。其中参数a 是下限,参数 b 是上限,生成的随机数 n: a < = n < = b。例如:
---------------------------------------------
>>> import random
>>> print random.randint(10, 100)
73
>>> printrandom.randint(100,10) # 下限必须小于上限,否则抛出 ValueError 异常
Traceback (most recent calllast):
File"<stdin>", line 1, in <module>
File"d:\SIMULIA\CAE\2019\win_b64\tools\SMApy\python2.7\lib\random.py",line241,in randint
return self.randrange(a, b+1)
File"d:\SIMULIA\CAE\2019\win_b64\tools\SMApy\python2.7\lib\random.py",line217,
in randrange
raise ValueError, "empty range forrandrange() (%d,%d, %d)" % (istart, istop, width)
ValueError: empty range forrandrange() (100,11, -89)
---------------------------------------------
4. choice()函数
该函数的原型为 random.choice(sequence),其参数为一个序列(sequence)该函数可以从任何序列(例如列表)中选取一个随机的元素返回。例如:
---------------------------------------------
>>>print random.choice('abcdefg')
c
>>> printrandom.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] )
pear
-------------------------------------------
5. shuffle()函数
该函数的原型为 random.shuffle(x[, random]),用于将一个列表中的元素顺序打乱。例如:
---------------------------------------------
>>> p =["Python", "is", "powerful", "simple","and so on..."]
>>> random.shuffle(p)
>>> print p
p = ["Python","is", "powerful", "simple", "and soon..."]
---------------------------------------------
☞提示:本节中调用的函数都是随机函数,因为输出结果是随机的,读者运行后的输出结果可能与书中不同,这是正常现象。
6. randrange函数
该函数的原型为 random.randrange([start], stop[, step]),功能是从指定范围按指定基数递增的集 合中获取一个随机数。例如,random.randrange(20, 50, 4),结果相当于从序列 [20, 24, 28, 32, ... 44, 48] 中获取一个随机数。其执行结果与 random.choice(range(20, 50, 4) 执行结果等效。例如:
---------------------------------------------
>>>import random
>>>random.randrange(20,50,4)
36
---------------------------------------------
7. sample(seq, n)函数
该函数的功能是从序列 seq 中随机截取指定长度 n 的序列,原序列中的元素顺序不变。
---------------------------------------------
>>> import random
>>>list=[1,2,3,4,5,6,7,8,9,10]
>>> a=random.sample(list,5) #从list中随机获取5个元素,作为一个新序列返回
>>> print a
[1, 6, 10, 8, 3]
>>> printlist #原有序列并没有改变
[1, 2, 3, 4, 5, 6, 7, 8, 9,10]
---------------------------------------------
掌握了上述随机函数的使用方法,读者就可以根据需要构造随机生成的元素序列,并根据需要构造所需的随机模型。
笔者编写的随机生成10个不同半径的圆形部件的源代码如下:
---------------------------------------------
1#!/user/bin/python
2.# -* - coding:UTF-8 -*-
3# 导入所有相关模块
4from abaqus import *
5from abaqusConstants import *
6import random
7from caeModules import *
8from driverUtils import executeOnCaeStartup
9# 下列代码直接复制abaqus.rpy文件中的内容
10session.Viewport(name='Viewport: 1', origin=(0.0, 0.0),width=157.919921875,
11 height=80.3541717529297)
12session.viewports['Viewport: 1'].makeCurrent()
13executeOnCaeStartup()
14session.viewports['Viewport: 1'].partDisplay.geometryOptions.setValues(
15 referenceRepresentation=ON)
16s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=200.0)
17g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
18s.setPrimaryObject(option=STANDALONE)
19#构造列表data[],用于存储10个由随机函数生成的圆形部件的半径
20data=[]
21#调用append方法追加数据
22for i in range(0,10):
23 data.append(random.uniform(10,20))
24print data
25#循环十次,生成10个圆形部件
26j=0
27for i in range(0,10):
28 s.CircleByCenterPerimeter(center=(0.0,0.0), point1=(data[j], 0.0))
29 p =mdb.models['Model-1'].Part(name='Part-'+str(j),
30 dimensionality=TWO_D_PLANAR,type=DEFORMABLE_BODY)
31 p =mdb.models['Model-1'].parts['Part-'+str(j)]
32 j=j+1
---------------------------------------------
l第20行代码构造了空的列表 data[ ],用来存储随机函数构造的半径值。这种方法在代码开发过程中非常好用,在实际开发过程中注意灵活运用。
l第24行代码输出列表 data[],用来查看半径值。
l为了让创建的零部件自动命名,第26行代码构造了循环指针 j,自动读取 data[ ]列表中的数据。编写代码过程中,读者应该根据需要设置一些与研究目的不直接相关,却会对功能实现非常重要的列表、字符串等。
l脚本中已经给出了尽可能多的注释行,此处不再赘述。
在 Abaqus/CAE 的 File 菜单下,单击 Run Script …子菜单或使用命令:Abaqus cae script = random_radius.py来运行脚本,执行完毕单击部件管理器图标 查看生成的部件,如图1所示:
图1 自动生成的部件