Программа 3. Расчет фермы
> | restart; |
> | with(LinearAlgebra): |
> | with(plots): |
> | with(plottools): |
> | FermaModule:=module() |
> | export Frm,runFerma: |
> | Frm:=proc() local P,Nbeg,Nend,K,x,y,fd,N, |
> | m,M,Шрифт,i,Шарнир,Симв,Стержень,Вид,nP,R,Ris,iP,G,Lx,Ly,L,S,B: |
> | use Maplets[Tools] in |
> | x:=Get('Tx'::list); # координаты |
> | y:=Get('Ty'::list); # координаты |
> | P[1]:=Get('TPx'::list); # Px |
> | P[2]:=Get('TPy'::list); # Py |
> | nP:=Get('TnP'::list); # |
> | Nbeg:=Get('TNbeg'::list); # Начало стержн |
> | Nend:=Get('TNend'::list); # Конец стержн |
> | K:=Get('TNopr'::integer); # Число опор |
> | m:=nops(P[1]): # Число нагрузок |
> | N:=nops(x): # Число узлов |
> | M:=nops(Nend): # Число стержней |
> | Шрифт:=FONT(TIMES,BOLD,8): |
> | for i to M do |
> | R[i]:=PLOT(CURVES([[x[Nbeg[i]],y[Nbeg[i]]], |
> | [x[Nend[i]],y[Nend[i]]]])): |
> | od: |
> | Симв:=proc(x) convert(x,symbol) end: |
> | for i to N do |
> | Шарнир[i]:=PLOT(TEXT([x[i]+0.3,y[i]+0.4],Симв(i)), |
> | Шрифт,COLOR(HUE,1)): |
> | od: |
> | for i to M do |
> | Стержень[i]:=PLOT(TEXT([(x[Nbeg[i]]+x[Nend[i]])/2+0.1, |
> | (y[Nbeg[i]]+y[Nend[i]])/2+0.2], |
> | Симв(i)),Шрифт,COLOR(HUE,0.7)): |
> | od: Параметры стрелки на рисунке |
> | Вид:=0.05,0.4,0.2,color=red: |
Изображение нагрузок
> | iP:=seq(arrow([x[nP[i]],y[nP[i]]],evalm([P[1][i],P[2][i]]*0.1),Вид),i=1..m): Изображение фермы |
> | Ris:=display(iP,seq(R[i],i=1..M),seq(Шарнир[i],i=1..N), |
> | seq(Стержень[i],i=1..M), |
> | scaling=constrained,axes=none);
Заполнение матрицы |
> | G:=Matrix(M,M): |
> | for i to M do |
> | Lx:=x[Nend[i]]-x[Nbeg[i]]: |
> | Ly:=y[Nend[i]]-y[Nbeg[i]]: |
> | L[i]:=sqrt(Lx^2+Ly^2): |
> | G[2*Nbeg[i]-1,i]:=Lx/L[i]:G[2*Nbeg[i],i]:=Ly/L[i]: |
> | if Nend[i]<=N-K then G[2*Nend[i]-1,i]:=-Lx/L[i]:G[2*Nend[i],i]:=-Ly/L[i]:fi: |
> | od: |
ПраваЯ часть системы - вектор нагрузок
> | B:=Vector(M): |
> | for i to m do |
> | B[2*nP[i]-1]:=P[1][i]: B[2*nP[i]]:=P[2][i]: |
> | od: |
> | S := LinearSolve(Matrix(M,G),-B): |
> | Set (t1=" \n",t2=" \n"): |
> | for i to M do |
> | Set(t1(appendline)=convert(i,string)): |
> | Set(t2(appendline)=convert(evalf(S[i],4),string)): |
> | od: |
> | end use: |
> | Ris: |
> | end proc: |
> | runFerma:=proc() |
> | local a,c1,c2,p1,mplt,z,T1,T2,zz; |
> | z:='width'=7,'height'=25,'editable'='false': |
> | use Maplets:-Elements in |
> | T1:=TextBox['t1'](z): |
> | T2:=TextBox['t2'](z): |
> | a[1]:=["[x ]=",TextField['Tx']('value'=[0,4,8,0,4,8,-1,0,8],'tooltip'="Введите координаты x")]: |
> | a[2]:=["[y ]=",TextField['Ty']('value'=[0,0,0,4,4,2,0,-1,-1],'tooltip'="Введите координаты y")]: |
> | a[3]:=["[beg]=",TextField['TNbeg']('value'=[1,2,1,2,3,1,2,4,5,1,1,3],'tooltip'="Введите номера узлов")]: |
> | a[4]:=["[end]=",TextField['TNend']('value'=[2,3,4,5,6,5,6,5,6,7,8,9],'tooltip'="Введите номера узлов")]: |
> | a[5]:=["Число опор=",TextField['TNopr']('value'=3,'tooltip'="Введите число опорных узлов")]: |
> | a[6]:=["[Px]=",TextField['TPx']('value'=[10],'tooltip'="Введите силу Px")]: |
> | a[7]:=["[Py]=",TextField['TPy']('value'=[0],'tooltip'="Введите силу Py")]: |
> | a[8]:=["[NP]=",TextField['TnP']('value'=[5],'tooltip'="Номера загруженных узлов")]: |
> | c1:=Button("Run", Evaluate('P' = 'display(Frm())')): |
> | c2:=Button("OK",Shutdown(['P'])): |
> | p1:=Plotter['P']('height'=300): |
> | mplt:= Maplet(Evaluate(function='Frm()'), |
> | Window('title'="Ферма", |
> | ["ТЕОРЕТИЧЕСКАЯ МЕХАНИКА", |
> | [BoxColumn( seq(a[i],i=1..8)),[["n","S[n]"],[T1,T2]], |
> | [[p1],[c1,c2]] |
> | ] |
> | ] ) |
> | ):#Maplet |
> | Maplets:-Display(mplt): |
> | end use; |
> | end proc; |
> | end module: |
> | FermaModule:-runFerma(): |
Initializing Java runtime environment.
> |