Программа 42
| > | restart; |
| > | with(plots): with(plottools): |
| > | EpuraM:=proc(P1,P2,P3) |
| > | local R,i,j,k,Lx,Rr,Ly,eq,eqs,S,Eq,sstm,unn:# |
| > | global Rm,Rx,Ry,Ro: |
| > | for k to 3 do |
| > | for i to 3*n do Eq[k][i]:=0;od: |
| > | od: |
| > | for i to m do # 3 уравнения равновесия стержней |
| > | Lx:=L1[i]: Ly:=L2[i]: |
| > | eq[i]:=R[1][i,1]+R[1][i,2]+Qx[i]*abs(Ly); |
| > | eq[i+m]:=R[2][i,1]+R[2][i,2]+Qy[i]*abs(Lx); |
| > | eq[i+2*m]:=R[2][i,2]*Lx-R[1][i,2]*Ly+Qy[i]*abs(Lx)*Lx/2-Qx[i]*abs(Ly)*Ly/2+R[3][i,1]+R[3][i,2]; |
| > | for k to 3 do #Равновесие узлов |
| > | for j to 2 do |
| > | Eq[k][str[i,j]]:=Eq[k][str[i,j]]-R[k][i,j]; |
| > | od;od; |
| > | od: |
| > | for i to n do #Нагрузки на узлы |
| > | for k to 3 do Eq[k][i]:=Eq[k][i]+P||k[i]:od: |
| > | od: |
| > | #Vns[i,1] номер стержня (1..m) |
| > | #Vns[i,2] номер конца (1,2) |
| > | #Vns[i,3] направление реакции (1-x,2-y,3-m) |
| > | for i to ks do #Внутренний шарнир на стержне |
| > | eqs[i]:=R[Vns[i,3]][Vns[i,1],Vns[i,2]]+Vns1[i]: |
| > | od; |
| > |
| > | for i to ko do #Опора. Ro - реакции опор |
| > | Eq[OPOR[i,2]][OPOR[i,1]]:=Eq[OPOR[i,2]][OPOR[i,1]]+Rr[i]: |
| > | od; |
| > | sstm:=seq(eq[i],i=1..3*m),seq(seq(Eq[k][i],k=1..3),i=1..n),seq(eqs[i],i=1..ks); |
| > | unn:=seq(Rr[i],i=1..ko),seq(seq(seq(R[k][i,j],k=1..3),i=1..m),j=1..2); |
| > | S:=solve({sstm},{unn}):assign(S): |
| > | Rx:=R[1]; Ry:=R[2]; Rm:=R[3];Ro:=Rr; |
| > | end proc: #**************************************************************** |
Определение поперечных сил
| > | RQ:=proc(Rx,Ry) local QQ,k,sn,cs,Qs: |
| > | global Q1: |
| > | QQ:=x->Ry[k,1]*cs-Rx[k,1]*sn+Qs*x: |
| > | for k to m do |
| > | sn:=L2[k]/L[k]: cs:=L1[k]/L[k]: |
| > | Qs:=(Qx[k]+Qy[k])*sign(-L2[k])*sign(L1[k]): |
| > | Q1[k,1]:=QQ(0): Q1[k,2]:=QQ(L[k]): |
| > | od; |
| > | end proc:#RQ |
Печать таблиц результатов (эпюры моментов и сил)
| > | PrintRez:=proc(M,Txt) local i,M1: |
| > | printf("\n N %s(1) %s(2) \n",Txt,Txt); |
| > | for i to m do |
| > | printf("%d %7.2f %7.2f \n",i,M[i,1],M[i,2]); |
| > | od; end proc: |
Получение функции M(v) по эпюре (z=0, если распр.нагр. нет, т.е. для единичных нагрузок)
| > | EM:=proc(M,z,v,k) M[k,1]+(-M[k,2]-M[k,1])/L[k]*v + z*(Qx0[k]+Qy0[k])*v*(L[k]-v)/2*sign(-L2[k])*sign(L1[k]):end: |
| > | RisRama:=proc() |
| > | local Ns,setN; |
| > | global rama; |
| > | setN:=FONT(TIMES,BOLD,14),COLOR(RGB,1,0,0): |
| > | Ns:=PLOT(seq(TEXT([x[i],y[i]],convert(i,symbol),ALIGNRIGHT),i=1..n),setN): |
| > | rama:=seq(ЛиниЯ(str[i,1],str[i,2]),i=1..m): |
| > | display(rama,Ns,axes=NONE); |
| > | end proc: |
| > | Lxy:=proc() |
| > | local k; |
| > | global L1,L2,L: |
| > | for k to m do # Длины участков |
| > | L1[k]:=x[str[k,2]]-x[str[k,1]]: |
| > | L2[k]:=y[str[k,2]]-y[str[k,1]]: |
| > | L[k]:=sqrt(L1[k]^2+L2[k]^2) |
| > | od: |
| > | end proc: |
Запись процедур на диск
| > | save Lxy,RisRama,EM,PrintRez,RQ,EpuraM, "C:\\epura.m"; |
| > |