Python学习记录-矩形柱PM曲线分析拓展

上回做的矩形柱的PM曲线程序代码感觉过于简单,于是我参照《混凝土设计规范》把一些中间过程计算代码也写出来,这样我们只要输入计个简单的参数就可以让程序自行计算。此外把设计荷载也加入到输出的图形里面,以便我们直观的判断荷载是否满足承载力要求,亦方便后续程序开发。

计算案例介绍

案例矩形截面尺寸bxh = 500x600mm,截面配筋为单侧1901mm2,双侧对称配筋。钢筋中心到边缘的距离是35mm,混凝土等级为C30,钢筋采用HRB400,fy = 360MPa, fc = 14.3MPa(这里取砼结构规范的设计值,桥梁公预规取值比砼规范小)。在编程计算之前,采用程序XTRACT对截面的PM曲线进行分析,以验证自己编程计算的合理性。

图1 XTRACT截面PM计算结果(单位:N-m)

Python程序代码

计算代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# -*- coding: utf-8 _*_
import random
import math
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt

def fc1(fcuk):
α_c1 = max((0.76+(0.82-0.76)*(fcuk-50)/(80-50)),0.76)
α_c2 = min((1-(1-0.87)*(fcuk-40)/(80-40)),1.0)
fck = 0.88*α_c1*α_c2*fcuk
fc = fck/1.4
return fc

def α(fcuk):
α1 = min(1.0-0.06*(fcuk-50)/3,1.0)
return α1

def ε_cu(fcuk):
ε_cu = min((0.0033-(fcuk-50)*10**-5,0.0033))
return ε_cu

def β1(fcuk):
β1 = min(0.8-0.06*(fcuk-50)/30,0.8)
return β1

def ξ_b(fcuk,fy1,Es):
ε_cu1 = ε_cu(fcuk)
β11 = β1(fcuk)
ξ_b = β11/(1+fy1/(Es*ε_cu1))
return ξ_b

def Nu_Mu(fcuk,fy1,b,h,as1,As1,Es):
as2 = as1
h0 = h-as1
fc = fc1(fcuk)
α1 = α(fcuk)
ξ_b1 = ξ_b(fcuk,fy1,Es)
β11 = β1(fcuk)
pp=[]
mm=[]

fig = plt.figure(figsize=(5.7,4.6),facecolor="#f1f1f1") #创建一个图像
left,bottom,width,height = 0.1,0.1,0.85,0.8 #参数赋值
fig.add_axes((left,bottom,width,height),facecolor="#f1f1f1") #根据参数添加轴
plt.rcParams['font.sans-serif'] = ['SimHei'] #运行配置参数中的字体为黑体
plt.title('对称配筋时Nu、Mu相关曲线') #设置图表标题

dot_num = 66

N0 = α1*fc*b*ξ_b1*h0
Numax = α1*fc*b*h+2*As1*fy1
for i in range(dot_num+1):
Nu1=(i/dot_num)*Numax
if Nu1<=Numax:
if Nu1<=N0:
Mu1 = -(Nu1**2)/(21*fc*b)+Nu1*h/2+fy1*As1*(h0-as2)
else:
λ1=(β11-ξ_b1)/(α1*fc*b*h0*(β11-ξ_b1)+fy1*As1)
λ2=(ξ_b1*fy1*As1)/(α1*fc*b*h0*(β11-ξ_b1)+fy1*As1)
ξ=(λ1*Nu1+λ2)-0.5*(λ1*Nu1+λ2)*(λ1*Nu1+λ2)
Mu1=α1*fc*b*h0*h0*ξ-(h/2-as1)*Nu1+fy1*As1*(h0-as1)
pp.append(Nu1/1000) #生成数列。
mm.append(Mu1/1e6)
#plt.plot(Mu1/10**6,Nu1/1000,color='b',label='Nu、Mu相关曲线',linewidth=2,linestyle='-',marker='',alpha=1) #marker标记样式,alpha线条透明度(0,1)
plt.plot(mm,pp,color='b',label='Nu、Mu相关曲线',linewidth=2,linestyle='-',marker='',alpha=1)
makers = ['.','^','1','s','x','h','*','p','+','o','D','x','h','*','|','^','1','s','x','h','*','p']
for i,Nu,Mu in zip(makers,[5800,5200,1600,850,3500],[400,400,460,550,650]): #zip函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组

plt.plot(Mu,Nu,color='r',label=f'N={Nu}、M={Mu} ',marker=i) #绘制标签内容
plt.legend() #添加图例
plt.grid() #显示网格线
plt.xlabel('Mu(kN·m)') #设置x轴标签
plt.ylabel('Nu(kN)') #设置y轴标签
plt.show() #显示最终图形
graph = '对称配筋时Nu_Mu相关曲线给定N_M值的判断'
fig.savefig(graph,dpi=600,facecolor="f1f1f1") #保存图形
return 0

def main():
''' fcuk,fy1,b,h,as1'''
fcuk,fy1,b,h,as1,As1,Es = 30,360,500,600,35,1901,200000
Nu_Mu(fcuk,fy1,b,h,as1,As1,Es)

with open('result.txt', 'w') as f: #定义要写入的文件。
dot_num = 66
for i in range(dot_num+1):
f.write('{0:u.2f}'.format(pp[i])+','+'{0:.5e}\n'.format(mm[i]))

dt = datetime.now()
localtime = dt.strftime('%Y-%m-%d %H:%M:%S')
print('-'*many)
print("本图形生成时间 :", localtime)

if __name__ == "__main__":
many=45
print('='*many)
main()
print('='*many)

图2 编程计算结果

后记

我的目标是把这个小程序做成一个app以供我们方便使用,后续会不断完善。

-------------本文结束感谢您的阅读-------------
请我一杯咖啡吧!
郭志良 微信 微信
郭志良 支付宝 支付宝
欢迎关注我的其它发布渠道