meta data for this page
  •  

This is an old revision of the document!


Besenstiel -- gruppe327

Der Versuch wurde durchgeführt von: Bennet Edelburg und Lars Krieger
Die Wiki-Seite wurde angelegt am: 3 January 2021 13:34

Diese Seiten

Diese Seite und ihre Unterseiten sind Ihr Bereich im APwiki für die Bearbeitung des Heim-Versuchs “Kippender Besenstiel”. Er soll die Funktion übernehmen, die im Präsenzpraktikum das Heft hat. Das heißt, es ist Ihre Logbuch für das, was Sie konkret experimentell und bei der Programmierung durchführen.

Legen Sie Fotos ab, notieren Sie Messwerte, laden sie ihr Programm hoch. Form und Formatierung sind dabei zweitrangig.

Damit dieser Bereich diese Aufgabe erfüllen kann, haben wir ihn mit speziellen Zugriffsrechten ausgestattet:

  1. Ihre Gruppe hat das exklusive Schreibrecht für diese Seite.
  2. Die Seite ist nur für Ihre Gruppe, die Tutoren und die Praktikumsleitung einsehbar.

Unten auf dieser Seite finden Sie einen Abschnitt “Diskussion”. Über diesen Abschnitt findet die Kommunikation mit Ihrem Tutor statt. Sie oder er wird Ihnen dort Rückmeldung zu Ihrem Versuchsbericht geben.

Hier im Wiki gibt es Hinweise für die Formatierung ihres Versuchsberichts mit Latex. Den Versuchsbericht geben Sie dann im Ilias ab.

Alles, was beim ersten Aufruf auf der Seite zu lesen ist, soll Ihnen den Start erleichtern. Sie können es nach Belieben löschen und durch Ihre eigenen inhalte ersetzen.

Computerprogramm

Unser Computerprogramm für die numerische Lösung:

numerical_solution.cpp
  1. #include <fstream>
  2. #include <math.h>
  3. #include <string>
  4. #include <vector>
  5.  
  6. class args {
  7. public:
  8. double dt = 1e-5;
  9. double yp0 = 0;
  10. double tau;
  11. double g = 9.81;
  12. args(double l) {
  13. tau = sqrt(2 * l / (3 * g));
  14. }
  15. };
  16.  
  17. //function for solving an one dimensional differential equation
  18. std::vector<std::vector<double>> differentialSolve(double f(double, double, args), double t0, double tmax, double y0, args Args) {
  19. int stepNumber = (int)(tmax - t0) / Args.dt;
  20. double h = Args.dt;
  21. std::vector<std::vector<double>> points; //vector of three elementric vectors. (t,phi,dphi/dt)
  22. points.push_back({t0, y0, Args.yp0});
  23. if (t0 < tmax) {
  24. for (int i = 0; i < stepNumber; i++) {
  25. double newPhi = points[i][1] + h * points[i][2];
  26. //for greater angles it doesn't make sense
  27. if (newPhi >= M_PI / 2) {
  28. break;
  29. }
  30. points.push_back({points[i][0] + h, newPhi, points[i][2] + h * f(points[i][0], points[i][1], Args)});
  31. }
  32. }
  33. return points;
  34. }
  35.  
  36. //the second derivitative of phi based on phi
  37. double phiPP(double t, double phi, args Args) {
  38. return sin(phi) / pow(Args.tau, 2);
  39. }
  40.  
  41. //function for writing a string to a csv file
  42. int writeTextToCsv(std::string text, std::string filename) {
  43. std::ofstream fileStream;
  44. fileStream.open(filename + ".csv");
  45. fileStream << text;
  46. fileStream.close();
  47. return 0;
  48. }
  49.  
  50. int main() {
  51. int tMax = 100;
  52. args Args(1.45);
  53. std::vector<std::vector<double>> angles = differentialSolve(phiPP, 0, tMax, 0.25, Args);
  54. std::string outputString = "t\tphi\n";
  55. for (int i = 0; i < angles.size(); i++) {
  56. outputString += std::to_string(angles[i][0]) + "\t";
  57. outputString += std::to_string(angles[i][1]) + "\n";
  58. }
  59. writeTextToCsv(outputString, "Winkel_in_Abhängigkeit_der_Zeit_bei_phi0=0.25");
  60.  
  61. std::vector<std::vector<double>> fallTimePhi0;
  62. for (double phi0 = 0.01; phi0 < M_PI / 2; phi0 += 0.001) {
  63. std::vector<std::vector<double>> angles = differentialSolve(phiPP, 0, tMax, phi0, Args);
  64. fallTimePhi0.push_back({phi0, angles[angles.size() - 1][0]});
  65. }
  66. std::string outputStringPhi0 = "phi0\tt_fall\n";
  67. for (int i = 0; i < fallTimePhi0.size(); i++) {
  68. outputStringPhi0 += std::to_string(fallTimePhi0[i][0]) + "\t";
  69. outputStringPhi0 += std::to_string(fallTimePhi0[i][1]) + "\n";
  70. }
  71. writeTextToCsv(outputStringPhi0, "Fallzeit_in_Abhängigkeit_des_Startwinkels");
  72.  
  73. std::vector<std::vector<double>> fallTimeDeltaT;
  74. for (Args.dt = 1; Args.dt > 1e-6; Args.dt *= 0.5) {
  75. std::vector<std::vector<double>> angles = differentialSolve(phiPP, 0, tMax, 0.25, Args);
  76. fallTimeDeltaT.push_back({Args.dt, angles[angles.size() - 1][0]});
  77. }
  78. std::string outputStringDeltaT = "delta_t\tt_fall\n";
  79. for (int i = 0; i < fallTimeDeltaT.size(); i++) {
  80. outputStringDeltaT += std::to_string(fallTimeDeltaT[i][0]) + "\t";
  81. outputStringDeltaT += std::to_string(fallTimeDeltaT[i][1]) + "\n";
  82. }
  83. writeTextToCsv(outputStringDeltaT, "Fallzeit_in_Abhängigkeit_der_Länge_der_Zeitschritte");
  84.  
  85. //now the part for the comparison of the numerical solution and the measured data
  86.  
  87. args ArgsB1(1); //the length of the broom
  88. float phi01[] = {M_PI / 4}; //the initial angles
  89. std::vector<std::vector<double>> fallTimePhi01;
  90. for (int i = 0; i < sizeof(phi01) / sizeof(phi01[0]); i++) {
  91. std::vector<std::vector<double>> angles = differentialSolve(phiPP, 0, tMax, phi01[i], ArgsB1);
  92. fallTimePhi01.push_back({phi01[i], angles[angles.size() - 1][0]});
  93. }
  94. std::string outputStringPhi01 = "phi0\tt_fall\n";
  95. for (int i = 0; i < fallTimePhi01.size(); i++) {
  96. outputStringPhi01 += std::to_string(fallTimePhi01[i][0]) + "\t";
  97. outputStringPhi01 += std::to_string(fallTimePhi01[i][1]) + "\n";
  98. }
  99. writeTextToCsv(outputStringPhi01, "Fallzeit_in_Abhängigkeit_des_Startwinkels_zu_Besen1");
  100.  
  101. args ArgsB2(1); //the length of the broom
  102. float phi02[] = {M_PI / 4}; //the initial angles
  103. std::vector<std::vector<double>> fallTimePhi02;
  104. for (int i = 0; i < sizeof(phi02) / sizeof(phi02[0]); i++) {
  105. std::vector<std::vector<double>> angles = differentialSolve(phiPP, 0, tMax, phi02[i], ArgsB2);
  106. fallTimePhi02.push_back({phi02[i], angles[angles.size() - 1][0]});
  107. }
  108. std::string outputStringPhi02 = "phi0\tt_fall\n";
  109. for (int i = 0; i < fallTimePhi02.size(); i++) {
  110. outputStringPhi02 += std::to_string(fallTimePhi02[i][0]) + "\t";
  111. outputStringPhi02 += std::to_string(fallTimePhi02[i][1]) + "\n";
  112. }
  113. writeTextToCsv(outputStringPhi02, "Fallzeit_in_Abhängigkeit_des_Startwinkels_zu_Besen2");
  114.  
  115. return 0;
  116. }

Bilder einbinden

Ihr Versuchsaufbau sollte so beschrieben sein, dass er für sich stehend verständlich ist - gerne mit einem Foto.

Ein Bild laden Sie ins Wiki, indem Sie im Editor in der Knopfleiste auf den kleinen Bildrahmen klicken. In einem neuen Fenster öffnet sich ein Dialog mit einem Dateibaum. Dort navigieren Sie zu “Ihrer” Baustelle (a_mechanik:kippender_besenstiel:gruppenseiten:gruppe327). Anschließend nutzen Sie den Dialog auf der rechten Seite, um Ihr Bild hochzuladen. Mit einem Klick auf die Zeile ihres Bildes erzeugen Sie im Hauptfenster einen Befehl, der das Bild lädt.

Im einfachsten Fall landet ein Bild direkt an der Stelle im Text, an der Sie es eingefügt haben (Siehe de:wiki:syntax#bilder_und_andere_dateien. Hier gibt es einen Überblick, was sonst noch möglich ist.

Tabellen

Für eine Tabelle mit Ihren Messwerten gibt es im oben im Editfenster des Wikis eine Hilfsfunktion. Sie versteckt sich hinter einem Knopf der so aussieht, wie ein hellblauer Taschenrechner.

Syntax und Funktionen im Wiki

You could leave a comment if you were logged in.