1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| def boucle_Newton_Raphson(etat,poi,pen):
geometrie = False
forme_objectif = 1.4
compteur = 0
while not(geometrie):
compteur+=1
fini = False
compt = 0
while not(fini):
compt += 1
### calcul de K et des efforts internes
(KK_glob,ff_glob) = calcule_K_f(etat,liste_elems)
### calcul des efforts externes
# cas simple 100 N par noeud vers le bas
f_ext = matrix(zeros((2*nb_noeuds,1)))
for i in range(nb_noeuds):
f_ext[2*i+1,0] = - carac_ml*dx
### Pendules
force_actuelle=[0]
f_pendule = matrix(zeros((2*nb_noeuds,1)))
for i in range (nb_pendules):
f_pendule[i*2*npen+1,0]= poi * carac_ml*ltot / nb_pendules - pen
force_actuelle.append(f_pendule[i*2*npen+1,0])
#f_pendule = matrix(zeros((2*nb_noeuds,1)))
#for i in range(nb_pendules):
#f_pendule[i*2*npen+1,0] = - f_ext[2*i+1,0] * npen * poi - pen
# for n in range(nb_pendules):
# f_pendule[2*((1+n)*int(nb_noeuds/(nb_pendules+1)))+1,0] = - f_ext[2*((1+n)*int(nb_noeuds/(nb_pendules+1)))+1,0] * nb_noeuds/(nb_pendules+1) * poi/2 - pen
### reduction du systeme
(K_red,f_red) = systeme_reduit(KK_glob,ff_glob+f_ext+f_pendule)#+f_inverse)#f_surcharge)
### resolution
u_compl = deplacement_complet(K_red,f_red)
### affichage
print("Calcul "+str(compt)+" -- min(etat)="+str(min(etat)[0,0]))
### test de convergence
if max(abs(u_compl))<1e-10:
fini = True
# limitation des deplacements si necessaire
tol = 0.5
if max(abs(u_compl)) > tol:
u_compl *= tol/max(abs(u_compl))[0,0]
#trace graphe
#trace_graphe('b')
#draw()
### mise a jour etat
etat = etat + u_compl
for i in range(nb_pendules):
print(etat[i*2*npen+1,0])
##premiere boucle
for i in range(nb_pendules):
if etat[i*2*npen+1,0] > (forme_objectif-0.1) and etat(i*2*npen+1,0) < (forme_objectif+0.1):
geometrie = True
else :
geometrie = False
fini = False
for i in range (nb_pendules):
print (i)
if etat[i*2*npen+1,0] > forme_objectif:
if etat[i*2*npen+1,0]-forme_objectif > 1:
force_actuelle[i]-=0.1
else:
if etat[i*2*npen+1,0]-forme_objectif > .3 :
force_actuelle[i]-=0.05
else:
force_actuelle[i]-=0.0001
else:
if etat[i*2*npen+1,0]-forme_objectif < 1:
force_actuelle[i]+=0.1
else:
if etat[i*2*npen+1,0]-forme_objectif < .3 :
force_actuelle[i]+=0.05
else:
force_actuelle[i]+=0.0001
print("1",compt, force_actuelle[i], etat[i*2*npen+1,0],0)
return etat |
Partager