《c语言计算平面桁架内力计算程序》由会员分享,可在线阅读,更多相关《c语言计算平面桁架内力计算程序(11页珍藏版)》请在金锄头文库上搜索。
1、#include #include #include #define M 5 int n,nc,nn,m,e,f;/ 节点总数,固定节点数,自由度数,杆件数int io,jo;/ 单根杆对号指示数int ihlM,ihrM;/杆件左右节点号double aM;/ 各杆截面积double mmM;/杆件质量double eaM;/ 杆件 EA的值double xM,yM;/节点坐标double dpM;/总体系下的节点载荷double t2;/0,1分别为坐标转换矩阵的cos(),sin() double c22;/ 总体系下的单刚double clxy3;/0,1,2分别为杆长,正弦,余弦do
2、uble hM;/ 杆件轴力double rMM;/总刚度阵double rd;/ 桁架轴力杆局部系单刚double uM;/ 桁架节点位移double v2;/ 存放节点位移差double dM;/LDLT 分解时的D 矩阵的对角线元素double lMM;/LDLT分解时的D 矩阵的对角线元素double fdpM;/总体系下支座反力void iojo(int k)/ 计算对号指示数io,jo int i,j; i=ihlk-1;/k号杆左节点号进入i j=ihrk-1;/k号杆节点右号进入i io=2*(i-nc-1);/uxi前未知位移的个数jo=2*(j-nc-1);/uyi前未知位
3、移的个数 void ch(int k)/ 计算杆长与方向余弦函数 int i,j; i=ihlk-1;/k号杆左节点进入i j=ihrk-1;/k号杆右节点进入j clxy1=xj-1-xi-1;/k号杆 x 坐标差clxy2=yj-1-yi-1;/k号杆 y 坐标差clxy0=sqrt(clxy1*clxy1+clxy2*clxy2);/k号杆长clxy1=clxy1/clxy0;/k号杆件 x 轴余弦clxy2=clxy2/clxy0;/k号杆件 y 轴余弦 void stif(int k)/ 计算 k 号杆件总体系下的单元刚度阵 int i,j; ch(k);/ 调用 ch(),计算 k
4、 号杆件杆长与余弦t0=clxy1; t1=clxy2; rd=eak-1/clxy0; for(i=0;i=0) for(i=io+1;i=0)/ 如果io=0, 右端为可动节点,则只在jo+1,jo+2 对角分块位置累加 for(i=jo+1;i=0;i-) m=0.0; for(k=i+1;k=0) / 左节点为自由节点 dpio+1=dpio+1-(g/2); / 左节点的y 轴荷载减少二分之一重力dpjo+1=dpjo+1-(g/2); / 右节点的y 轴荷载减少 二分之一重力 else if(jo=0) / 若右节点为自由节点,则仅有右节点做如下处理 ko=io+2*nc; / 定
5、义反力指示数ko等于 2*(固定节点号-1)dpjo+1=dpjo+1-(g/2); fdpko+1=fdpko+1-(g/2); / 支座反力叠加重力的一半 void dofanli() / 计算反力 int k,ko; for(k=1;ksigema0|sigema=0) dpio=dpio+eak-1*l*clxy1/clxy0; / 左节点x 轴方向附加载荷增加 P=l*EA/l 乘其方向余弦dpio+1=dpio+1+eak-1*l*clxy2/clxy0; /y 轴方向同上操作dpjo=dpjo-eak-1*l*clxy1/clxy0; / 注: 右节点与左节点附加装配应力相反dp
6、jo+1=dpjo+1-eak-1*l*clxy2/clxy0; else ko=io+2*nc; dpjo=dpjo-eak-1*l*clxy1/clxy0; / 注: 右节点与左节点附加装配应力相反dpjo+1=dpjo+1-eak-1*l*clxy2/clxy0; printf(“%f,%fn“,dpjo,dpjo+1); fdpko=fdpko+eak-1*l*clxy1/clxy0; / 固定节点ihl 反力叠加装配应力fdpko+1=fdpko+1+eak-1*l*clxy1/clxy0; void tem() / 计算温度应力 int k,ko; double t0,arf,t1
7、,t2,detal; / 定义变量,温差,热膨胀 系数,初始温度,最终温度,温变引起的长度变化printf(“ 请输入初始温度n“); / 变量输入scanf(“%lf“, printf(“ 请输入最终温度n“); scanf(“%lf“, printf(“ 请输入杆件的热膨胀系数n“); scanf(“%lf“, t0=t2-t1; for(k=1;k=0) dpio=dpio+eak-1*detal*clxy1/clxy0; / 左节点 x 轴方向附加载荷增加P=l*EA/l 乘其方向余弦dpio+1=dpio+1+eak-1*detal*clxy2/clxy0; /y 轴方向同上操作dp
8、jo=dpjo-eak-1*detal*clxy1/clxy0; / 注:右节点与左节点附加温度应力相反dpjo+1=dpjo+1-eak-1*detal*clxy2/clxy0; else ko=io+2*nc; dpjo=dpjo-eak-1*detal*clxy1/clxy0; / 注:右节点与左节点附加温度应力相反dpjo+1=dpjo+1-eak-1*detal*clxy2/clxy0; fdpko=fdpko+eak-1*detal*clxy1/clxy0; / 固定节点ihl 反力叠加温度应力fdpko+1=fdpko+1+eak-1*detal*clxy1/clxy0; int
9、 main() int i; printf(“ *求 解 平 面 桁 架 节 点 位 移 与 杆 端 力 程 序*nn“); printf(“n -输入数据时请用空格或回车符间隔-n“); printf(“nn请输入桁架节点总数n,固定节点数nc,杆件数 m:n“); scanf(“%d,%d,%d“, nn=2*(n-nc); printf(“ 请输入节点坐标:n“); for(i=0;in;i+) printf(“x%d=“,i+1); scanf(“%lf“, printf(“y%d=“,i+1); scanf(“%lf“, printf(“ 输入杆件左右节点号:n“); for(i=0
10、;im;i+) printf(“ihl%d=“,i+1); scanf(“%d“, printf(“ihr%d=“,i+1); scanf(“%d“, printf(“ 请输入杆件的EA值ea:n“); for(i=0;im;i+) printf(“ea%d=“,i+1); scanf(“%lf“, printf(“ 请输入节点载荷dp:n“); for(i=0;inn;i+) printf(“dp%d=“,i+1); scanf(“%lf“, dor(); choldlt(); printf(“ 是否需要考虑自重,需要请输入1 ,不需要请输入0 。n“); scanf(“%d“, if(e=
11、1) dowt(); e=0; printf(“ 是否需要考虑装配应力,需要请输入1 ,不需要请输入0 。n“); scanf(“%d“, if(e=1) assemble(); e=0; printf(“ 是否需要考虑温度应力,需要请输入1 ,不需要请输入0 。n“); scanf(“%d“, if(e=1) tem(); e=0; / 插入结束trildlt(); printf(“nn请输出各个节点位移列向量U:n“); for(i=0;inn;i+) printf(“u%d=%fn“,i+1,ui); doh(); printf(“ 输出杆件轴力 :n“); for(i=0;im;i+) printf(“h%d=%8.4fn“,i+1,hi); printf(“ 是否需要考虑强度校核,需要请输入1 ,不需要请输入0 。n“); scanf(“%d“, if(e=1) verify(); e=0; printf(“ 是否需要计算支座反力,需要请输入1 ,不需要请输入0 。n“); scanf(“%d“, if(f=1) dofanli(); printf(“ 输出节点反力:n“); for(i=0;i=2*nc-1;i+) printf(“fdp%d=%8.4fn“,i,fdpi); return 0;