・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)
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
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
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
いつもの? sympyの実行環境と 参考のおすすめです。
いつもと違うおすすめです。
Qiita内
・作業中:いろいろシリーズ(sympy)
文献



