Advertisement
Guest User

Untitled

a guest
May 26th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.61 KB | None | 0 0
  1. # Modulimport
  2. import matplotlib.pyplot as plt
  3. from math import floor
  4.  
  5.  
  6. # Diese Funktion startet die Eingabe der Rahmenbedingungen:
  7. # Länge des Trägers[m], Ordinate[m], Kraft[kN].
  8. def start(L, lasten):
  9.    
  10.     # Loop, um die Länge des Trägers zu erhalten
  11.     while True:
  12.         # Eingabe der Länge des Trägers
  13.         input_ = input('Länge des Trägers [m]: ')
  14.  
  15.         # Sicherstellen, dass die eingegebene Länge eine gültige Zahl ist,
  16.         # indem in eine Gleitkommazahl konvertiert wird.
  17.         # Schlägt als ValueError fehl, wenn bspw. ein String eingegeben wurde.
  18.         try:
  19.             L = float(input_)
  20.         except ValueError:
  21.             print('Der eingegebene Wert ist ungültig, bitte wiederholen')
  22.             continue    # der Befehl continue springt wieder zum Anfang.
  23.  
  24.         # Überprüft auf negative Länge oder 0
  25.         if (L <= 0):
  26.             print('Ohnen \'nen Träger können wir uns das hier sparen.')
  27.             continue
  28.         else:
  29.             break
  30.  
  31.     # Abfrage der Einzellasten.
  32.     print(('Gib beliebig viele Einzellasten in der Form '
  33.            '\"Ordinate [m], Kraft [kN]\" ein, beende mit leerer Eingabe:'))
  34.  
  35.     # Endlose Schleife
  36.     while True:
  37.         # Erfragt neue Kraft, löscht sofort Leerzeichen
  38.  
  39.         input_ = input(f'Kraft {len(lasten) + 1} [m, kN]: ')
  40.  
  41.         if input_ == "":
  42.             break
  43.         else:
  44.             input_ = input_.strip('')
  45.  
  46.         # Erstellt ein Tupel 'last' bestehend aus den variablen 'ordinate' und
  47.         # 'kraft', indem es den String 'input_' am ',' teilt.
  48.         # Verursacht Fehlermeldung, wenn nicht genaue zwei Elemente entstehen.
  49.         # In dem Fall kann die Eingabe wiederholt werden.
  50.         try:
  51.             last = (ordinate, kraft) = input_.split(',')
  52.         except ValueError:
  53.             try:
  54.                 if ordinate is None or kraft is None:
  55.                     break
  56.                 else:
  57.                     print('Eingabe konnte nicht erkannt werden, '
  58.                           'bitte wiederholen.')
  59.                     continue
  60.             except:
  61.                 print('Eingabe konnte nicht erkannt werden, '
  62.                       'bitte wiederholen.')
  63.                 continue
  64.  
  65.         # Sicherstellen, dass die eingegebenen Lasten auch Zahlen sind,
  66.         # el = ein Element des Tupels
  67.         # float(el) versucht das jeweilige Element in ein Float umzuwandeln.
  68.         # Wenn dies nicht gelingt, tritt die Exception ein, und die Eingabe
  69.         # kann wiederholt werden.
  70.         try:
  71.             tuple(float(el) for el in last)
  72.         except ValueError:
  73.             print('Eine Eingabe war keine Zahl, bitte wiederholen.')
  74.             continue
  75.  
  76.         # Sicherstellen, dass die Eingegebene ordinate nicht außerhalb des
  77.         # Trägers liegt
  78.         if (float(ordinate) > L):
  79.             print('Ordinate außerhalb des Trägers, bitte wiederholen.')
  80.             continue
  81.  
  82.         # Wenn negative Kräfte erlaubt sind, auskommentieren.
  83.         # Überprüft die Eingabe auf negative Kräfte, 0 ist okay
  84.         if (float(kraft) < 0):
  85.             print('Negative Kräfte sind nicht erlaubt, bitte wiederholen.')
  86.             continue
  87.  
  88.         # Alles gut, wird der Liste 'lasten' als Float hinzugefügt
  89.         lasten.append(tuple([float(i) for i in last]))
  90.     lasten.sort(key=(lambda m: m[0]))
  91.  
  92.     print('Eingabe abgeschlossen')
  93.     return L, lasten
  94.  
  95. # Diese Funktion berechnet die Auflagerkräfte.
  96. def Auflagerkräfte(L, lasten):
  97.  
  98.     # Auflagerkräfte A und B initialisiert als float
  99.     A, B = 0.0, 0.0
  100.  
  101.     # Berechnet die Auflagerkräfte A und B, indem die Belastung durch jede
  102.     # Einzellast auf die jeweiligen Lager summiert wird
  103.     for l in lasten:
  104.         A += l[1] * (1 - l[0] / L)
  105.         B += l[1] * (l[0] / L)
  106.  
  107.     return A, B
  108.  
  109. # Diese Funktion berechnet den Querkraftverlauf.
  110. def Querkraftverlauf(L, lasten, A, B):
  111.    
  112.     # Initialisiert die Liste mit dem ersten Punkt im Auflager A
  113.     # an Länge 0
  114.     verlauf = [(0, A)]
  115.  
  116.     # Iteriert durch den Index der Liste lasten
  117.     for i in range(1, len(lasten) + 1):
  118.         # Try-Except loop, um den IndexError zu behandeln,
  119.         # der Eintritt, wenn die Schleife am letzten Index ankommt.
  120.         try:
  121.             Q = verlauf[i - 1][1] - lasten[i - 1][1]
  122.             verlauf.append((lasten[i-1][0], Q))
  123.         except IndexError:
  124.             verlauf.append((L, B))
  125.             break
  126.     verlauf.append((L, 0))
  127.  
  128.     return verlauf
  129.  
  130. # Diese Funktion berechnet den Biegemomentenverlauf
  131. def Momentverlauf(L, lasten, A, B, Q):
  132.  
  133.     # der Verlauf des Biegemoments initialisiert mit erster Last
  134.     verlauf = [
  135.         (0, 0),
  136.         (lasten[0][0], Q[0][1] * lasten[0][0])
  137.         ]
  138.  
  139.     # iteriert durch alle lasten und errechnet das Biegemoment
  140.     for i in range(2, len(lasten) + 1):
  141.         try:
  142.             M = Q[i-1][1] * (lasten[i-1][0]-lasten[i-2][0]) + verlauf[i-1][1]
  143.             verlauf.append((lasten[i-1][0], M))
  144.         except IndexError:
  145.             M = Q[i-1][1] * (L - lasten[i-1][0]) + verlauf[i-1][1]
  146.             verlauf.append((lasten[i-1][0], M))
  147.     # Das letzte Biegemoment auf Auflager B ist in unserer Konfig. immer 0
  148.     verlauf.append((L, 0))
  149.  
  150.     return verlauf
  151.  
  152. # Diese Funktion zeichnet eine Tabelle in das Konsolenfenster
  153. def printList(list_, headers=["x", "y"], dec=3):
  154.  
  155.     # Berechnet die längste Zahl, um die Breite der Spalte zu errechnen
  156.     width = len(str(max([round(y, dec) for (x, y) in list_])))
  157.  
  158.     # Erstellt die Kopfzeile mit den Überschriften aus headers
  159.     h1 = (" " * 2 + headers[0].ljust(width + 2) + "|" +
  160.           " " * 2 + headers[1].ljust(width + 2))
  161.     h2 = ("-" * floor(len(h1)/2)) + "+" + "-" * floor(len(h1)/2)
  162.  
  163.     # Erstellt den Rest der Tabelle Zeile für Zeile
  164.     table = "\n".join([h1, h2]) + "\n"
  165.     for (x, y) in list_:
  166.         table += (" " * 2 + str(x).ljust(width + 2) + "|" +
  167.                   " " * (1 if y < 0 else 2) + str(round(y, dec)).ljust(width) + "\n")
  168.  
  169.     # Und ab in die Konsole damit
  170.     print(table)
  171.  
  172.  
  173. # Länge des Trägers und Liste der Einzellasten
  174. L = 0
  175. lasten = []
  176.  
  177. # Eingabe der Parameter.
  178. L, lasten = start(L, lasten)
  179.  
  180. # Berechnung der Auflagerkräfte A und B
  181. A, B = Auflagerkräfte(L, lasten)
  182. print(('Auflagerkräfte: \n'
  183.         'A: ' + str(round(A, 3)) + " kN \n"
  184.         'B: ' + str(round(B, 3)) + " kN \n"))
  185.  
  186. # Berechnung des Querkraftverlaufs Q
  187. print("Querkraft:")
  188. Q = Querkraftverlauf(L, lasten, A, B)
  189. printList(Q, ["L [m]", "Q [kN]"], 3)
  190.  
  191. # Berechnung des Momentverlaufs M
  192. print("Biegemoment:")
  193. M = Momentverlauf(L, lasten, A, B, Q)
  194. printList(M, ["L [m]", "M [kNm]"], 3)
  195.  
  196. # Maximales Biegemoment errechnet anhand einer lambda-Funktion,
  197. # die das zweite Element des Tupels vergleicht
  198. M_max = max(M, key=(lambda m: m[1]))
  199. print("Max. Biegemoment: " + str(round(M_max[1], 3)) + " kNm bei " +
  200.           str(M_max[0]) + " m")
  201.  
  202. # Gerade für den Träger
  203. Tx, Ty = [0, L], [0, 0]
  204.  
  205. # Formt die Tupel (Px, Py) in jeweils eine Liste für die
  206. # x- und y-Komponente um
  207. Q = [(0, 0)] + Q
  208. Qx, Qy = [list(t) for t in zip(*Q)]
  209. Mx, My = [list(t) for t in zip(*M)]
  210.  
  211. # Plottet den Träger
  212. plt.plot(Tx, Ty)
  213.  
  214. # Plottet das Biegemoment mit Beschriftung
  215. plt.plot(Mx, My, label='Biegemoment')
  216.  
  217. # Plottet den Querkraftverlauf stufenförmig mit Beschriftung
  218. plt.step(Qx, Qy, where='post', label="Querkraft")
  219.  
  220. # Spiegelt die y-Achse
  221. plt.gca().invert_yaxis()
  222.  
  223. # Beschriftung hinzufügen
  224. plt.title("Schnittgrößenverlauf")
  225. plt.legend(loc="upper left")
  226. # plt.xlabel("Bezeichnung der x-Achse")
  227. # plt.ylabel("Bezeichnung der y-Achse")
  228.  
  229. # Zeigt das Bild an
  230. plt.show()
  231.  
  232. print('fertig')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement