Программа 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.

>