0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

材料力学「2次元トラス構造の剛性マトリックス いろいろ」sympyで。

Last updated at Posted at 2025-06-29

・sympyのTrussで一部作図しました。
 縦横比が1:1でありません。

sympyで

The truss subjected by the vertical load.

・ver0.2 solveで

# ver0.2 
from sympy import *
var('P,AE,l')
var('FX1,FX2,FY1,FY2,FX3,FY3')
var('k13,k12')
var('U1,U2,U3,V1,V2,V3')
C=Matrix([[FX1],   \
          [FY1],   \
          [FX2],   \
          [FY2],   \
          [FX3],   \
          [FY3]])
A=k13*                       \
  Matrix([[ k12/k13+Rational(3,4),sqrt(3)/4     ,k12/k13       ,0             ,0             ,0             ],  \
          [ sqrt(3)/4            ,Rational(1,4) ,0             ,0             ,0             ,0             ],  \
          [-k12/k13              ,0             ,k12/k13       ,0             ,-Rational(3,4),-sqrt(3)/4    ],  \
          [ 0                    ,0             ,0             ,0             ,-sqrt(3)/4    ,-Rational(1,4)],  \
          [ 0                    ,0             ,-Rational(3,4),-sqrt(3)/4    ,Rational(3,4) ,sqrt(3)/4     ],  \
          [ 0                    ,0             ,-sqrt(3)/4    ,-Rational(1,4),sqrt(3)/4     , Rational(1,4)]])
B=Matrix([[U1],   \
          [V1],   \
          [U2],   \
          [V2],   \
          [U3],   \
          [V3]])
print("#",{k:v.simplify().radsimp() for k,v in \
           solve(Eq(C,A*B).subs({k12:AE/l  ,k13:2/sqrt(3)*AE/l                       }) \
                          .subs({      U2:0,V2:0,U3:0,V3:0,FX1:0,FY1:P               }), \
                               [U1,V1,                               FX2,FY2,FX3,FY3]).items()})
# {FX2: sqrt(3)*P, FX3: 0, FY2: 0, FY3: 0, U1: -sqrt(3)*P*l/AE, V1: P*l*(3 + 2*sqrt(3))/AE}

三角形トラス

・ver1.3 sympyのTrussで

# ver1.3 
from sympy.physics.continuum_mechanics.truss import Truss
from sympy import *
var('P,l,AE',positive=True)
var('P2x,P3x')
def myTruss_l(l):
    def myAdd_member(*args):
        def make_triples(s):
            return (s,s[0],s[1])
        for s in args:
            t.add_member(make_triples(s))      
    t = Truss()
    t.add_node     (('1',0,0),('2',Rational(1,2)*l,Rational(1,2)*l),('3',l,0))
    myAdd_member   ( '12','23','31')  
    t.apply_support(('1','pinned'),('3','roller'))
    t.apply_load   (('2',P ,270))  
    t.apply_load   (('2',P2x,0),('3',P3x,0))  
    return t
# -------------------------------------------------------------------------------------
myTruss_l(1).draw().show()       # 作図用のため(l=1) 作図にPの値は、不要です。
t=myTruss_l(l);t.solve()         # 計算のみ(シンボリックで)
U=sum({k:1/(2*AE)*v1**2*v2  \
        for (k,v1),(_,v2) in zip(t.internal_forces.items(),t.member_lengths.items())} \
        .values())
rep={P2x:0,P3x:0}
print('#', U.diff(P2x).subs(rep).simplify())
print('#', U.diff(P  ).subs(rep).simplify())
print('#', U.diff(P3x).subs(rep).simplify())
# P*l/(4*AE)
# P*l*(1 + 2*sqrt(2))/(4*AE)
# P*l/(2*AE)

111.png

sympyで

The triangle truss 

・ver1.3 sympyのTrussで

# ver1.3 
from sympy.physics.continuum_mechanics.truss import Truss
from sympy import *
var('P,l,A,E',positive=True)
var('P2x,P3x')
def myTruss_l(l):
    def myAdd_member(*args):
        def make_triples(s):
            return (s,s[0],s[1])
        for s in args:
            t.add_member(make_triples(s))      
    t = Truss()
    t.add_node     (                                            ('1',              l,2*sqrt(3)/2*l), \
                              ('2',Rational(1,2)*l,sqrt(3)/2*l),('3',Rational(3,2)*l,  sqrt(3)/2*l), \
                    ('4',0,0),('5',1*l,0)                      ,('6',            2*l,0))
    myAdd_member   ('12','13',  
                    '23',  
                    '24','25','35','36',  
                    '45','56')  
    t.apply_support(('4','pinned'),('6','roller'))
    t.apply_load   (('1',P,270))  
    return t
# -------------------------------------------------------------------------------------
myTruss_l(1).draw().show()       # 作図用のため(l=1) 作図にPの値は、不要です。
t=myTruss_l(l);t.solve()         # 計算のみ(シンボリックのままで)
U=sum({k:1/(2*A*E)*v1**2*v2  \
        for (k,v1),(_,v2) in zip(t.internal_forces.items(),t.member_lengths.items())} \
        .values())
δ=U.diff(P)
print('#',      δ)
print('#',round(δ.subs({P:100*10**3,l:1,A:10*10**(-3)*10*10**(-3),E:200*10**9})*10**3,2))
# 3*P*l/(2*A*E)
# 7.50

111.png

Truss with four member 荷重が水平方向

・ver1.3 sympyのTrussで

# ver1.3 
from sympy.physics.continuum_mechanics.truss import Truss
from sympy import *
var('P,l,A,E',positive=True)
var('P_h')
def myTruss_l(l):
    def myAdd_member(*args):
        def make_triples(s):
            return (s,s[0],s[1])
        for s in args:
            t.add_member(make_triples(s))      
    t = Truss()
    t.add_node     (('2',Rational(1,2)*l,sqrt(3)/2*l),('4',Rational(3,2)*l,  sqrt(3)/2*l), \
                    ('1',0,0)                        ,('3',1*l,0) )
    myAdd_member   ('12','23','24','34')  
    t.apply_support(('1','pinned'),('3','pinned'))
    t.apply_load   (('4',P  ,0))  
    t.apply_load   (('4',P_h,270))  
    return t
# -------------------------------------------------------------------------------------
myTruss_l(1).draw().show()       # 作図用のため(l=1) 作図にPの値は、不要です。
t=myTruss_l(l);t.solve()         # 計算のみ(シンボリックのままで)
U=sum({k:1/(2*A*E)*v1**2*v2  \
        for (k,v1),(_,v2) in zip(t.internal_forces.items(),t.member_lengths.items())} \
        .values())
δ_v=U.diff(P)
δ_h=U.diff(P_h).subs({P_h:0})
print('#',      δ_v)
print('#',      δ_h)
# -------------------------------------------------------------------------------------
rep={P:100*10**3,l:5,A:10*10**(-4),E:206*10**9,P_h:0}
print('#',round((δ_v.subs(rep))*10**3,2))
print('#',round((δ_h.subs(rep))*10**3,2))
# -------------------------------------------------------------------------------------
# 3*l*(2*P + 2*sqrt(3)*P_h/3)/(2*A*E)
# sqrt(3)*P*l/(A*E)
# 7.28
# 4.20


111.png

Truss with four member 荷重が鉛直方向

・ver1.3 sympyのTrussで

# ver1.3
from sympy.physics.continuum_mechanics.truss import Truss
from sympy import *
var('P,l,A,E',positive=True)
def myTruss_l(l):
    def myAdd_member(*args):
        def make_triples(s):
            return (s,s[0],s[1])
        for s in args:
            t.add_member(make_triples(s))      
    t = Truss()
    t.add_node     (('A',Rational(1,2)*l,sqrt(3)/2*l),('B',Rational(3,2)*l,  sqrt(3)/2*l), \
                    ('C',0,0)                        ,('D',1*l,0) )
    myAdd_member   ('AB','AC','AD','BD')  
    t.apply_support(('C','pinned'),('D','pinned'))
    t.apply_load   (('B',P,270))  
    return t
# -------------------------------------------------------------------------------------
myTruss_l(1).draw().show()       # 作図用のため(l=1) 作図にPの値は、不要です。
t =myTruss_l(l);t.solve()        # 計算のみ(シンボリックのままで)
print("#",t.internal_forces)
PL=max({k:abs(v1) for (k,v1) in t.internal_forces.items()} .values())
print("#",PL)
# -------------------------------------------------------------------------------------
var('a,σy')
print("#",round(solve(Eq(PL,(a**2*σy).subs({a:10*10**(-3)*10**(-3),σy:200*10**9})),P)[0],1))
# -------------------------------------------------------------------------------------
# {'AB': sqrt(3)*P/3, 'AC': sqrt(3)*P/3, 'AD': -sqrt(3)*P/3, 'BD': -2*sqrt(3)*P/3}
# 2*sqrt(3)*P/3
# 17.3

111.png

いつもの? sympyの実行環境と 参考のおすすめです。

(テンプレート)

いつもと違うおすすめです。

Qiita内

・作業中:いろいろシリーズ(sympy)

文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?