通过程序实现梁双向受弯承载力计算.docx
《通过程序实现梁双向受弯承载力计算.docx》由会员分享,可在线阅读,更多相关《通过程序实现梁双向受弯承载力计算.docx(13页珍藏版)》请在冰豆网上搜索。
通过程序实现梁双向受弯承载力计算
通过程序实现梁双向受弯承载力计算
以下内容包括三个部分:
程序说明,源程序,例题计算。
一.本作业通过C++程序编写,首先是程序说明部分。
1.整个程序的运算可以实现截面上下排(单排)任意配筋的计算,(双排布筋未考虑);
2.根据混凝土受压区图形为三角形,四边形,五边形时,通过循环前进行判断,得出受压区具体的图形,从而进行计算;
3.程序一开始定义了一全局常量NUM=100,可以控制数组的大小,它表示最多布置钢筋数为100,实际工程中基本不会超过这个值,可以通过对它修改,实现对所有数组长度的修改;
4.一开始定义了在计算过程中需要的各种变量b,h,kx,ky,tx,ty,Tan,fc,BETA,Cc分别表示截面的宽度b,高度h,混凝土受压区边长比例kx,ky,中和轴同y轴夹角大小Tan,混凝土圆柱体抗压强度fc,混凝土受压区高度修正系数BETA,混凝土受压区合力Cc;同时还定义了一系列数组用于储存钢筋的相关值:
As[NUM],L[NUM],S[NUM],Fs[NUM],Es[NUM],fy[NUM],R[NUM],分别表示钢筋的面积,应变,力,应力,弹模,屈服强度,直径;
5.input()函数表示数据的录入,分别输入截面尺寸,材料常数等数据,在输入钢筋的特征常数时,考虑到经常一排钢筋采用相同的钢筋,所以设置了一个选项:
"是否需要单独输入每根钢筋的数据,是请输1,否请输2"。
在数据的录入过程中,长度均要求按mm输入,其他应按MPa输入,这在输入数据前都通过输出相关语句进行了提醒;
6.定义了一个floatYLJS(floatKX,floatKY)函数,实现计算钢筋的应变,并返回所有钢筋的合力为函数值,方便了后面的计算;
7.定义了一个intSOLVE()函数,可以判断受压区图形形状,并通过循环计算出实际的中和轴位置,(得到符合题目要求的kx,ky的值);
8.在主函数中,首先调用input()函数,输入数据,通过一个for循环
for(intjj=0;jjif(jj<=n-1)X[jj]=tx+(b-2*tx)*jj/(n-1),Y[jj]=ty;
elseX[jj]=tx+(b-2*tx)*(jj-n)/(m-1),Y[jj]=h-ty;
}
计算出各钢筋距离截面右上角的位置后,将得到的值放入X[]和Y[],其中n表示上排钢筋数,m表示下排钢筋数;
9.定义了一个整数c,通过它判断受压区的面积,为1时为三角形,2时为四边形,3时为五边形;
10.在调用SOLVE()函数时,会调用YLJS函数:
floatYLJS(floatKX,floatKY){
floats=0;
for(intj=0;jL[j]=0.003*(1-X[j]/(KX*b)-Y[j]/(KY*h));//计算钢筋应变
if(fabs(L[j])>=fy[j]/Es[j]){
if(L[j]>=0)Fs[j]=fy[j];
elseFs[j]=fy[j]*(-1);
}
elseFs[j]=L[j]*Es[j];//压为正,拉为负
As[j]=3.14*R[j]*R[j]/4;
S[j]=Fs[j]*As[j];
s=s+S[j];
}
returns;
}
在函数的一开始s用来表示各个钢筋的合力,一开始赋初值0,通过循环叠加得到,钢筋的力通过应力乘以面积得到,应力则是根据应变得到,根据平截面假定,通过公式计算出,同时通过if语句,使得钢筋的应变不会超过它弹性的最大应变,最后函数返回值为s;
11.调用SOLVE()函数,在SOLVE函数中首先定义了a1,a2,a3,a4四个变量,用来方便后面计算中中间数据的存贮,首先分别计算出当受压区面积恰好为最大三角形和最大四边形时候混凝土的压力Cc和钢筋的力S[];因为kx大于ky和kx小于ky时候,计算不一样,所以通过if语句,分开讨论,此处a3对应最大三角形状态时钢筋合力,a4和Cc分别对应最大四边形时钢筋和混凝土合力;接着计算俩种状态下的钢筋和混凝土的合力之和,分别储存到a3和a4中,当a3大于0时,说明混凝土受压区面积过大,则受压区图形必为三角形,当a4小于0时,则说明受压区面积过小,受压区图形必为五边形,当a3*a4小于0时,则受压区面积为四边形;
12.当c=1时对应三角形,采用二分法进行循环,当最后的a3的绝对值小于2MPa时,循环停止,得到对应的kx和ky;当c=2时为四边形的状态,根据kx和ky的大小,判断梯形的上下底边的方向,并通过对kx(或ky)递增的思想得到对应的值;当c=3时,思想同上;
13.返回c值为SOLVE的函数值,继续主函数,定义了重心坐标和俩个方向的弯矩;通过c的不同,计算四种图形对应的重心坐标;
14.分别计算每根钢筋俩个方向的弯矩,通过叠加得到最终截面能承受的弯矩Mux和Muy,输出结果。
二.函数源程序代码
#include
#include
constintNUM=100;//定义一全局常量用来控制数组的容量;
floatb,h,kx,ky,tx,ty,Tan,fc,BETA,Cc;
//Tan表示中和轴和y轴夹角的正切值,BETA即为混凝土受压区高度修正系数,Cc为混凝土的合力
floatAs[NUM],L[NUM],S[NUM],Fs[NUM],Es[NUM],fy[NUM],R[NUM];
//L表示钢筋的应变,S[]表示钢筋的力,Fs表示钢筋应力,ES表示钢筋弹模,fy表示钢筋屈服强度,R表示钢筋直径
intn,m;//分别表示上下排钢筋的根数
floatX[NUM],Y[NUM];//表示钢筋的位置
voidinput();//数据输入函数声明;
floatYLJS(float,float);//计算钢筋的应力;
intSOLVE();
intmain(){
input();//数据的录入;
for(intjj=0;jjif(jj<=n-1)X[jj]=tx+(b-2*tx)*jj/(n-1),Y[jj]=ty;
elseX[jj]=tx+(b-2*tx)*(jj-n)/(m-1),Y[jj]=h-ty;
}//计算各钢筋的位置(距离右上角点)
intc;
c=SOLVE();
floatxx,yy,Mux,Muy;
if(c==1){//通过c判断受压区面积的形状,并计算各自重心
xx=BETA*kx*b/3;
yy=BETA*ky*h/3;
}
elseif(c==2&&kx>=ky){
xx=(BETA-1/kx+BETA/(3*kx))*b/(2*BETA-1/kx);
yy=ky*h*((BETA-1/kx)*(BETA-1/kx)+BETA*BETA/kx-2*BETA*BETA/(3*kx*kx))/(2*BETA-1/kx);
}
elseif(c==2&&kxxx=kx*b*((BETA-1/ky)*(BETA-1/ky)+BETA*BETA/ky-2*BETA*BETA/(3*ky*ky))/(2*BETA-1/ky);
yy=(BETA-1/ky+BETA/(3*ky))*h/(2*BETA-1/ky);
}
else{
xx=b*(1-(1-ky*BETA+ky/kx)*(1-kx*BETA+kx/ky)*(2+kx*BETA-kx/ky)/3)/(2-(1-ky*BETA+ky/kx)*(1-kx*BETA)+kx/ky);
yy=h*(1-(1-ky*BETA+ky/kx)*(1-kx*BETA+kx/ky)*(2+ky*BETA-ky/kx)/3)/(2-(1-ky*BETA+ky/kx)*(1-kx*BETA)+kx/ky);
}
floatMxs=0,Mxx=0,Mys=0,Myx=0;
//Mxs,Mys,Mxx,Myx分别表示上部钢筋和下部钢筋x和y方向的和弯矩;
for(inti=0;iMxs=Mxs+S[i]*(h-Y[i]);
Mys=Mys+S[i]*(b-X[i]);
}
for(intj=0;jMxx=Mxx+S[n+j]*(h-Y[n+j]);
Myx=Myx+S[n+j]*(b-X[n+j]);
}
Mux=Cc*(h-yy)+Mxs+Mxx;
Muy=Cc*(b-xx)+Mys+Myx;
cout<<"xx="<cout<<"Mux="<return0;
}
voidinput(){//数据输入函数;
for(inti=0;iAs[i]=0;
L[i]=0;
S[i]=0;
Fs[i]=0;
Es[i]=0;
fy[i]=0;
R[i]=0;
X[i]=Y[i]=0;
}
cout<<"请依次输入梁截面宽度b和高度h(单位mm)"<cin>>b>>h;
cout<<"b="<
cout<<"请依次输入钢筋x方向和y方向外排钢筋重心距离边缘厚度tx和ty(单位mm)"<cin>>tx>>ty;
cout<<"tx="<cout<<"请输入截面x方向和y方向的弯矩比值Tan"<cin>>Tan;
cout<<"Tan="<cout<<"请输入混凝土抗压强度设计值fc(单位MPa)"<cin>>fc;
cout<<"fc="<cout<<"梁上下截面均只考虑单排配筋的情况"<cout<<"请输入上排钢筋的根数"<cin>>n;
cout<<"是否需要单独输入每根钢筋的数据,是请输1,否请输2"<intY;
cin>>Y;
if(Y==1){
for(intj=1;j<=n;j++){
cout<<"请从右往左依次输入上排第"<cin>>Es[j-1]>>fy[j-1]>>R[j-1];
cout<<"上排第"<}
}
elseif(Y==2){
cout<<"请依次输入上排钢筋的弹性模量Es(单位MPa)屈服强度fy(单位MPa)和直径R(单位mm)"<cin>>Es[0]>>fy[0]>>R[0];
for(intj=1;j<=n;j++){
Es[j-1]=Es[0];
fy[j-1]=fy[0];
R[j-1]=R[0];
}
cout<<"上排钢筋的Es="<}
else{
cout<<"输入错误,请重新开始"<}
cout<<"请输入下排钢筋的根数"<cin>>m;
cout<<"是否需要单独输入每根钢筋的数据,是请输1,否请输2"<cin>>Y;
if(Y==1){
for(intj=1;j<=m;j++){
cout<<"请从右往左依次输入下排第"<cin>>Es[n+j-1]>>fy[n+j-1]>>R[n+j-1];
cout<<"下排第"<}
}
elseif(Y==2){
cout<<"请依次输入下排钢筋的弹性模量Es(单位MPa)屈服强度fy(单位MPa)和直径R(单位mm)"<cin>>Es[n]>>fy[n]>>R[n];
for(intj=1;j<=m;j++){
Es[n+j-1]=Es[n];
fy[n+j-1]=fy[n];
R[n+j-1]=R[n];
}
cout<<"下排钢筋的Es="<}
else{
cout<<"输入错误,请重新开始"<}
if(fc<=27.6)BETA=0.85;//1psi=0.0069MPa
elseBETA=0.85-0.05*(fc-27.6)/(6.9);
}
floatYLJS(floatKX,floatKY){
floats=0;
for(intj=0;jL[j]=0.003*(1-X[j]/(KX*b)-Y[j]/(KY*h));//计算钢筋应变
if(fabs(L[j])>=fy[j]/Es[j]){
if(L[j]>=0)Fs[j]=fy[j];
elseFs[j]=fy[j]*(-1);
}
elseFs[j]=L[j]*Es[j];//压为正,拉为负
As[j]=3.14*R[j]*R[j]/4;
S[j]=Fs[j]*As[j];
s=s+S[j];
}
returns;//返回值为所有钢筋的合力
}
intSOLVE(){
floata1,a2,a3,a4;
if(kx>=ky){
a3=YLJS(1/BETA,b/(BETA*Tan*h));
a4=YLJS(Tan/BETA,b/(BETA*h));
Cc=0.425*fc*ky*h*(2*BETA-1/kx)*b;
}
else{
a3=YLJS(Tan/BETA,b/(h*BETA));
a4=YLJS(1/BETA,b/(h*BETA*Tan));
Cc=0.425*fc*BETA*kx*b*(2*BETA-1/ky)*h;
}
a3=a3+0.425*fc*BETA*ky*h*BETA*kx*b;
a4=a4+Cc;
intc=a3*a4;
if(c>=0&&a3>=0){
c=1;
cout<<"混凝土受压区面积为三边形"<}
elseif(c>=0&&a4<0){
c=3;
cout<<"混凝土受压区面积为五边形"<}
else{
c=2;
cout<<"混凝土受压区面积为四边形"<}
if(c==1){
a1=0,a2=0.5;
kx=0.5;
do{
a3=0;
kx=kx+a2*a1;
a2=a2*0.5;
cout<ky=kx*b/(h*Tan);
Cc=0.425*fc*BETA*ky*h*BETA*kx*b;
a3=Cc+YLJS(kx,ky);
if(a3>=0)a1=-1;
elsea1=1;
a3=a3/1000;
}while(fabs(a3)>=2&&kx<1);
return1;
}
elseif(c==2){
a1=0;
if(kx>=ky){
kx=(Tan/BETA+1/BETA)*0.5;
ky=kx*b/(Tan*h);
do{
kx=kx+0.001*a1;
Cc=0.425*fc*ky*h*(2*BETA-1/kx)*b;
a3=Cc+YLJS(kx,ky);
if(a3>=0)a1=-1;
elsea1=1;
a3=a3/1000;
}while(fabs(a3)>=2);
}
else{
ky=(1/(BETA*Tan)+1/BETA)*0.5;
kx=ky*Tan*h/b;
a1=0;
do{
ky=ky+0.001*a1;
Cc=0.425*fc*BETA*kx*b*(2*BETA-1/ky)*h;
a3=Cc+YLJS(kx,ky);
if(a3>=0)a1=-1;
elsea1=1;
a3=a3/1000;
}while(fabs(a3)>=2);
}
return2;
}
else{
a1=0,a2=5;
kx=5;
do{
a3=0;
kx=kx+a2*a1;
a2=a2*0.5;
ky=kx*b/(Tan*h);
Cc=b*h*(1-0.5*(1-kx*BETA+kx/ky)*(1-ky*BETA+ky/kx));
a3=Cc+YLJS(kx,ky);
if(a3>=0)a1=-1;
elsea1=1;
a3=a3/1000;
}while(fabs(a3)>=2&&kx<1);
return3;
}
}
三.例题计算
根据帕克的《钢筋混凝土结构》中的例子利用上面的程序进行计算;
1.原题数据和计算结果
2.运行程序
没有错误,有18个警告,对本程序运行没用影响。
3.程序界面
4.输入数据
5.最终的计算结果
因为程序语言中增加了输出kx的语句,所以可以看到kx取值的变化,(从0.5到0.729492)最终当kx=0.729的时候,循环停止,这和书上的0.73是一致的;计算出的截面重心位置为xx=52.50mm,yy=52.50mm;Mux=Muy=48.63KNm与书上的结果均吻合,验证了程序的有效性。