Vigas

619 days ago by sevillad

Viga con dos apoyos en los extremos y varias cargas uniformes

(Siempre ignoro de qué tipo son las restricciones de los extremos)

L = 10 # longitud de la viga C = [(2000,2,1),(5000,4,5)] # cargas: lista de triples (fuerza,inicio,longitud) sin superp. 
       
def calcula_fuerzas_extremos(long,cargas): # calculamos fuerza positiva en cada extremo mirando el momento en el otro extremo var('Ri, Rd') eqd = -Ri*L==sum([cc[0]*(L-cc[1]-cc[2]/2) for cc in cargas]) eqi = -Rd*L==sum([cc[0]*(cc[1]+cc[2]/2) for cc in cargas]) #print eqd #print eqi s = solve([eqd,eqi],[Ri,Rd],solution_dict=True)[0] return s calcula_fuerzas_extremos(L,C) 
       
{Ri: -3250, Rd: -3750}
{Ri: -3250, Rd: -3750}
def dibuja_rectangulo_horizontal(x1,x2,ymin,h,t,c="blue",ct="white"): '''Dibuja líneas a distancia 0.02 y texto en medio''' p = Graphics() y = ymin while y<ymin+h: p += line([(x1,y),(x2,y)],color=c,aspect_ratio=1,axes=False) y += 0.01 p += text(t,((x1+x2)/2,ymin+h/2.2),color=ct,fontsize=15,fontweight=1000) # 2.2 en vez de 2 para bajarlo un poco return p def dibuja_diag_cargas(long,cargas,fsize=10): p = dibuja_rectangulo_horizontal(0,long,-0.1,0.1,"",c="black") n = len(cargas) colores = [colormaps['rainbow'](i/n)[0:3] for i in [0..n-1]] if n>1 else [(0,0,1)] for cc,col in zip(cargas,colores): altura = cc[0]/cc[2]/1000 # 1000 N/u = 1 unidad de altura p += dibuja_rectangulo_horizontal(cc[1],cc[1]+cc[2],0,altura,str(cc[0])+" N",c=Color(*col)) pts = sorted(sum([[cc[1],cc[1]+cc[2]] for cc in cargas],[0,L])) for i in range(len(pts)-1): p += text(str(pts[i+1]-pts[i]),((pts[i+1]+pts[i])/2,-0.3),fontsize=12,figsize=fsize) s = calcula_fuerzas_extremos(L,C) p += arrow2d((0,-L/5),(0,-0.2)) + text(str(-s[Ri])+" N",(0.8,-L/8),fontsize=15,fontweight=1000) p += arrow2d((L,-L/5),(L,-0.2)) + text(str(-s[Rd])+" N",(L-0.8,-L/8),fontsize=15,fontweight=1000) return p #dibuja_rectangulo_horizontal(4,18,2,0.5).show() #dibuja_diag_cargas(10,[(10,1,1)]) dibuja_diag_cargas(L,C,fsize=9) 
       
def calcula_integraltrozos(trozos,valinic=0): '''Integra la función a trozos sin discontinuidades''' '''trozos: lista de ((a,b),f) que cubrem toda la viga sin solapar; quizás desordenados''' '''valinic: valor de la integral en el primer punto''' '''devuelve una lista de ((a,b),f)''' trozospendientes = list(trozos) resul = [] while trozospendientes<>[]: primervalor = 0 if resul==[] else min([tt[0][0] for tt in trozospendientes]) ab,f = trozospendientes.pop([i for i in range(len(trozospendientes)) if trozospendientes[i][0][0]==primervalor][0]) integ = integral(f,x) vald = integ(x=ab[0]) vali = valinic if resul==[] else resul[-1][1](x=resul[-1][0][1]) integ += vali-vald resul.append(((ab[0],ab[1]),integ)) return resul rr = [((0,1),0),((1,2),100),((2,3),0),((3,4),200),((4,6),0),((6,8),560),((8,12),0)] qq = calcula_integraltrozos(rr,-1000) plot(piecewise(rr),thickness=2)+plot(piecewise(qq),color="red",thickness=2,figsize=4) 
       
def calcula_funcion_cargas(long,cargas): '''Calcula todos los trozos para la función a trozos de las cargas''' trozos = [((cc[1],cc[1]+cc[2]),cc[0]/cc[2]) for cc in cargas] iniciotrozos = [cc[1] for cc in cargas]+[long] pts = sorted(list(set(flatten([tt[0] for tt in trozos])))+[0,long]) for i in pts[:-1]: if iniciotrozos.count(i)==0: trozos.append(((i,min([j for j in iniciotrozos if j>i])),0)) return trozos def calcula_funcion_fuerzas(long,cargas): s = calcula_fuerzas_extremos(long,cargas) return calcula_integraltrozos(calcula_funcion_cargas(long,cargas),valinic=s[Ri]) def calcula_funcion_momentos(long,cargas): f = calcula_funcion_fuerzas(long,cargas) return calcula_integraltrozos(f,0) f = calcula_funcion_cargas(L,C) F = calcula_funcion_fuerzas(L,C) FF = calcula_funcion_momentos(L,C) f; print; F; print; FF; plot(piecewise(f),thickness=2,figsize=4)+plot(piecewise(F),thickness=2,color="red",figsize=4)+plot(piecewise(FF),thickness=2,color="green",figsize=4) 
       
[((2, 3), 2000), ((4, 9), 1000), ((0, 2), 0), ((3, 4), 0), ((9, 10), 0)]

[((0, 2), -3250),
 ((2, 3), 2000*x - 7250),
 ((3, 4), -1250),
 ((4, 9), 1000*x - 5250),
 ((9, 10), 3750)]

[((0, 2), -3250*x),
 ((2, 3), 1000*x^2 - 7250*x + 4000),
 ((3, 4), -1250*x - 5000),
 ((4, 9), 500*x^2 - 5250*x + 3000),
 ((9, 10), 3750*x - 37500)]
[((2, 3), 2000), ((4, 9), 1000), ((0, 2), 0), ((3, 4), 0), ((9, 10), 0)]

[((0, 2), -3250),
 ((2, 3), 2000*x - 7250),
 ((3, 4), -1250),
 ((4, 9), 1000*x - 5250),
 ((9, 10), 3750)]

[((0, 2), -3250*x),
 ((2, 3), 1000*x^2 - 7250*x + 4000),
 ((3, 4), -1250*x - 5000),
 ((4, 9), 500*x^2 - 5250*x + 3000),
 ((9, 10), 3750*x - 37500)]