diff --git a/Uebung06/Fachwerk.svg b/Uebung06/Fachwerk.svg new file mode 100644 index 0000000000000000000000000000000000000000..c93dc9d40bc0982a20d96847f8456963f61ba0ca --- /dev/null +++ b/Uebung06/Fachwerk.svg @@ -0,0 +1,712 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="145.42078mm" + height="139.15825mm" + viewBox="0 0 145.42078 139.15825" + version="1.1" + id="svg8" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + sodipodi:docname="Fachwerk.svg"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="marker5434" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path5432" /> + </marker> + <marker + style="overflow:visible" + id="marker4836" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4834" /> + </marker> + <marker + style="overflow:visible" + id="marker4682" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4680" /> + </marker> + <marker + style="overflow:visible" + id="marker4072" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4070" /> + </marker> + <marker + style="overflow:visible" + id="marker3918" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path3916" /> + </marker> + <marker + style="overflow:visible" + id="marker3764" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path3762" /> + </marker> + <marker + style="overflow:visible" + id="marker3194" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path3192" /> + </marker> + <marker + style="overflow:visible" + id="marker1505" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1503" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-4" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-9" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-75" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-7" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-2" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-6" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-4" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-3" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-24" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-4" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-9" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-6" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-4" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-3" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-4-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-3-1" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-9" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-4" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-98" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-0" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-3" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-2" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-32" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-2" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="367.50041" + inkscape:cy="242.66448" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="2560" + inkscape:window-height="1377" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-36.427618,-42.042205)"> + <circle + style="fill:#0084d1;stroke:#ffffff;stroke-width:0.686001;stroke-linecap:square;paint-order:fill markers stroke" + id="path833" + cx="99.974709" + cy="66.901787" + r="5" /> + <circle + style="fill:#0084d1;stroke:#ffffff;stroke-width:0.686001;stroke-linecap:square;paint-order:fill markers stroke" + id="path833-5" + cx="56.769142" + cy="156.94662" + r="5" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker3918);marker-end:url(#marker4072)" + d="M 92.337215,80.951989 62.707371,139.42319" + id="path856" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker3764);marker-end:url(#marker3194)" + d="m 110.56188,80.557032 56.824,62.125098" + id="path858" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker4682);marker-end:url(#marker5434)" + d="m 73.522905,156.79165 87.833735,-0.18174" + id="path864" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5)" + d="m 61.488075,156.71699 h 7.74852" + id="path2060-5" /> + <path + style="fill:none;stroke:#00ff00;stroke-width:0.497778;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-7)" + d="M 41.074737,157.01864 H 51.112664" + id="path2060-2" /> + <path + style="fill:none;stroke:#00ff00;stroke-width:0.499818;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-4)" + d="m 56.547253,172.40094 -0.0852,-10.02767" + id="path2060-27" /> + <path + style="fill:none;stroke:#00ff00;stroke-width:0.588333;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-4-0)" + d="m 176.94833,172.39311 -0.0908,-9.85558" + id="path2060-27-6" /> + <path + style="fill:none;stroke:#0000ff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4836)" + d="m 89.013391,42.144344 8.882441,19.843749" + id="path4678" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-9)" + d="m 56.744906,152.33881 2.811859,-7.22033" + id="path2060-5-0" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-98)" + d="m 175.21704,152.43947 -5.29323,-5.65873" + id="path2060-5-2" + inkscape:transform-center-x="-0.25583291" + inkscape:transform-center-y="0.026987051" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-0)" + d="m 101.62252,71.023092 5.36285,5.592804" + id="path2060-5-6" + inkscape:transform-center-x="-3.4607266" + inkscape:transform-center-y="9.0625188" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-2)" + d="m 98.122344,71.264933 -3.544229,6.890428" + id="path2060-5-7" + inkscape:transform-center-x="0.20076482" + inkscape:transform-center-y="-0.62555441" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-1)" + d="m 171.87145,156.48117 -7.74851,0.0106" + id="path2060-5-1" /> + <circle + style="fill:#0084d1;stroke:#ffffff;stroke-width:0.686001;stroke-linecap:square;paint-order:fill markers stroke" + id="path833-6" + cx="176.50539" + cy="156.79005" + r="5" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="72.964592" + y="106.50691" + id="text8039"><tspan + sodipodi:role="line" + id="tspan8037" + x="72.964592" + y="106.50691" + style="stroke-width:0.264583">S<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8041">1</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="144.0696" + y="109.06688" + id="text8039-9"><tspan + id="tspan8037-7" + x="144.0696" + y="109.06688" + style="stroke-width:0.264583" + sodipodi:role="line">S<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8064">2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="112.46497" + y="161.0508" + id="text8039-8"><tspan + sodipodi:role="line" + id="tspan8037-3" + x="112.46497" + y="161.0508" + style="stroke-width:0.264583">S<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8076">3</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="54.923889" + y="157.62219" + id="text8080" + inkscape:transform-center-x="1.3363476" + inkscape:transform-center-y="0.13363476"><tspan + sodipodi:role="line" + id="tspan8078" + x="54.923889" + y="157.62219" + style="stroke-width:0.264583">K<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8128">1</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="98.198738" + y="68.120117" + id="text8084"><tspan + sodipodi:role="line" + id="tspan8082" + x="98.198738" + y="68.120117" + style="stroke-width:0.264583">K<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8132">2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="174.42764" + y="157.78944" + id="text8088"><tspan + sodipodi:role="line" + id="tspan8086" + x="174.42764" + y="157.78944" + style="stroke-width:0.264583">K<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8138">3</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="56.260235" + y="142.32103" + id="text8092"><tspan + sodipodi:role="line" + id="tspan8090" + x="56.260235" + y="142.32103" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8136">S1</tspan></tspan><tspan + sodipodi:role="line" + x="56.260235" + y="146.73074" + style="stroke-width:0.264583" + id="tspan8094" /></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="108.31097" + y="76.505898" + id="text8098"><tspan + sodipodi:role="line" + id="tspan8096" + x="108.31097" + y="76.505898" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8130">S2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="159.69356" + y="160.09445" + id="text8102"><tspan + sodipodi:role="line" + id="tspan8100" + x="159.69356" + y="160.09445" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8134">S3</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="83.922638" + y="50.380302" + id="text8106"><tspan + sodipodi:role="line" + id="tspan8104" + x="83.922638" + y="50.380302" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8126">ext</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="36.081387" + y="157.82266" + id="text8110"><tspan + sodipodi:role="line" + id="tspan8108" + x="36.081387" + y="157.82266" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8120">L1</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="54.65662" + y="175.46245" + id="text8114"><tspan + sodipodi:role="line" + id="tspan8112" + x="54.65662" + y="175.46245" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8122">L2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="175.06154" + y="175.46243" + id="text8118"><tspan + sodipodi:role="line" + id="tspan8116" + x="175.06154" + y="175.46243" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8124">L3</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="167.18599" + y="144.4406" + id="text8098-1"><tspan + sodipodi:role="line" + id="tspan8096-4" + x="167.18599" + y="144.4406" + style="stroke-width:0.264583">F<tspan + style="font-size:2.29305px;baseline-shift:sub;stroke-width:0.264583" + id="tspan8130-9">S2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="68.540581" + y="159.27406" + id="text8102-6"><tspan + sodipodi:role="line" + id="tspan8100-4" + x="68.540581" + y="159.27406" + style="stroke-width:0.264583">F<tspan + style="font-size:2.29305px;baseline-shift:sub;stroke-width:0.264583" + id="tspan8134-2">S3</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="87.797981" + y="79.360474" + id="text8092-5"><tspan + sodipodi:role="line" + id="tspan8090-8" + x="87.797981" + y="79.360474" + style="stroke-width:0.264583">F<tspan + style="font-size:2.29305px;baseline-shift:sub;stroke-width:0.264583" + id="tspan8136-7">S1</tspan></tspan><tspan + sodipodi:role="line" + x="87.797981" + y="83.770187" + style="stroke-width:0.264583" + id="tspan8094-1" /></text> + </g> +</svg> diff --git a/Uebung06/Fachwerk_K1.svg b/Uebung06/Fachwerk_K1.svg new file mode 100644 index 0000000000000000000000000000000000000000..ed5115da00c7096e2bf84d635251b864df553411 --- /dev/null +++ b/Uebung06/Fachwerk_K1.svg @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="40.872959mm" + height="41.418732mm" + viewBox="0 0 40.87296 41.418732" + version="1.1" + id="svg8" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + sodipodi:docname="Fachwerk_K1.svg"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="marker5434" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path5432" /> + </marker> + <marker + style="overflow:visible" + id="marker4682" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4680" /> + </marker> + <marker + style="overflow:visible" + id="marker1505" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1503" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-4" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-9" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-75" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-7" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-2" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-6" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-4" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-3" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-24" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-4" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-9" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-6" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-4" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-3" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-4-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-3-1" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-9" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-4" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-98" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-0" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-3" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-2" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-32" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-2" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="186.68308" + inkscape:cy="20.74099" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="2560" + inkscape:window-height="1377" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-36.427618,-139.74927)"> + <circle + style="fill:#0084d1;stroke:#ffffff;stroke-width:0.686001;stroke-linecap:square;paint-order:fill markers stroke" + id="path833-5" + cx="58.470036" + cy="159.59245" + r="5" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5)" + d="m 63.188968,159.36282 h 7.74852" + id="path2060-5" /> + <path + style="fill:none;stroke:#00ff00;stroke-width:0.497778;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-7)" + d="M 42.77563,159.66447 H 52.813557" + id="path2060-2" /> + <path + style="fill:none;stroke:#00ff00;stroke-width:0.499818;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-4)" + d="m 58.248146,175.04677 -0.0852,-10.02767" + id="path2060-27" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-9)" + d="m 58.445799,154.98464 2.811859,-7.22033" + id="path2060-5-0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="56.624783" + y="160.26802" + id="text8080" + inkscape:transform-center-x="1.3363476" + inkscape:transform-center-y="0.13363476"><tspan + sodipodi:role="line" + id="tspan8078" + x="56.624783" + y="160.26802" + style="stroke-width:0.264583">K<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8128">1</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="57.961128" + y="144.96686" + id="text8092"><tspan + sodipodi:role="line" + id="tspan8090" + x="57.961128" + y="144.96686" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8136">S1</tspan></tspan><tspan + sodipodi:role="line" + x="57.961128" + y="149.37657" + style="stroke-width:0.264583" + id="tspan8094" /></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="37.78228" + y="160.46849" + id="text8110"><tspan + sodipodi:role="line" + id="tspan8108" + x="37.78228" + y="160.46849" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8120">L1</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="56.357513" + y="178.10828" + id="text8114"><tspan + sodipodi:role="line" + id="tspan8112" + x="56.357513" + y="178.10828" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8122">L2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="70.24147" + y="161.91989" + id="text8102-6"><tspan + sodipodi:role="line" + id="tspan8100-4" + x="70.24147" + y="161.91989" + style="stroke-width:0.264583">F<tspan + style="font-size:2.29305px;baseline-shift:sub;stroke-width:0.264583" + id="tspan8134-2">S3</tspan></tspan></text> + </g> +</svg> diff --git a/Uebung06/Fachwerk_K2.svg b/Uebung06/Fachwerk_K2.svg new file mode 100644 index 0000000000000000000000000000000000000000..71cf169b4646e6e7c5121b43aa9b5fbefdb240af --- /dev/null +++ b/Uebung06/Fachwerk_K2.svg @@ -0,0 +1,435 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="32.75618mm" + height="45.05629mm" + viewBox="0 0 32.75618 45.05629" + version="1.1" + id="svg8" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + sodipodi:docname="Fachwerk_K2.svg"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="marker5434" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path5432" /> + </marker> + <marker + style="overflow:visible" + id="marker4836" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4834" /> + </marker> + <marker + style="overflow:visible" + id="marker4682" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4680" /> + </marker> + <marker + style="overflow:visible" + id="marker1505" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1503" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-4" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-9" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lend-75" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path871-7" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-2" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-6" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-4" /> + </marker> + <marker + style="overflow:visible" + id="marker1627-3" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path1625-24" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-4" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-9" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-6" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-4" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-3" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-4-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#00ff00;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-3-1" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-9" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-4" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-98" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-0" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-3" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-2" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-32" /> + </marker> + <marker + style="overflow:visible" + id="marker2064-5-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path2062-2-2" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.4" + inkscape:cx="186.68308" + inkscape:cy="390.02754" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="2560" + inkscape:window-height="1377" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-84.268869,-42.042205)"> + <circle + style="fill:#0084d1;stroke:#ffffff;stroke-width:0.686001;stroke-linecap:square;paint-order:fill markers stroke" + id="path833" + cx="101.10863" + cy="68.980659" + r="5" /> + <path + style="fill:none;stroke:#0000ff;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4836)" + d="m 90.14732,44.223213 8.882441,19.843749" + id="path4678" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-0)" + d="m 102.75645,73.101961 5.36285,5.592804" + id="path2060-5-6" + inkscape:transform-center-x="-3.4607266" + inkscape:transform-center-y="9.0625188" /> + <path + style="fill:none;stroke:#ff0000;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2064-5-2)" + d="M 99.256273,73.343802 95.712044,80.23423" + id="path2060-5-7" + inkscape:transform-center-x="0.20076482" + inkscape:transform-center-y="-0.62555441" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="99.332664" + y="70.19899" + id="text8084"><tspan + sodipodi:role="line" + id="tspan8082" + x="99.332664" + y="70.19899" + style="stroke-width:0.264583">K<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8132">2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="109.44489" + y="78.58477" + id="text8098"><tspan + sodipodi:role="line" + id="tspan8096" + x="109.44489" + y="78.58477" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8130">S2</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="85.056564" + y="52.459171" + id="text8106"><tspan + sodipodi:role="line" + id="tspan8104" + x="85.056564" + y="52.459171" + style="stroke-width:0.264583">F<tspan + style="font-size:65%;baseline-shift:sub" + id="tspan8126">ext</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:3.52777px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="88.931908" + y="81.439346" + id="text8092-5"><tspan + sodipodi:role="line" + id="tspan8090-8" + x="88.931908" + y="81.439346" + style="stroke-width:0.264583">F<tspan + style="font-size:2.29305px;baseline-shift:sub;stroke-width:0.264583" + id="tspan8136-7">S1</tspan></tspan><tspan + sodipodi:role="line" + x="88.931908" + y="85.84906" + style="stroke-width:0.264583" + id="tspan8094-1" /></text> + </g> +</svg> diff --git a/Uebung06/Uebung06.ipynb b/Uebung06/Uebung06.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a8085aff88a075293230610981c9496b4165c14a --- /dev/null +++ b/Uebung06/Uebung06.ipynb @@ -0,0 +1,665 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "805ad574-4651-4394-9d3f-d9bfb7c8929e", + "metadata": {}, + "source": [ + "# <font color='blue'>**Übung 5 - Berechnung eines statisch bestimmten Fachwerks - Teil 2**</font>\n", + "In dieser Übung werden wir an unserem halb fertigen Fachwerk-Programm weiterarbeiten. Am Ende der letzten Übung konnten wir ein Fachwerk definieren und anzeigen. Gefehlt hat noch die Anzeige von externen Kräften und Randbedingungen, die Teil der Hausaufgabe war. Die folgende Zelle enthält den Programmtext der letzten Übung, wobei die *plot* Methode der Klasse Fachwerk so erweitert ist, das Kraft- und Verschiebungsrandbedingungen zumindest dargestellt werden. Es sind sicherlich optisch ansprechendere und bessere Lösungen möglich. In dieser Übung wollen wir uns mit der Lösung des Fachwerkproblems beschäftigen, also der Berechnung der Stabkräfte und der Auflagerreaktionen. Da wir an dem Quelltext weiterarbeiten, sind viele Kopien in diesem Notebook. Der Übersichtlichkeit halber, ist nur die letzte Version komplett kommentiert, falls du das Programm noch einmal nachvollziehen möchtest." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "67ba89b6-abd3-4590-a95a-0bd8c3f7b6ab", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as mpatches\n", + "%matplotlib inline\n", + "\n", + "class Knoten:\n", + " def __init__(self, coo):\n", + " self._coo=np.array(coo)# wir sollten sicherstellen, das es sich bei der intern gespeicherten Koordinate um ein np.array handelt. Potentiell sollte noch der Datentyp auf Fließkomma gesetzt werden und die Größe überprüft werden\n", + " self._kraft=np.zeros(2)\n", + " self._lager=[False,False]\n", + " \n", + " self._staebe=[]\n", + " def _addStab(self,stab):\n", + " self._staebe.append(stab)\n", + " def _removeStab(self,stab):\n", + " self._staebe.remove(stab)\n", + " \n", + " def setKraft(self,kraft):\n", + " self._kraft[:]=kraft\n", + " def setLager_x(self):\n", + " self._lager[0]=True\n", + " def setLager_y(self):\n", + " self._lager[1]=True\n", + " def removeLager_x(self):\n", + " self._lager[0]=False\n", + " def removeLager_y(self):\n", + " self._lager[1]=False\n", + "\n", + " def getKoordinate(self):\n", + " return self._coo\n", + "\n", + "class Stab:\n", + " def __init__(self,k1,k2):\n", + " self.k1=k1\n", + " self.k2=k2\n", + "\n", + "class Fachwerk:\n", + " \n", + " def removeStab(self,stab):\n", + " if stab in self._staebe:\n", + " stab.k1._removeStab(stab)\n", + " stab.k2._removeStab(stab)\n", + " self._staebe.remove(stab)\n", + " \n", + " def removeKnoten(self,knoten):\n", + " if knoten in self._knoten:\n", + " for stab in knoten._staebe[:]:\n", + " self.removeStab(stab)\n", + " self._knoten.remove(knoten)\n", + " def __init__(self):\n", + " self._knoten=[]\n", + " self._staebe=[]# Wir erstellen erst einmal leere Listen für die Stäbe und Knoten\n", + " def addKnoten(self, coo):\n", + " neuer_knoten=Knoten(coo)\n", + " self._knoten.append(neuer_knoten)\n", + " return neuer_knoten\n", + " def addStab(self,k1,k2):\n", + " if not k1 in self._knoten:\n", + " return None\n", + " if not k2 in self._knoten:\n", + " return None\n", + " neuer_stab=Stab(k1,k2)\n", + " k1._addStab(neuer_stab)\n", + " k2._addStab(neuer_stab)\n", + " self._staebe.append(neuer_stab)\n", + " return neuer_stab\n", + " def plot(self):\n", + " fig= plt.figure(figsize=(5, 5))\n", + " ax = fig.subplots()\n", + " #zunaechst alle Knoten darstellen. Matplotlib erwartet dafür eine Darstellung in der Form [x_0,x_1,...],[y_0,y_1,..]\n", + " x_werte=[]\n", + " y_werte=[]\n", + " for knoten in self._knoten:\n", + " koordinate=knoten.getKoordinate()#die Koordinate holen\n", + " x_werte.append(koordinate[0])\n", + " y_werte.append(koordinate[1])\n", + " if np.linalg.norm(knoten._kraft)>0.0001:\n", + " kraftvektor=knoten._kraft/np.linalg.norm(knoten._kraft)\n", + " pfeil=mpatches.FancyArrowPatch((koordinate[0]-kraftvektor[0],koordinate[1]-kraftvektor[1]),(koordinate[0],koordinate[1]),mutation_scale=30,ec=\"r\",fc=\"r\")\n", + " ax.add_patch(pfeil)\n", + " if knoten._lager[0]:\n", + " pfeil=mpatches.FancyArrowPatch((koordinate[0]-1,koordinate[1]),(koordinate[0],koordinate[1]),mutation_scale=30,ec=\"b\",fc=\"b\")\n", + " ax.add_patch(pfeil)\n", + " if knoten._lager[1]:\n", + " pfeil=mpatches.FancyArrowPatch((koordinate[0],koordinate[1]-1),(koordinate[0],koordinate[1]),mutation_scale=30,ec=\"b\",fc=\"b\")\n", + " ax.add_patch(pfeil)\n", + " ax.scatter(x_werte,y_werte)#Zeichnet alle Knoten als blaue Kreise\n", + " #als nächstes alle Stäbe\n", + " for stab in self._staebe:\n", + " koordinate1=stab.k1.getKoordinate()\n", + " koordinate2=stab.k2.getKoordinate()\n", + " ax.plot([koordinate1[0],koordinate2[0]],[koordinate1[1],koordinate2[1]],\"r\")#Zeichent einen Stab in rot. Durch die andere vorgesehene Nutzung von Matploltib müssen wir uns die x und y Koordinaten der Punkte etwas umständlich umsortieren" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "7dcf7c31-457c-4eac-a9d8-7539b50e9a3a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbUAAAGsCAYAAABaczmOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvP0lEQVR4nO3deXxU9b3/8fckkYCQDLIl5BJWQRGEoixlsUVFLVrUq2Dhsqn3tr9yQwVRivQ+FFuLEfcFioJ9KK0LWCuKtEgREUXZJEWlVQRBEmUJLswEhAEz5/fHcUJCtkky3zlnzryej8c8OpmczPlUk3n7Ped8zsdnWZYlAAA8IMXpAgAAiBVCDQDgGYQaAMAzCDUAgGcQagAAzyDUAACeQagBADwjzekCahIOh7V3715lZGTI5/M5XQ4AwCGWZamkpEQ5OTlKSal+PebqUNu7d69yc3OdLgMA4BJFRUVq165dtd93dahlZGRIsv9PZGZmOlwNAMApwWBQubm5ZblQHVeHWuSQY2ZmJqEGAKj1VBQXigAAPINQAwB4BqEGAPAMQg0A4BmEGgDAMwg1AIBnEGoAAM8g1AAAnkGoAQA8w3ioffHFFxo3bpxatmypJk2a6Nxzz9V7771nercAgCRk9DZZ33zzjQYPHqwLL7xQK1asUOvWrbVjxw6dccYZJncLAEhSRkNtzpw5ys3N1VNPPVX2WqdOnUzuEgCQxIwefly2bJn69u2rUaNGqU2bNurTp48WLlxY7fahUEjBYLDCAwCAaBkNtV27dmn+/Pnq2rWrVq5cqUmTJummm27SokWLqtw+Pz9ffr+/7MEsNQBAXfgsy7JMvXmjRo3Ut29fvfvuu2Wv3XTTTdq8ebPWr19faftQKKRQKFT2dWR+TiAQYPQMACSxYDAov99fax4YXam1bdtW55xzToXXunfvrsLCwiq3T09PL5udxgw1AEBdGb1QZPDgwdq+fXuF1z755BN16NDB5G6R7MJh6csvpc8/r/z44gtp5kxp2DCnqwRggNFQu/nmmzVo0CDdfffduu6667Rp0yYtWLBACxYsMLlbJKtAQBo4UNq5Uzpx4uTrPp+UlmaHXTgsde9OqAEeZfTwY79+/bR06VI9//zz6tmzp+666y49/PDDGjt2rMndIlkdPSp99FHFQJMky7JfKy21vy4qin9tAOLC6IUiDRXtiUFAkr0Ka9ToZHhVp1cv6f3341MTgJhwxYUiQFylpEhZWbVv9/nn5msB4AhCDd4STW/jN99Ix4+brwVA3BFq8JaOHe0VW00sS9q3Ly7lAIgvQg3e0q6dlJpa+3YcggQ8iVCDt7RrV/uFIhKhBngUoQZvadfOvgqyJqmphBrgUYQavKVdu9q3SUkh1ACPItTgLdGE2nffEWqARxFq8Jbs7Oiufty1Kz71AIgrQg3ekpYmtWxZ+3ZffGG+FgBxR6jBe6JpwD540D4MCcBTCDV4T8eO9p35axIOSwcOxKUcAPFDqMF72rWzD0PWhotFAM8h1OA90fSqSYygATyIUIP3RHNXEXrVAE8i1OA90fSqcVcRwJMINXhPNKFWWkqoAR5EqMF7cnJq3yYclj77zHgpAOIrikvEgASTni61aCF9/XXN2336qfTnP9sXjHz+uf2/n31m969t2CD5/XEpF0DsEGrwlpISO6D8/tpD7csvpQkT7Mv/fT7pxAn79WbNpEaNzNcKIOYINSS2Rx6RXn1V2rPHnmZ95Ejd36P8nUXS0qTRo6UmTWJXI4C4IdSQ2FaulFavjt37ffeddP31sXs/AHHFhSJIbI88EttDhR07SoMGxe79AMQVoYbE1rWr9Lvf1X6vx2ikpEg33hib9wLgCEINie+WW6SePe2G6oYIh6Xx42NTEwBHEGpIfGlp0qJF9vDP+kpJkYYMsQ8/AkhYhBq8oU8f6dZba596XZ1w2D70CCChEWrwjjvvlNq3r1+wpadLI0fGvCQA8UWowTuaNJGeeiq6sTPlpaVJ114rZWSYqQtA3BBq8JahQ6X/+Z+6XTRCbxrgGYQavOe+++x7P0Z7aX5WlnTRRWZrAhAXhBq8p3lzaeHC6K6GTE2Vbrih4e0AAFyBUIM3XXWVdM01tYdVaal9U2MAnkCowbvmzZOaNq3++z6f3QrQvXv8agJgFKEG78rOlh5+uOZt/vu/41IKgPgg1OBt118vXXhh1YchU1PtMTMAPINQg7f5fNKTT0qnnVbx9dRU6ac/lVq2dKYuAEYQavC+zp2l2bMrvlZaSm8a4EGEGpLDlCnSeefJ+v4w5PGMTG3o1l+l4QbcBBmA6xBqSA6pqVr3m3sV/j7Enu32Y41eVKAhc97Qa9v2OVwcgFgxGmp33nmnfD5fhcfZZ59tcpdAlV7btk/jNx/TvB+OkiS92PNiSdL+wDFNeqaAYAM8Is30Dnr06KHXX3/95A7TjO8SqKA0bOm3r/5blqSHh/yXlp89RJ+06SRJsiT5JP321X/rknOylZrC1GsgkRlPmLS0NGVnZ0e1bSgUUigUKvs6GAyaKgtJZNPur7UvcEyS1PGbvVr6zHS93GOobr9kksIpqbIk7Qsc06bdX2tgF66GBBKZ8XNqO3bsUE5Ojjp37qyxY8eqsLCw2m3z8/Pl9/vLHrm5uabLQxIoLjlW9vyuf8xX0xPHNGbrSv1g7yfVbgcgMRkNtQEDBujpp5/Wa6+9pvnz52v37t264IILVFJSUuX2M2fOVCAQKHsUFRWZLA9Jok1GY0nSaaUn1OUr+3cqRZaefOkudfz6i0rbAUhcRg8/Dh8+vOx5r169NGDAAHXo0EEvvPCC/ruK2xOlp6crPT3dZElIQv07tVBbf2P1X/+mso98owNNz1BxsxY698CneurFOzVy3P1q1DZL/Tu1cLpUAA0U10v6mzdvrm7dumnnzp3x3C2SXGqKT7N+2l03bn5FkvSn836qG0feqSJ/ljp9s08L//o7/faSTlwkAnhAXEPt8OHD+vTTT9W2bdt47hbQT0o+U+/9OxRKa6Tnf/ATHWx2hq4feaeCTTJ03t7tuvTuW+27jABIaEYPP956660aMWKEOnTooL1792rWrFlKTU3VmDFjTO4WqOz7u/WfNnG85k25TMUlx9Qm44dqOq67dNml0tKl0q23Sg895GydABrEaKh9/vnnGjNmjL766iu1bt1aQ4YM0YYNG9S6dWuTuwUq2rNH+utfJUkpU6dWvGy/y4+lRYukMWPs4OvQQZo61ZEyATSc0VBbvHixybcHojNvnhQOS8OGST17Vv7+6NFSYaE0Y4Y0bZrUvr09NRtAwuHej/C2w4elhQvt5zWtwKZPlyZNkixLGjtWWr8+LuUBiC1CDd72pz9Jhw5JXbtK5VpMKvH5pEcftWesHTsmjRgh7dgRtzIBxAahBu8Kh6VHHrGfT5kipdTy656WJi1eLJ1/vvTVV9Lll0sHD5qvE0DMEGrwrtdekz75RPL7pYkTo/uZpk2l5culjh2lnTulK6+Ujh41WiaA2CHU4F2Ry/N//nOpWbPofy47W/r736UzzpA2bLDPsdHDBiQEQg3etG2b9Prr9iHHyZPr/vPdu0svvyw1anSyhw2A6xFq8KbIubRrrrF7z+rjRz+ye9gku4ft+wZuAO5FqMF7Dh6U/vxn+3lDG6lHj5bmzLGfT5smvfRSw94PgFGEGrxnwQIpFJL69pUGDWr4+9HDBiQMQg3ecvy4fQcRyV6l+WJw53162ICEQajBW/7yF2nfPqltW2nUqNi9b6SHrW9fetgAFyPU4B2WdfJijrw8+8rFWKqqh+3bb2O7DwANQqjBO959V3rvPalxY+kXvzCzj6wsacWKkz1s48bRwwa4CKEG74is0saNk0yONzr7bOmVV072sN1yi7l9AagTQg3esGfPycvtp0wxv78LLrBvlizZPXH0sAGuQKjBG+bOrXlmmgk/+5l0773282nTygaRAnAOoYbEF+3MNBNuvVX63/+1L1IZN84+rwfAMYQaEt+iRVIgUPvMNBN8Pvvw44gRdg/blVfSwwY4iFBDYqvrzDQT0tKk558/2cM2fDg9bIBDCDUkthUr7JVRXWammVC+h+3TT+2VGz1sQNwRakhskasO6zozzYTyPWwbN9LDBjiAUEPiaujMNBPoYQMcRaghccViZpoJ9LABjiHUkJhiOTPNBHrYAEcQakhMsZ6ZZgI9bEDcEWpIPCZmpplADxsQd4QaEo+pmWkm0MMGxBWhhsRiemaaCfSwAXFDqCGxxGNmmgn0sAFxQaghscRrZpoJ9LABxhFqSBzxnplmAj1sgFGEGhKHEzPTTKCHDTCGUENicHJmmgn0sAFGEGpIDE7OTDOBHjbACEIN7ueGmWkm0MMGxJxHPh3gaW6ZmWYCPWxATBFqcD83zUwzgR42IGYINbibG2emmUAPGxAThBrcza0z00yghw1osLiF2j333COfz6epXrgcG/Hh9plpJtDDBjRIXEJt8+bNeuKJJ9SrV6947A5ekQgz00yghw2oN+OhdvjwYY0dO1YLFy7UGWecYXp38IpEmZlmAj1sQL0ZD7W8vDxdccUVGjZsWK3bhkIhBYPBCg8kqUSamWYCPWxAvRgNtcWLF6ugoED5+flRbZ+fny+/31/2yM3NNVke3CoRZ6aZQA8bUGfGQq2oqEhTpkzRs88+q8aNG0f1MzNnzlQgECh7FBUVmSoPbpaoM9NMoIcNqBNjobZlyxYVFxfrvPPOU1pamtLS0rR27Vo9+uijSktLU2kVf5jp6enKzMys8EASSuSZaSbQwwZEzWdZlmXijUtKSrRnz54Kr91www06++yzNWPGDPWMYnRIMBiU3+9XIBAg4JLFnj1S5872/R4//DCxR8zE2pIl0ujR9vOHHkqeNgdA0edBmqkCMjIyKgVX06ZN1bJly6gCDUnKKzPTTPjZz6SiImn6dLuHLTdXuvZap6sCXIU7isA9vDYzzYRbbrEvnqGHDaiSsZVaVd5888147g6Jxmsz00yI9LAVFkqvvmr3sK1fb/8zA8BKDS7h1ZlpJqSm2j1s/frRwwacgk8OuIOXZ6aZ0LSpvVLr1IkeNqAcQg3u4PWZaSZEethatLB72MaOpYcNSY9Qg/OSZWaaCWedZfewpadLL78s3XyzfREJkKQINTgvmWammTBkyMk5bI89xhw2JDVCDc5KxplpJlx3nXTfffbzW26RXnzR2XoAhxBqcFayzkwzgR42gFCDg5J5ZpoJ5eewhUJ2D9snnzhdFRBXhBqck+wz00yoqoetuNjpqoC4IdTgDGammVO+h23XLnvFRg8bkgShBmcwM80setiQpAg1OIOZaebRw4YkRKgh/vbskV56yX4+ZYqztXgdPWxIMoQa4o+ZafFFDxuSCKGG+GJmmjPoYUOSINQQX8xMcwY9bEgShBrih5lpzqKHDUmATxXEDzPTnEcPGzyOUEP8MDPNHehhg4cRaogPZqa5Cz1s8ChCDfHBzDT3oYcNHkSowTxmprkXPWzwGEIN5jEzzd3oYYOHEGowi5lp7kcPGzyEUINZzExLDPSwwSMINZhTfmba5MnMTHM7etjgAYQazHnnHWamJRp62JDgCDWYE1mljR8vtWrlaCmoA3rYkMAINZjx2WfS0qX2c2amJR562JCgCDWYEZmZdsklUo8eTleD+qCHDQmIUEPslZRITz5pP6fZOrHRw4YEQ6gh9iIz07p1k37yE6erQUPQw4YEQ6ghtpiZ5j30sCGB8ImD2Pr736WdO6XmzaUJE5yuBrHStKm0fDk9bHA9Qg2xxcw072rThh42uB6hhtj58ENp9Wr7cBUz07yJHja4HKGG2Ck/M619e2drgTlDhpwcJUQPG1yGUENsHDwoPfOM/ZzL+L1v1Cjp/vvt5/SwwUUINcTGE0/Yl3z36ycNHOh0NYiHadPsw8z0sMFFjIba/Pnz1atXL2VmZiozM1MDBw7UihUrTO4STmBmWnLy+exDj1deSQ8bXMNoqLVr10733HOPtmzZovfee08XXXSRrrrqKv3rX/8yuVvE2wsvSPv3Szk50siRTleDeIr0sPXvTw8bXMFoqI0YMUKXX365unbtqm7dumn27Nlq1qyZNmzYYHK3iCfLkh56yH6el8fMtGR0+unMYYNrxO2cWmlpqRYvXqwjR45oYDXnXEKhkILBYIUHXO6dd6SCAmamJTt62OASxkPtww8/VLNmzZSenq5f/vKXWrp0qc4555wqt83Pz5ff7y975Obmmi4PDcXMNETQwwYX8FmW2d+648ePq7CwUIFAQC+++KKefPJJrV27tspgC4VCCoVCZV8Hg0Hl5uYqEAgoMzPTZJmoj88+k7p0se/3uG0bI2Zg+8tf7LE1kvTAA/ZVkkADBYNB+f3+WvPAeKidatiwYerSpYueeOKJWreN9v8EHHLrrfaH1iWXSP/4h9PVwE0eeMD+/ZDsC4lGjXK2HiS8aPMg7n1q4XC4wmoMCYqZaahJpIdNsg9Nv/OOs/UgaaSZfPOZM2dq+PDhat++vUpKSvTcc8/pzTff1MqVK03uFvHAzDTUJNLDVlgoLVtmXxG5fr39+wIYZDTUiouLNWHCBO3bt09+v1+9evXSypUrdckll5jcLUxjZhqiEelhu/BCadMmu4dt/Xr7SknAkLifU6sLzqm51PLl9iTk5s2loiJGzKBmxcXSD38o7d5tN2mvWWP3tgF14NpzavAAZqahLsr3sG3aJP3Xf9HDBmMINdQNM9NQH+V72F55xb64yL0HiZDACDXUDTPTUF/l57DNnXvy9mpADBFqiB4z09BQp85h+8tfnK0HnkOoIXrMTEMs0MMGgwg1RIeZaYgV5rDBIEIN0WFmGmKp/By2r79mDhtihlBD7ZiZBhNOncM2YgRz2NBghBpqx8w0mEIPG2KMUEPtmJkGk+hhQwwRaqjZZ59JS5faz6dMcbQUeBg9bIgRQg01mzvXvoHxJZcwBBRm0cOGGCDUUD1mpiHe6GFDAxFqqB4z0xBv9LChgQg1VI2ZaXAKPWxoAD6pULW//13audOemTZhgtPVINnQw4Z6ItRQNWamwWn0sKEeCDVUxsw0uAU9bKgjQg2VMTMNbhLpYfP56GFDrQg1VMTMNLgRPWyIEqGGipiZBre6+WbpV7+yn9PDhmoQajiJmWlwM5/PPvR41VX0sKFahBpOYmYa3C41VXruOXrYUC1CDTZmpiFRRHrYOnemhw2VEGqwMTMNiYQeNlSDUIONmWlINN26ScuW0cOGCgg1MDMNiWvwYLsFhR42fI9QAzPTkNhGjqSHDWUItWTHzDR4AT1s+B6hluyYmQYvoIcN3yPUkhkz0+Al9LBBhFpyY2YavIYetqRHqCUzZqbBi+hhS2qEWrJiZhq8jB62pEWoJStmpsHr6GFLSoRaMmJmGpIFPWxJh1BLRsxMQzI5tYdt3Tpn64FRhFqyYWYaks2pPWxXXSVt3+50VTCEUEs2zExDMqqqh+3AAaerggFGQy0/P1/9+vVTRkaG2rRpo6uvvlrb+S8k5zAzDcmsfA/b7t12D9uRI05XhRgzGmpr165VXl6eNmzYoFWrVunEiRO69NJLdYRfJGcwMw3JrnwP2+bN9LB5kM+y4te8cfDgQbVp00Zr167Vj370o1q3DwaD8vv9CgQCyszMjEOFHjdypPTXv9rN1gsWOF0N4Jx33pEuvtg+x5aXJz32GOeXXS7aPIjrObVAICBJatGiRZXfD4VCCgaDFR6IEWamASeV72GbN0968EGnK0KMxC3UwuGwpk6dqsGDB6tnz55VbpOfny+/31/2yM3NjVd53sfMNKCi8j1st95KD5tHxO3w46RJk7RixQqtW7dO7dq1q3KbUCikUChU9nUwGFRubi6HHxuqpETKzbVHzPztb9LllztdEeAOlmUfuXjsMfuWWq+/Lg0Z4nRVqIKrDj9OnjxZy5cv15o1a6oNNElKT09XZmZmhQdigJlpQNXoYfMco6FmWZYmT56spUuX6o033lCnTp1M7g5VYWYaUDN62DzF6CdcXl6ennnmGT333HPKyMjQ/v37tX//fh09etTkblEeM9OA2tHD5hlGQ23+/PkKBAIaOnSo2rZtW/ZYsmSJyd2iPGamAdGhh80T4tqnVlf0qTXQBx9IvXvbh1d27WLEDBANethcyVUXisAhzEwD6o4etoRGqHlVcbH07LP2c2amAXVDD1vCItS8iplpQMMwhy0hEWpeFApJf/iD/ZyZaUD90MOWkAg1L2JmGhAbkR62AQPoYUsQhJrXMDMNiK1ID1uXLvSwJQBCzWvWrZP++U9mpgGx1Lq1fSODli3pYXM5Qs1rIs3W48dLrVo5WgrgKd26ScuW2Tc+XrbMvu2ce9t8kxah5iW7d0svv2w/Z2YaEHuDBtmtMvSwuRah5iXMTAPMu/Za6YEH7Of0sLkOoeYVJSXSk0/az2m2BsyaOlW66Sb7OT1srkKoecXTT0vBIDPTgHjw+exDj1dfTQ+byxBqXsDMNCD+UlPt82v0sLkKn35e8Le/SZ9+ysw0IN7oYXMdQs0LmJkGOIceNlch1BLdBx9Ib7xhHwqZPNnpaoDkRA+baxBqiY6ZaYA70MPmCoRaImNmGuAu9LA5jlBLZMxMA9yHHjZHEWqJiplpgDvRw+YoQi1RMTMNcC962BxDqCUiZqYB7kcPmyMItUTEzDQgMdDDFneEWiJiZhqQOOhhiytCLdEwMw1IPPSwxQ2hlmiYmQYkJnrY4oJQSyTlZ6bdfLOztQCoO3rYjCPUEklkZtpZZ0mXXeZ0NQDq6tQetiuvpIctxgi1RMHMNMAbyvewffMNPWwxxidjomBmGuAd9LAZQ6glishl/L/4hdS0qaOlAIiBU3vYxoyhhy0GCLVEUH5mWl6e09UAiJXyPWyvvmpfREIPW4MQaokgci7t2muZmQZ4Tfketj/84eRl/6gXQs3tmJkGeF/5Hrbp0+0blqNeCDW3i8xM699f+uEPna4GgCmn9rC9/baj5SQqQs3NmJkGJI/yPWzHjzOHrZ4INTdjZhqQXOhhazBCza3Kz0ybPFk67TRn6wEQH/SwNQih5lbMTAOSFz1s9UaouVWk2XrCBPsXG0ByoYetXoyG2ltvvaURI0YoJydHPp9PL0fmgKFmzEwDINHDVg9GQ+3IkSPq3bu35s2bZ3I33hOZmXbppdI55zhdDQAn0cNWJ2km33z48OEaPnx41NuHQiGFQqGyr4PBoImy3K38zDSarQFI9vzEPXvsuwuNHy+1bStdcIHTVbmSq86p5efny+/3lz1yc3OdLin+mJkGoCoPPCD953/Sw1YLV4XazJkzFQgEyh5FRUVOlxRfzEwDUJ3UVOmZZ+w7C9HDVi1XfWqmp6crMzOzwiOpMDMNQE1OP92+IpIetmq5KtSSHjPTANSmdWtpxQp62KpBqLkFM9MARKtrV7t3rXFjethOYTTUDh8+rK1bt2rr1q2SpN27d2vr1q0qLCw0udvExMw0AHUxcKB9jo0etgp8lmUu3t98801deOGFlV6fOHGinn766Vp/PhgMyu/3KxAIePv8WnGxHWShkPTuu/YvKwBE4+GH7Uv+JWnJEum66xwtx5Ro88Bon9rQoUNlMDO9g5lpAOpr6lTps8/oYfse59Scxsw0AA1FD1sZQs1pzEwD0FD0sJUh1JzEzDQAsUIPmyRCzVnMTAMQS/SwEWqOYmYagFhL8h42Qs0pzEwDYEoS97ARak5hZhoAk669VnrwQft5Es1hI9ScwMw0APEwderJI0Hjx0tvv+1oOfFAqDmBmWkA4iXJetgItXhjZhqAeEqyHjY+UeONmWkA4i2JetgItXhjZhoAJyRJDxuhFk/MTAPgpCToYSPU4omZaQCc5vEeNkItXoqLpWeftZ9zGT8AJ3m4h41QixdmpgFwE4/2sBFq8cDMNABu5MEeNkItHpiZBsCNPNjDRqiZxsw0AG52ag/bT3+a0D1shJppzEwD4Hble9jee08aPVr67junq6oXQs20yCqNmWkA3Kx8D9vy5Qnbw0aombRrFzPTACSO8j1s8+dL99/vdEV1RqiZNHeu/V86zEwDkCjK97D9+tfSkiXO1lNHhJopwSAz0wAkpvI9bBMmJFQPG6FmytNP28NAmZkGIBGd2sP28cdOVxQVQs2E0lLp0Uft58xMA5CIErSHjU9bE5iZBsALIj1sZ54pffZZQvSwEWomMDMNgFdEethatUqIHjZCLdbef19as4aZaQC848wz7RVbAvSwEWqxxsw0AF40cKA9PsvlPWyEWiwxMw2Al11zzcm7JLm0h83ToXbwoLR1axx3+Pjj9uWvzEwD4FVTppz8j3YX9rB5OtTuvlvq00e66CL7vsJGMTMNQLK4/3571ebCHjZPh9qxY3aL2FtvSRdcYDjcliyxeziYmQbA61zcw+bpUJPsf/alpfZzY+FmWScv42dmGoBk0KSJK3vYPB9q5RkLt7ffZmYagOTjwh62pAq1iFPD7cILGxhukVUaM9MAJBuX9bAlZahFRMLt7bcbsHJjZhqAZOeiHrakDrWI+hyWLA1bWv/pV9p5xz2SZcm6hJlpAJJYFT1skc/JV7Z+ofWffqXSsPkVXFxCbd68eerYsaMaN26sAQMGaNOmTfHYbZ1VFW7vvFN5u9e27dOQOW/o53PfUNZfnpEkTcsZqte27YtjtQDgMuV62MLjJyjvl49ozMINmrJ4q8Ys3KAhc94w/jlpPNSWLFmiadOmadasWSooKFDv3r112WWXqbi42PSu6618uA0ZUjHcXtu2T5OeKdC+wDGN/PB1ZRw/qk9btNMrWT016ZkCgg1Acrv/fu0fdrlSThzXPX++XV2+Kir71v7AMeOfkz7LMntGb8CAAerXr5/mzp0rSQqHw8rNzdWvfvUr3XbbbTX+bDAYlN/vVyAQUGZmZp33PWmS9Mc/SidO1Kv0MpG2gKEXWjrYbYsONz+glNLvtGbh/1OHwAH99qKfa3Hvy+STlOVP1+vThio1heZrAMmnNGzpijn/0D1/vE0/2L9Dn2e20egxs/W5P1vy+eSTlO1vrHUzLqrT52S0eWA01I4fP67TTz9dL774oq6++uqy1ydOnKhDhw7plVdeqbB9KBRSKBQq+zoYDCo3N9fxUIvw+SxZlk9nDNum0ac/oz8smxObNwYAj+t90/MKNMko+/r5n/9QA7tEf7V4tKFm9PDjl19+qdLSUmVlZVV4PSsrS/v376+0fX5+vvx+f9kjNzfXZHl1kpoqWZZPjXK+UZOOX+p4Gg3WABCt46kVPzOLS44Z2U+akXetp5kzZ2ratGllX0dWak6KHHrs318a878B3f/hu/L5pNdbDNBZk/+qxinHK/3LevqGfhrQmX41AMln466vdP1Tm8u+bnrkqI40baKjp6VX2K5NRmMj+zcaaq1atVJqaqoOnHJPsAMHDig7O7vS9unp6UpPT6/0uhPKh9nvf283aIetTD03p7H2B47pu6Pp2rHwUjUftFOZ/XdLUtmx4r49ciXOqQFIQn17nK7mrXdof+CYTpSka/vTV+qMoR8ro0+hpJOfk/07tTCyf6OHHxs1aqTzzz9fq1evLnstHA5r9erVGjhwoMld11tqqv2//ftLq1fbVz1edJHdU5ia4tOsEXYvWnBjZ1mhRjr0bleFQ6mKRNisEedwkQiApFXhc3LDmbKOn6ZDb3dT+ERKXD4njV/SP23aNC1cuFCLFi3SRx99pEmTJunIkSO64YYbTO+6TmoKs/J+0rOt8i/vq5KCjpIkK5SmkoKOyvY31vxx5+knPdvGt3AAcJmf9Gyruy7pq8Nb20uSwkcb6fD77ePyOWn8nNrPfvYzHTx4UHfccYf279+vH/zgB3rttdcqXTzilKoOM9Y2Cq1geZZSLEt2O5tPJ/7ZTSuWnaXmflZoACBJG5ZmKcUX+ZyUwgXdteqVc9SsqdnPybjcUWTy5Mnas2ePQqGQNm7cqAEDBsRjtzWKrMwGDKh5ZXaqgwelxx6TSktPbnj0SIrm/4FAAwBJ+uIL6Yknyn9O+hQ8lKI/Pmn+czLp7v14apitWxddmEXcd1/lvrdwWJozRyopiW2tAJCI8vMr36jfsuyjYUePmt130oRaQ8NMKr9Kq/y9khLp+5umAEDSOrlKq/y9r76SFiwwu3/Ph1pkVdWQMIuoapUWwWoNAKpepUXEY7Xm6VAbNEi69NKGh5lU8yotgtUagGRW0yotwvRqzfgNjRuioTc0jqVf/1p68MGa/2VJkt8vFRVJGRk1bwcAXjN5svT447V/TrZqJRUWSk2aRP/errj3o1dEs0qLKCmxtwWAZBLNKi3iq6/sbU0g1KJQ07m0U4XD0r33cm4NQHKp6VzaqSxLmj3bzLk1Qq0WdVmlRXBuDUAyqcsqLcLUuTVCrRZ1WaVFcCUkgGRSl1VahKkrIQm1GtRnlRbBag1AMqjPKi3CxGqNUKtBfVZpEazWACSD+qzSIkys1gi1ajRklRbBag2AlzVklRYR69UaoVaNhqzSIlitAfCyhqzSImK9WiPUqhCLVVoEqzUAXhSLVVpELFdrhFoVYrFKi2C1BsCLYrFKi4jlao1QO0UsV2kRgQCrNQDeEctVWsSXX8ZmtUaoneJf/5JCofr9bGS8TVU2bqzfewKA23zwgfTdd/X72bS06r8Xi8/JGt4+OQ0dKh06VPlf2K5dUr9+Nf9sSoo0caJ9+PJUDt+PGQBiZvhw+3Py1JXav/4l/ehHNf+szyfl5Um/+13l7/n9Da+NUKtCVQH09dfR/WzjxlKLFrGtBwDcpqoAijaUmjQx9znJ4UcAgGcQagAAzyDUAACeQagBADyDUAMAeAahBgDwDEINAOAZhBoAwDMINQCAZxBqAADPINQAAJ5BqAEAPINQAwB4BqEGAPAMQg0A4BmEGgDAMwg1AIBnEGoAAM8g1AAAnkGoAQA8w1iozZ49W4MGDdLpp5+u5s2bm9qNq5SWOl0BALhbOGz2/dNMvfHx48c1atQoDRw4UH/84x9N7SZuWrWSsrOlQ4dq3q5797iUAwCuk5UltW4tlZRUv43PZ/Zz0lio/fa3v5UkPf3006Z2EVfNm0v79jldBQC4V1aWVFzsbA3GQq0+QqGQQqFQ2dfBYNDBagAAicZVF4rk5+fL7/eXPXJzc50uCQCQQOoUarfddpt8Pl+Nj48//rjexcycOVOBQKDsUVRUVO/3AgAknzodfrzlllt0/fXX17hN586d611Menq60tPT6/3zAIDkVqdQa926tVq3bm2qFgAAGsTYhSKFhYX6+uuvVVhYqNLSUm3dulWSdOaZZ6pZs2amdgsASGLGQu2OO+7QokWLyr7u06ePJGnNmjUaOnSoqd0CAJKYz7Isy+kiqhMMBuX3+xUIBJSZmel0OQAAh0SbB666pB8AgIYg1AAAnkGoAQA8g1ADAHgGoQYA8AxCDQDgGYQaAMAzCDUAgGcQagAAz3DVkNBTRW52wrBQAEhukRyo7SZYrg61kpISSWJYKABAkp0Lfr+/2u+7+t6P4XBYe/fuVUZGhnw+n9PlVBIMBpWbm6uioqKEuDcl9ZpFvWZRr1lur9eyLJWUlCgnJ0cpKdWfOXP1Si0lJUXt2rVzuoxaZWZmuvKXoDrUaxb1mkW9Zrm53ppWaBFcKAIA8AxCDQDgGYRaA6Snp2vWrFlKT093upSoUK9Z1GsW9ZqVaPVWx9UXigAAUBes1AAAnkGoAQA8g1ADAHgGoQYA8AxCDQDgGYRaPc2bN08dO3ZU48aNNWDAAG3atMnpkqqUn5+vfv36KSMjQ23atNHVV1+t7du3O11W1O655x75fD5NnTrV6VKq9cUXX2jcuHFq2bKlmjRponPPPVfvvfee02VVqbS0VLfffrs6deqkJk2aqEuXLrrrrrtqvUlsvLz11lsaMWKEcnJy5PP59PLLL1f4vmVZuuOOO9S2bVs1adJEw4YN044dO5wpVjXXe+LECc2YMUPnnnuumjZtqpycHE2YMEF79+51Zb2n+uUvfymfz6eHH344bvXFAqFWD0uWLNG0adM0a9YsFRQUqHfv3rrssstUXFzsdGmVrF27Vnl5edqwYYNWrVqlEydO6NJLL9WRI0ecLq1Wmzdv1hNPPKFevXo5XUq1vvnmGw0ePFinnXaaVqxYoX//+9964IEHdMYZZzhdWpXmzJmj+fPna+7cufroo480Z84c3XvvvXrsscecLk2SdOTIEfXu3Vvz5s2r8vv33nuvHn30UT3++OPauHGjmjZtqssuu0zHjh2Lc6W2mur99ttvVVBQoNtvv10FBQV66aWXtH37dl155ZUOVGqr7Z9vxNKlS7Vhwwbl5OTEqbIYslBn/fv3t/Ly8sq+Li0ttXJycqz8/HwHq4pOcXGxJclau3at06XUqKSkxOratau1atUq68c//rE1ZcoUp0uq0owZM6whQ4Y4XUbUrrjiCuvGG2+s8No111xjjR071qGKqifJWrp0adnX4XDYys7Otu67776y1w4dOmSlp6dbzz//vAMVVnRqvVXZtGmTJcnas2dPfIqqQXX1fv7559Z//Md/WNu2bbM6dOhgPfTQQ3GvrSFYqdXR8ePHtWXLFg0bNqzstZSUFA0bNkzr1693sLLoBAIBSVKLFi0crqRmeXl5uuKKKyr8c3ajZcuWqW/fvho1apTatGmjPn36aOHChU6XVa1BgwZp9erV+uSTTyRJ77//vtatW6fhw4c7XFntdu/erf3791f4nfD7/RowYEBC/O1J9t+fz+dT8+bNnS6lSuFwWOPHj9f06dPVo0cPp8upF1ffpd+NvvzyS5WWliorK6vC61lZWfr4448dqio64XBYU6dO1eDBg9WzZ0+ny6nW4sWLVVBQoM2bNztdSq127dql+fPna9q0afrNb36jzZs366abblKjRo00ceJEp8ur5LbbblMwGNTZZ5+t1NRUlZaWavbs2Ro7dqzTpdVq//79klTl317ke2527NgxzZgxQ2PGjHHtXfDnzJmjtLQ03XTTTU6XUm+EWhLJy8vTtm3btG7dOqdLqVZRUZGmTJmiVatWqXHjxk6XU6twOKy+ffvq7rvvliT16dNH27Zt0+OPP+7KUHvhhRf07LPP6rnnnlOPHj20detWTZ06VTk5Oa6s1ytOnDih6667TpZlaf78+U6XU6UtW7bokUceUUFBgSvnV0aLw4911KpVK6WmpurAgQMVXj9w4ICys7Mdqqp2kydP1vLly7VmzRpXz6jbsmWLiouLdd555yktLU1paWlau3atHn30UaWlpam0tNTpEito27atzjnnnAqvde/eXYWFhQ5VVLPp06frtttu0+jRo3Xuuedq/Pjxuvnmm5Wfn+90abWK/H0l2t9eJND27NmjVatWuXaV9vbbb6u4uFjt27cv+9vbs2ePbrnlFnXs2NHp8qJGqNVRo0aNdP7552v16tVlr4XDYa1evVoDBw50sLKqWZalyZMna+nSpXrjjTfUqVMnp0uq0cUXX6wPP/xQW7duLXv07dtXY8eO1datW5Wamup0iRUMHjy4UovEJ598og4dOjhUUc2+/fbbSlODU1NTFQ6HHaooep06dVJ2dnaFv71gMKiNGze68m9POhloO3bs0Ouvv66WLVs6XVK1xo8frw8++KDC315OTo6mT5+ulStXOl1e1Dj8WA/Tpk3TxIkT1bdvX/Xv318PP/ywjhw5ohtuuMHp0irJy8vTc889p1deeUUZGRll5x78fr+aNGnicHWVZWRkVDrf17RpU7Vs2dKV5wFvvvlmDRo0SHfffbeuu+46bdq0SQsWLNCCBQucLq1KI0aM0OzZs9W+fXv16NFD//znP/Xggw/qxhtvdLo0SdLhw4e1c+fOsq93796trVu3qkWLFmrfvr2mTp2q3//+9+ratas6deqk22+/XTk5Obr66qtdV2/btm01cuRIFRQUaPny5SotLS37+2vRooUaNWrkqnrbt29fKXRPO+00ZWdn66yzzop3qfXn9OWXieqxxx6z2rdvbzVq1Mjq37+/tWHDBqdLqpKkKh9PPfWU06VFzc2X9FuWZb366qtWz549rfT0dOvss8+2FixY4HRJ1QoGg9aUKVOs9u3bW40bN7Y6d+5s/d///Z8VCoWcLs2yLMtas2ZNlb+vEydOtCzLvqz/9ttvt7Kysqz09HTr4osvtrZv3+7Kenfv3l3t39+aNWtcV29VEvGSfuapAQA8g3NqAADPINQAAJ5BqAEAPINQAwB4BqEGAPAMQg0A4BmEGgDAMwg1AIBnEGoAAM8g1AAAnkGoAQA84/8DLqh68/PCkYQAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 500x500 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#Ein kleines Beispielfachwerk aus drei Stäben, einer Kraft und 3 Lagern\n", + "f=Fachwerk()\n", + "K1=f.addKnoten([0,0])\n", + "K2=f.addKnoten([5,5])\n", + "K3=f.addKnoten([15,0])\n", + "S1=f.addStab(K1,K2)\n", + "S2=f.addStab(K2,K3)\n", + "S3=f.addStab(K1,K3)\n", + "K1.setLager_x()\n", + "K1.setLager_y()\n", + "K3.setLager_y()\n", + "K2.setKraft([10,-40])\n", + "f.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "b5e1614e-7351-4631-8c56-b181b0cc8f7c", + "metadata": { + "tags": [] + }, + "source": [ + "## Grundlegendes zur Berechnung\n", + "Um ein Fachwerk zu lösen gibt es verschiedene Möglichkeiten. Zum einen kann das Ritterschnitt-Verfahren verwendet werden, das ein Mensch normalerweise verwenden würde. Dabei wird das Fachwerk beliebig geschnitten und über Kraft- und Momentengleichgewichte versucht, die Stabkräfte zu ermitteln. Das Verfahren benötigt eine geringe Anzahl von Rechenschritten, ist aber anhängig davon, wie geschickt die Schnitte gelegt werden.\\\n", + "Die Alternative ist das Rundschnittverfahren, bei dem einfach das Kräftegleichgewicht an jedem Punkt des Fachwerks gebildet wird. Das Rundschnittverfahren benötigt zwar sehr viel mehr Rechenschritte, ist aber viel einfacher. Da ein Computer sehr schnell rechnen kann, aber eher kein intelligentes Verhalten an den Tag legt, ist das Rundschnittverfahren für eine Lösung mit dem Computer besser geeignet." + ] + }, + { + "cell_type": "markdown", + "id": "ef2f7487-4e06-44dd-8f3d-93b93182a8f6", + "metadata": {}, + "source": [ + "### Vorüberlegungen zur Programm-Architektur\n", + "Wir haben bereits eine Klasse für das Fachwerk definiert. Wir könnten sie um eine Lösungsmethode erweitern, es ist aber auch möglich, für die Lösung des Fachwerks eine neue Klasse zu definieren. Dafür sprechen mehrere Dinge:\n", + "\n", + "Die *Fachwerk*-Klasse wurde implementiert um ein Fachwerk interaktiv aufzubauen. Die Datenstruktur und die Methoden, sie um neue Elemente zu erweitern, oder bestehende Elemente zu löschen, hängen sehr eng zusammen. Das Lösen des Fachwerks eigentlich nicht. Natürlich müssen wir auf die Datenstruktur zugreifen und Nachbarschaftsbeziehungen etc. auswerten, aber das sollte auch von außerhalb der *Fachwerk*-Klasse funktionieren.\n", + "\n", + "Es könnten unterschiedliche Methoden entwickelt werden ein Fachwerk zu lösen. Alle könnten die gleiche *Fachwerk*-Klasse zur Beschreibung des Problems nutzen. Dadurch wäre eine Erweiterung des Progamms möglich, indem neue Klassen hinzugefügt werden, anstatt bestehende zu verändern. Das ist meistens einfacher.\n", + "\n", + "Objektorientierte Programmierung hat das Ziel, Programme in logische, überschaubare Teile aufzuteilen, die über definierte Schnittstellen miteinander interagieren. Der Funktionsumfang einer Klasse sollte so klein wie sinvoll gehalten werden.\n", + "\n", + "Bei näherer Betrachtung trifft auch alles gesagte auf die plot-Methode der *Fachwerk*-Klasse zu und in der Tat wird bei größeren Softwareprojekten auf eine weitgehende Trennung zwischen Datenstrukturen und deren Darstellung geachtet. Hier ist dieser Teil nur in die *Fachwerk*-Klasse integriert, um den Umfang nicht ausufern zu lassen.\n", + "\n", + "\n", + "\n", + "Wir wollen also das Lösen nicht in die Fachwerkklasse integrieren. Um das zu ermöglichen, sollten wir zunächst durchdenken, was wir von der Fachwerkklasse zur Lösung an Informationen brauchen, um sie entsprechend zu erweitern.\n", + "\n", + "### Vorüberlegung zum Lösen des Fachwerkproblems\n", + "\n", + "Fachwerke werden durch Gleichgewichtsbedingungen gelöst. Mit den Unbekannten führt das zu einem linearen Gleichungssystem, das gelöst werden muss. Das Bild zeigt die beteiligten Kräfte am Beispielsystem mit den 3 Stäben\n", + "\n", + "<img src='Fachwerk.svg' width=\"800\" height=\"800\">\n", + "\n", + "\n", + "Die Unbekannten sind die Stabkräfte und die Lagerkräfte. Um das Gleichungssystem lösen zu können, benötigen wir so viele Gleichungen, wie unbekannte. Bei einem Fachwerk im 2D Raum:\n", + "* 2 Gleichungen pro Knoten. Das Kräftegleichgewicht in x- und in y- Richtung\n", + "* eine Unbekannte pro Stab (die Stabkraft)\n", + "* eine Unbekannte pro Lager (die Lagerreaktion)\n", + "\n", + "Da wir so viele Gleichungen wie Unbekannte benötigen, ist eine notwendige Bedingung zur Lösbarkeit des Fachwerks, dass 2x die Anzahl der Knoten gleich der Anzahl der Stäbe plus der Anzahl der Lagerreaktionen bzw. der festgehaltenen Bewegungen sein müssen.\n", + "Diese Gleichung sollte aus TM bekannt sein und ist eine notwendige Bedingung zur statischen Bestimmtheit, allerdings ist es keine hinreichende Bedingung.\n", + "\n", + "Diese Gleichung ist so einfach, dass es sinvoll ist, sie in die Fachwerkklasse mit aufzunehmen. Das macht auch Sinn, da man so nach der Definition des Fachwerks direkt überprüfen kann, ob das Fachwerk potentiell lösbar ist. Ansonsten müssen wir es eh noch verändern.\n", + "\n", + "Zur Lösung selbst:\n", + "\n", + "Wir müssen die 2 Gleichungen an jedem Knoten aufstellen. Also brauchen wir eine Liste aller Knoten im Fachwerk für eine Schleife.\n", + "\n", + "#### Das Kräftegleichgewicht an den Knoten:\n", + "\n", + "Versuchen wir das Kräftegleichgewicht am Beispiel vom oberen Knoten (K2) des Dreiecks aufzustellen.\n", + "\n", + "<img src='Fachwerk_K2.svg' width=\"400\" height=\"400\">\n", + "\n", + "$$\\vec{F_{S1}}+\\vec{F_{S2}}+\\vec{F_{ext}}=0$$\n", + "\n", + "Jeder Stab, der mit dem Knoten verbunden ist, hat Einfluss auf das Kräftegleichgewicht. Eine positive Stabkraft ist eine Zugkraft. Die Kraft ist unsere Unbekannte, die Richtung des Stabes ist die die Richtung der Kraft. Da eine positive Kraft eine Zugraft ist, liegt der Kraftvektor in Richtung des Stabes und Zeigt vom Knoten weg. Seine Länge ist die unbekannte Kraft. Pro Stab gibt es also nur eine unbeknnte Kraft und eine bekannte Richtung. Nennen wir den Einheitsvektor der in Richtung des Stabes verläuft und vom Punkt weg zeigt $\\vec{d}$.\\\n", + "\n", + "Zusätzlich greifen noch externe Kräfte an unserem Knoten an. Diese sind bekannte größen und werden zum Kraftgleichgewicht hinzuaddiert.\n", + "\n", + "$$\\vec{d_{S1}}*f_{S1}+\\vec{d_{S2}}*f_{S2}+\\vec{F_{ext}}=0$$\n", + "\n", + "Wie müssen also für jeden Stab einen Einheitsrichtungsvektor berechnen können, der vom Punkt wegzeigt.\n", + "\n", + "Wenn wir die gleiche Überlegung mit Knoten K1 anstellen, kommen noch die Lagerbindungen hinzu. Die Lager sind weitere unbekannte Kräfte, die an einem Knoten angreifen. Ihre Richtung ist entweder die x-Richtung oder die y-Richtung, also bekannt.\n", + "\n", + "<img src='Fachwerk_K1.svg' width=\"400\" height=\"400\">\n", + "\n", + "$$\\vec{d_{S1}}*f_{S1}+\\vec{d_{S3}}*f_{S3}+\\vec{x}*f_{L1}+\\vec{y}*f_{L2}=0$$\n", + "\n", + "\n", + "Wir können jetzt festlegen, welche Auskünfte über das Fachwerk zur Lösung benötigt werden\n", + "\n", + "- Wir müssen wissen, wie viele Gleichungen wir aufstellen können. Wir brauchen dazu im Fachwerk eine Methode um die Anzahl der Knoten zu ermitteln\n", + "- Wir müssen wissen, wie viele Unbekannte wir haben, damit wir feststellen können, ob die Matrix überhaupt quadratisch ist. Dafür brauchen wir eine Methode um die Anzahl der Stäbe zu ermitteln und eine Methode um die gesamte Anzahl an Lagerbedingungen zu ermitteln\n", + "- Wir brauchen in der Fachwerk Klasse eine Methode, die bestimmt, ob das Fachwerk prinzipiell statisch bestimmt sein kann. Diese braucht die beiden vorhergehenden Informationen\n", + "\n", + "- Wir müssen wissen, welche Stäbe mit einem Knoten verbunden sind. Diese Frage kann ein Knotenobjekt bereits beantworten. Wir haben das schon für das Löschen von Knoten gebraucht\n", + "- Wir müssen wissen, welche externen Kräfte an einem Knoten angreifen. Diese Frage kann das Knotenobjekt beantworten, das die externen Kräfte ein Attribut des Knotens sind.\n", + "- Wir müssen wissen, welche Lagerbedingungen an einem Knoten definiert sind. Auch das ist bereits ein Attribut eines Knoten-Objekts\n", + "- Wir brauchen einen Einheitsvektor in Richtung eines Stabes, der vom Knoten wegzeigt. Das fehlt noch\n", + "- Wir müssen zwei Gleichungen pro Knoten aufstellen. Wir brauchen also eine Liste aller Knoten für eine Schleife. \n", + "\n", + "Zusätzlich sollten wir noch eine Methode zum Zugriff auf die Stabliste erstellt. Das ist nach den oben genannten Kriterien nicht nötig, aber wir werden sie später benötigen. Ich möchte euch erstparen, den ganzen Quellcode der Fachwerk-Klassen noch einmal zu kopieren\n", + "\n", + "Gehen wir nun die fehlenden Teile an:\n", + "Die Anzahl der Knoten und Stäbe ist einfach. Es ist die Länge der entsprechenden Liste.\n", + "\n", + "Für die Anzahl der Lagerbedingungen brauchen wir eine Schleife, die zusammenzählt, wie viele Lager auf den Knoten definiert sind.\n", + "\n", + "#### Zugriff auf die Listen\n", + "\n", + "Die Listen existieren bereits. Sie sind mit einem Unterstrich markiert und ein direkter Zugriff sollte vermieden werden, da die Liste nur durch die Fachwerkklasse verändert werden sollte. Wir könnten die Liste direkt verwenden, besser ist allerdings eine Methode getKnoten bzw. getStaebe zu implementieren, die eine flache Kopie der Liste zurückgibt um sicherzustellen, das sie nicht ausversehen verändert wird\n", + "\n", + "#### Die Richtung der Stäbe\n", + "\n", + "Ein Stab-Objekt speichert seine beiden Endpunkte. Es ist also möglich, die Richtung des Stabes als Vektor innerhalb eines Stab-Objektes zu berechnen. Wir brauchen ihn allerdings immer wegzeigend von dem Punkt, für den wir das Gleichungssystem gerade aufstellen möchten. Um das zu erreichen brauchen wir beide Endpunkte des Stabes und müssen zusätzlich festlegen, welcher der beiden Punkte der Anfangspunkt des Vektors ist. Die Methode kann also in der Stab-Klasse implementiert werden und braucht einen Parameter, der festlegt, von welchem Punkt wegzeigend wir den Richtungsvektor brauchen\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9bab3a8b-234f-40d7-a772-5c6d3414b6b2", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as mpatches\n", + "%matplotlib inline\n", + "\n", + "class Knoten:\n", + " def __init__(self, coo):\n", + " self._coo=np.array(coo)# wir sollten sicherstellen, das es sich bei der intern gespeicherten Koordinate um ein np.array handelt. Potentiell sollte noch der Datentyp auf Fließkomma gesetzt werden und die Größe überprüft werden\n", + " self._kraft=np.zeros(2) #die Kraft ist standardmäßig 0\n", + " self._lager=[False,False] #Beide Lagerbedingungen sind nicht gesetzt\n", + " \n", + " self._staebe=[] #Es gibt bei Erstellung noch keine benachbarten Stäbe\n", + " def _addStab(self,stab):\n", + " self._staebe.append(stab)#Einen neuen Nachbarstab hinzufügen\n", + " def _removeStab(self,stab):\n", + " self._staebe.remove(stab)#Einen Nachbarstab entfernen\n", + " \n", + " def setKraft(self,kraft):\n", + " self._kraft[:]=kraft#Die Einträge von Kraft werden neu gesetzt. So ist sichergestellt, das die Attribute immer ein 2D-Vektor ist\n", + " def setLager_x(self):\n", + " self._lager[0]=True#Setze die Lagerbedingung in x-Richtung\n", + " def setLager_y(self):\n", + " self._lager[1]=True#Setze die Lagerbedingung in y-Richtung\n", + " def removeLager_x(self):\n", + " self._lager[0]=False#Entferne die Lagerbedingung in x-Richtung\n", + " def removeLager_y(self):\n", + " self._lager[1]=False#Entferne die Lagerbedingung in y-Richtung\n", + "\n", + " def getKoordinate(self):\n", + " return self._coo#gibt die Koordinaten des Punktes zurück\n", + "\n", + "class Stab:\n", + " def __init__(self,k1,k2):\n", + " self.k1=k1#Der erste Endpunkt\n", + " self.k2=k2#Der zweite Endpunkt\n", + " #######################################################In diesem Schritt neu####################################################\n", + " def getRichtung(self,k):\n", + " if k == self.k1:#Falls der gerade betrachtete Punkt k1 ist\n", + " vektor= self.k2.getKoordinate()-k.getKoordinate()#bilde den Richtungsvektor von K1(bzw. K) zu K2\n", + " return vektor/np.linalg.norm(vektor)#Durch den Betrag teilen und zurückgeben\n", + " if k == self.k2:#Falls der gerade betrachtete Punkt k2 ist\n", + " vektor= self.k1.getKoordinate()-k.getKoordinate()#Bilde den Richtungsvektor von K2(bzw. K) zu K1\n", + " return vektor/np.linalg.norm(vektor)#Durch den Betrag teilen um Einheitsvektor zu erhalten\n", + " return np.zeros(2)#nur als Fail-Safe, wenn der betrachtete Punkt nicht zum Stab gehört\n", + " ################################################################################################################################\n", + "class Fachwerk:\n", + " ####################################################In diesem Schritt neu########################################################\n", + " def getKnoten(self):\n", + " return self._knoten[:]#Eine flache Kopie der Knotenliste\n", + " def getStaebe(self):\n", + " return self._staebe[:]#Eine flache Kopie der Stabliste\n", + " def getNumKnoten(self):\n", + " return len(self._knoten)#Die Länge der Knotenliste\n", + " def getNumStaebe(self):\n", + " return len(self._staebe)#Die Länge der Stabliste\n", + " def getNumLager(self):\n", + " numLager=0#Eine Variable die zählt, wie viele Lager gefunden wurden\n", + " for knoten in self._knoten:#Eine Schleife über alle Knoten\n", + " if knoten._lager[0]:#Falls der Knoten eine Lagerbedingung in x-Richtung besitzt\n", + " numLager+=1#Die Zählvariable hochzählen\n", + " if knoten._lager[1]:#Falls der Knoten eine Lagerbedingung in y-Richtung besitzt\n", + " numLager+=1#Die Zählvariable hochzählen\n", + " return numLager#Die Gesamtzahl der Lager zurückgeben\n", + " def isStatischBestimmt(self):\n", + " unbekannte=self.getNumStaebe()+self.getNumLager()#Die Anzahl der Unbekannten ist die Zahl der Stäbe plus die Zahl der Lager\n", + " gleichungen=self.getNumKnoten()*2#Die Zahl der Gleichungen ist die Zahl der Knoten mal zwei\n", + " return unbekannte==gleichungen#Zurückgeben ob die Zahl der Unbekannten gleich der Zahl der Gleichungen ist\n", + " #################################################################################################################################\n", + " def removeStab(self,stab):\n", + " if stab in self._staebe:#Überprüfen ob der Stab zum Fachwerk gehört\n", + " stab.k1._removeStab(stab)#Der Stab ist kein Nachbar seiner Endpunkte mehr\n", + " stab.k2._removeStab(stab)\n", + " self._staebe.remove(stab)#Den Stab aus der Liste der Stäbe entfernen\n", + " \n", + " def removeKnoten(self,knoten):\n", + " if knoten in self._knoten:#Überprüfen, ob der Knoten zum Fachwerk gehört\n", + " for stab in knoten._staebe[:]:#Über alle Stäbe in der Nachbarschaft iterieren (bzw. einer flachen Kopie, da die Liste verändert wird)\n", + " self.removeStab(stab)#Den Stab entfernen (das verändert die Nachbarschaftsliste des Knotens, dh. wird über eine flache Kopie iteriert\n", + " self._knoten.remove(knoten)#Den Knoten aus der Liste der Knoten entfernen\n", + " def __init__(self):\n", + " self._knoten=[]\n", + " self._staebe=[]# Wir erstellen erst einmal leere Listen für die Stäbe und Knoten\n", + " def addKnoten(self, coo):\n", + " neuer_knoten=Knoten(coo)#Neues Knotenobjekt anlegen\n", + " self._knoten.append(neuer_knoten)#Zur Liste hinzufügen\n", + " return neuer_knoten#Und das neue Objekt zurückgeben\n", + " def addStab(self,k1,k2):\n", + " if not k1 in self._knoten:#Überprüfen, ob die Endpunkte überhaupt zum Fachwerk gehören\n", + " return None\n", + " if not k2 in self._knoten:\n", + " return None\n", + " neuer_stab=Stab(k1,k2)#Neuen Stab anlegen\n", + " k1._addStab(neuer_stab)#Der neue Stab ist nun ein Nachbar der Endknoten\n", + " k2._addStab(neuer_stab)\n", + " self._staebe.append(neuer_stab)#Stab in die Liste der Stäbe einfügen\n", + " return neuer_stab#Und neuen Stab zurückgeben\n", + " def plot(self):\n", + " fig= plt.figure(figsize=(5, 5))\n", + " ax = fig.subplots()#Figure und Diagramm ersellen\n", + " #zunaechst alle Knoten darstellen. Matplotlib erwartet dafür eine Darstellung in der Form [x_0,x_1,...],[y_0,y_1,..]\n", + " x_werte=[]#Eine Liste für die x- und y-Werte der Knoten\n", + " y_werte=[]\n", + " for knoten in self._knoten:#Über die Knoten iterieren\n", + " koordinate=knoten.getKoordinate()#die Koordinate holen\n", + " x_werte.append(koordinate[0])#den x-Wert zu den x-Werten hinzufügen\n", + " y_werte.append(koordinate[1])#den y-Wert zu den y-Werten hinzufügen\n", + " if np.linalg.norm(knoten._kraft)>0.0001:#Schauen, ob eine Gesamtkraft angreift. Direkte Vergleiche zwischen Fließkommazahlen vermeiden. Diese Methode der Überprüfung ist nicht ideal\n", + " kraftvektor=knoten._kraft/np.linalg.norm(knoten._kraft)#Normalenvektor der Kraft berechnen. Die Kraftvektorendarstellung ist sonst sehr lang, da Kräfte oft verhältnismäßig große Zahlen\n", + " pfeil=mpatches.FancyArrowPatch((koordinate[0]-kraftvektor[0],koordinate[1]-kraftvektor[1]),(koordinate[0],koordinate[1]),mutation_scale=30,ec=\"r\",fc=\"r\")#Pfeil in Rot zeichnen\n", + " ax.add_patch(pfeil)#Pfeil dem Diagrmm hinzufügen\n", + " if knoten._lager[0]:#Falls ein Lager in x-Richtung existiert\n", + " pfeil=mpatches.FancyArrowPatch((koordinate[0]-1,koordinate[1]),(koordinate[0],koordinate[1]),mutation_scale=30,ec=\"b\",fc=\"b\")#Einen Pfeil in Blau Zeichnen, in X-Richtung, auf den Knoten zu\n", + " ax.add_patch(pfeil)#Pfeil dem Diagramm hinzufügen\n", + " if knoten._lager[1]:# Das Gleiche für Y-Richtung\n", + " pfeil=mpatches.FancyArrowPatch((koordinate[0],koordinate[1]-1),(koordinate[0],koordinate[1]),mutation_scale=30,ec=\"b\",fc=\"b\")\n", + " ax.add_patch(pfeil)\n", + " ax.scatter(x_werte,y_werte)#Zeichnet alle Knoten als Kreise\n", + " #als nächstes alle Stäbe\n", + " for stab in self._staebe:#Über alle Stäbe iterieren\n", + " koordinate1=stab.k1.getKoordinate()#Koordinate des ersten Punktes holen\n", + " koordinate2=stab.k2.getKoordinate()#Und des zweiten Punktes\n", + " ax.plot([koordinate1[0],koordinate2[0]],[koordinate1[1],koordinate2[1]],\"r\")#Zeichent einen Stab in rot. Durch die andere vorgesehene Nutzung von Matploltib müssen wir uns die x und y Koordinaten der Punkte etwas umständlich umsortieren" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b00e4e7a-cc18-4201-bc62-310685bc8d28", + "metadata": {}, + "outputs": [], + "source": [ + "f=Fachwerk()\n", + "K1=f.addKnoten([0,0])\n", + "K2=f.addKnoten([5,5])\n", + "K3=f.addKnoten([15,0])\n", + "S1=f.addStab(K1,K2)\n", + "S2=f.addStab(K2,K3)\n", + "S3=f.addStab(K1,K3)\n", + "K1.setLager_x()\n", + "K1.setLager_y()\n", + "#K3.setLager_y()# Wir lassen hier ein Lager weg. So ist das Fachwerk statisch unterbestimmt\n", + "K2.setKraft([10,-40])\n", + "f.plot()\n", + "if f.isStatischBestimmt():\n", + " print (\"Das Fachwerk kann statisch bestimmt sein\")\n", + "else:\n", + " print (\"Das Fachwerk ist nicht statisch bestimmt\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be6ae742-ac32-4cc8-852e-656faf3df60f", + "metadata": {}, + "outputs": [], + "source": [ + "K3.setLager_y()#Das Lager hinzufügen um herauszufinden, ob das Fachwerk jetzt statisch bestimmt ist\n", + "f.plot()\n", + "if f.isStatischBestimmt():\n", + " print (\"Das Fachwerk kann statisch bestimmt sein\")\n", + "else:\n", + " print (\"Das Fachwerk ist nicht statisch bestimmt\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e32ad128-170a-40f3-a9e6-02d4253fa580", + "metadata": {}, + "outputs": [], + "source": [ + "S1.getRichtung(K2)#Testen, ob der Richtungsvektor korrekt berechnet wird" + ] + }, + { + "cell_type": "markdown", + "id": "c9a654cf-8c53-4336-8fc4-ad0ebf851a3a", + "metadata": {}, + "source": [ + "So weit so gut.\n", + "## **Schritt 2 - Berechnung der Lösung**\n", + "\n", + "### Überlegungen zur Softwarearchitektur\n", + "Jetzt die Berechnung des Fachwerks. Wir brauchen etwas in der Art *SolveFachwerk*. Eigentlich ist das Lösen eines Fachwerks eine Tätigkeit, also könnte man es als Funktion ansehen. Das Lösen des Fachwerks wird allerdings einiges an zusätzlichen Datenstrukturen benötigen. Daher ist eine Klasse die bessere Wahl. Klassen, die so tun, als wären sie Funktionen, sind bei der Objektorientierten Programmierung nichts ungewöhnliches. Der Zweck ist, die Funktion in mehrere Teilfunktionen aufzuteilen, die in einer Klasse gebündelt werden und die benötigten Daten zusammenzuhalten. Es gibt verschiedene Ideen, so etwas umzusetzen.\\\n", + "Da wir an dieser Stelle keine Theorievorlesung über Softwarearchitektur halten, machen wir es einfach. Wir übergeben der Klasse *SolveFachwerk* einfach ein Fachwerk-Objekt in der *\\_\\_init\\_\\_* Methode, die das Fachwerk löst. Wie wir an das Ergebnis kommen, überlegen wir uns bei der Auswertung der Ergebnisse. Jetzt müssen wir erst einmal wissen, wie wir das Fachwerk eigentlich genau lösen wollen.\n", + "\n", + "Wir wollen nicht anfangen, das lineare Gleichungssystem selbst zu lösen. Dafür gibt es bereits in *numpy* unzählige Möglichkeiten. Diese basieren mehr oder weniger auf der inversion einer Matrix. Wir müssen das Gleichungssystem also als Matrix darstellen. Jeder Spalte ist eine Unbekannte zugeordnet, jeder Zeile eine Gleichung. Damit die Matrix überhaupt invertiert werden kann muss sie quadratisch sein, was ja durch die Bedingung so viele Gleichungen wie Unbekannte immer erfüllt ist.\n", + "\n", + "Um zu sehen, wie man das Gleichungssystem als Matrix schreibt betrachten wir wieder den Knoten K2:\n", + "\n", + "wir haben die Stäbe S1 und S3 mit ihren Einheitsrichtungsvektoren $d_{S1}$ und $d_{S2}$, die mit diesem Knoten verbunden sind und die externen Kräfte $F_{ext}$, die am Knoten angreifen. Ein Kräftegleichgewicht in Vektorschreibweise hatten wir bereits oben aufgeschrieben\n", + "\n", + "$$\\vec{d_{S1}}*f_{S1}+\\vec{d_{S2}}*f_{S2}+\\vec{F_{ext}}=0$$\n", + "\n", + "Da die Vektoren 2-dimensional sind, haben wir somit gleich beide Gleichungen. Diese müssen in eine Matrixschreibweise. In der Matrix würde jede Spalte einer Unbekannten und jede Zeile einer Gleichung entsprechen. Also für das gesamte Stabsystem:\n", + "\n", + "$$\\left[ {\\begin{array}{cc} . & & & & &\\\\ &. & & & &\\\\ & &. & & &\\\\ & & & .& &\\\\ & & & & .&\\\\ & & & & &.\\\\ \\end{array} }\\right] \\times \\left[{\\begin{array}{cc}S_1 \\\\ S_2 \\\\ S_3 \\\\L_1 \\\\ L_2 \\\\L3 \\end{array}}\\right]+\\left[{\\begin{array}{cc}0 \\\\ 0 \\\\ f_{ext} \\\\f_{ext} \\\\ 0\\\\0 \\end{array}}\\right]=0$$\n", + "Unser Knoten entspricht 2 beliebigen Zeilen der Matrix und würde so aussehen:\n", + "\n", + "$$\\left[{\\begin{array}{cc} d_{S1,x} & 0 & d_{S2,x} & 0 & 0 &0\\\\ d_{S1,y} & 0 & d_{S2,y} & 0 & 0&0\\\\ \\end{array} }\\right] \\times \\left[{\\begin{array}{cc}S_1 \\\\ S_2 \\\\ S_3 \\\\L_1 \\\\ L_2 \\\\L3 \\end{array}}\\right]+\\left[{\\begin{array}{cc} f_{ext,x} \\\\f_{ext,y} \\\\ \\end{array}}\\right]=0$$\n", + "\n", + "\n", + "Wir füllen also für jeden Punkt zwei Zeilen der Matrix aus. Die Richtungsvektoren der Stäbe kommen in die entsprechende Spalte und wir wiederholen das für alle Punkte. Die Lagerkräfte kommen wie Stabkräfte in dieses Gleichungssystem, nur das ihre Richtungsvektoren immer der x- oder y-Vektor sind.\n", + "\n", + "Die Aufgabe ist nun, diese Matrix für das Stabtragwerk aufzustellen. Hierbei sind zwei Fragen ungeklärt:\n", + "\n", + "1. In welche beiden Spalten schreiben wir die Gleichungen eines bestimmten Knotens?\n", + "2. Welche Zeile entspricht welchem Stab bzw. welcher Randbedingung?\n", + "\n", + "Bei der ersten Frage können wir einen kleinen Trick benutzen. Wir werden per Schleife das Kräftegleichgewicht an jedem Punkt aufstellen. Jede Zeile wird komplett an einem Knoten aufgestellt. Also fangen wir mit dem Ersten Knoten in der 0. und 1. Zeile an und machen beim nächsten Knoten mit der 2. und 3. Zeile weiter. Die Reihenfolge der Gleichungen ist irrelevant, solange die zugehörigen externen Kräfte an der richtigen Stelle im Kraftvektor stehen.\n", + "\n", + "Die zweite Frage ist etwas schwieriger zu beantworten. Wir müssten unsere Stäbe und Lager durchnummerieren. Diese nummerierung muss bei 0 beginnen und dicht sein (daher keine Zahl darf übersprungen werden).\\\n", + "Wir könnten das bereits bei der Erstellung des Fachwerks angehen und jedem Stab eine Nummer geben, die er als Attribut speichert. Das Problem bei diesem Vorgehen ist, dass wir dadurch, dass Stäbe gelöscht werden können, irgendwie sicherstellen müssen, dass zum Schluss auch jede Nummer vergeben ist.\\\n", + "Eine andere Möglichkeit wäre, die Stäben vor der eigentlichen Lösung durchzunummerieren. Sie stehen in einer Liste und es ist kein Problem, jedem Stab eine Nummer zu geben. Wir sollten diese Nummer allerdings nicht als Attribut im Stab speichern. Die Nummer hat eigentlich nur etwas mit der Lösung und nicht mit dem Stab zu tun. Außerdem müssen wir zusätzlich die Randbedingungen unterbringen. Die Aufgabe ist also ein Objekt, sei es ein Stab oder ein Knoten, mit einer Zahl in Verbindung zu bringen. Dazu können wir ein *dictionary* verwenden. Für jeden Stab hinterlegen wir in diesem *dictionary* eine Stab-Nummer (das *dictionary* ist im Python-Grundlagen Notebook beschreiben).\n", + "Die Knoten können zwei Lagerbedingungen haben. An dieser Stelle rächt sich die Faulheit, für die Randbedingungen keine extra-Klasse implementiert zu haben (vgl. Designentscheidung letzte Übung). Wir behelfen uns hier mit einem Workarround, anstatt entsprechende Änderungen vorzunehmen. Wir speichern für jedes Knotenobjekt, das mindestens eine Lagerbedingung hat, eine Liste mit zwei Einträgen. Diese Einträge sind die Spaltennummern der Lagerkraft in x- und y-Richtung. Allerdings kann ein Knoten auch nur eine von zwei möglichen Lagerbedingungen haben, benötigt dann also nur eine Spalte. In diesem Fall schreiben wir in den nicht genutzten Eintrag einfach eine -1 als ungültige Spalte. \n", + "\n", + "Fangen wir damit an, die Nummerierung umzusetzen:\n", + "- Klasse LoeseFachwerk definieren\n", + "- \\_\\_init\\_\\_ Funktion bekommt ein Fachwerk als Parameter, das als Attribut gespeichert wird\n", + "- Es wird überprüft, ob das Fachwerk überhaupt statisch bestimmt sein kann. Ansonsten abbruch\n", + "- Es wird eine Matrix benötigter Größe (2xKnotenzahl, quadratisch) und ein Vektor für die externen Kräft als Attribute angelegt, die mit 0 Einträgen gefüllt sind\n", + "- Eine Methode wird aufgerufen, die die unbekannten Größen durchnummeriert. Diese Methode ist Teil der Klasse. Das Ergebnis wird als Attribut gespeichert und ist ein *dictionary*\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c43e9543-8c90-43ec-9f3e-fd292c5d0546", + "metadata": {}, + "outputs": [], + "source": [ + "class LoeseFachwerk:\n", + " def __init__(self,fachwerk):\n", + " self.fachwerk=fachwerk\n", + " if not fachwerk.isStatischBestimmt():\n", + " return\n", + " self.matrix=np.zeros((fachwerk.getNumKnoten()*2,fachwerk.getNumKnoten()*2))\n", + " self.kraftvektor=np.zeros(fachwerk.getNumKnoten()*2)\n", + " self._nummeriereKnoten()\n", + " \n", + " def _nummeriereKnoten(self):\n", + " nummernUnbekannte={}\n", + " nr=0\n", + " for stab in self.fachwerk.getStaebe():\n", + " nummernUnbekannte[stab]=nr\n", + " nr+=1\n", + " for knoten in self.fachwerk.getKnoten():\n", + " if knoten._lager[0] or knoten._lager[1]:\n", + " nummern=[-1,-1]\n", + " if knoten._lager[0]:\n", + " nummern[0]=nr\n", + " nr+=1\n", + " if knoten._lager[1]:\n", + " nummern[1]=nr\n", + " nr+=1\n", + " nummernUnbekannte[knoten]=nummern\n", + " self.nummernUnbekannte=nummernUnbekannte\n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "fbf1d1a4-e846-45d1-9858-2fd073d86ddc", + "metadata": {}, + "source": [ + "Jetzt programmieren wir eine Methode *baueSystem*, die die Matrix und den Vektor aufbauen. Dazu müssen wir eine Schleife über alle Knoten laufen lassen. In der Schleife müssen wir mitzählen, beim wie vielten Knoten wir gerade sind, damit wir die Einträge in die richtigen beiden Zeilen der Matrix schreiben. Anschließend müssen wir für jeden Knoten über alle angrenzenden Stäbe iterieren. Für jeden Stab müssen wir den Richtungsvektor in die richtige Spalte der beiden Zeilen schreiben. Anschließend müssen wir die externen Kräfte in den Vektor schreiben. Das können wir für jeden Knoten so machen, da die Knoten ohne Kraft eine angreifende Kraft von 0 gespeichert haben. Abschließend müssen wir überprüfen, ob eine Lagerbedingung in x-Richtung existiert. Falls ja, müssen wir eine 1 (der Einheitsvektor in Richtung der Lagerkraft) in die x-Spalte und die entsprechende Zeile schreiben. Für das y-Lager müssen wir sinngemäß das gleiche machen. Es gibt hier viele Wege, die zum Ziel führen. Mein Beispiel verwendet die Möglichkeit der \"range\" indizierung mit dem : , die von Listen bekannt ist.\n", + "\n", + "Anschließend können wir das Gleichungssystem lösen. Bezeichnen wir die Matrix als $\\underline{M}$, den Vektor der externen Kräfte als $\\underline{F}$ und den Vektor der unbekannten Kräfte als $\\underline{U}$ erhalten wir\n", + "$$ \\underline{M} * \\underline{U} + \\underline{F}=0 $$\n", + "bzw. umgestellt\n", + "$$ \\underline{M} * \\underline{U}=- \\underline{F} $$\n", + "\n", + "diese Version kann wahlweise über die Inversion von $\\underline{M}$ gelöst werden, oder durch die Funktion *np.linalg.solve* von numpy. Letztere funktioniert schneller. Die Ergebnisse können wir vorerst in einem Attribut *result* speichern. Darüber, wie wir diese Ergebnisse sinvoll zur Verfügung stellen, machen wir uns gedanken, wenn wir sie ausgeben wollen." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14af12c8-912c-49e0-a30a-01c726cc267b", + "metadata": {}, + "outputs": [], + "source": [ + "class LoeseFachwerk:\n", + " def __init__(self,fachwerk):\n", + " self.fachwerk=fachwerk#Das Fachwerkobjekt speichern, da die anderen Methoden es brauchen\n", + " if not fachwerk.isStatischBestimmt():#Falls das Fachwerk nicht statisch bestimmt ist hier abbrechen\n", + " return\n", + " self.matrix=np.zeros((fachwerk.getNumKnoten()*2,fachwerk.getNumKnoten()*2))#Eine Matrix der benötigten Größe mit Nullen anlegen. Wenn wir hier angekommen ist, ist die Matrix quadratisch\n", + " self.kraftvektor=np.zeros(fachwerk.getNumKnoten()*2)#Den Gesamtkraftvektor mit Nullen erstellen\n", + " self._nummeriereKnoten()#Dictionary mit Knotennummern erstellen\n", + " self._baueSystem()#Matrix und Vektor aufbauen\n", + " result=np.linalg.solve(self.matrix,-self.kraftvektor)#Gleichungssystem lösen (Grund für das Minus oben)\n", + " self.result=result#Ergebnis speichern\n", + " #####################################In diesem Schritt neu###############################################\n", + " def _baueSystem(self):\n", + " i=0#Variable um mitzuzählen, welche Zeilen wir belegen\n", + " for knoten in self.fachwerk.getKnoten():#Über alle Knoten iterieren\n", + " zeilen=self.matrix[i:i+2,:]#Die beiden Zeilen der Matrix. Wir erschaffen einen View, die Gesamtmatrix wird also mitverändert\n", + " for stab in knoten._staebe:#Über alle verbundenen Stäbe iterieren\n", + " spalte=self.nummernUnbekannte[stab]#Die Spalte, die zum Stab gehört herausfinden\n", + " zeilen[:,spalte]=stab.getRichtung(knoten)#In diese Spalte der zwei Zeilen den Richtungsvektor des Stabes weg von diesem Knoten schreiben\n", + " self.kraftvektor[i:i+2]=knoten._kraft#Die Kraft in den Kraftvektor einfügen\n", + " if knoten._lager[0]:#Falls der Knoten ein x-Lager besitzt\n", + " zeilen[0,self.nummernUnbekannte[knoten][0]]=1.#in die erste Zeile in der betreffenden Spalte eine 1 Einfügen\n", + " if knoten._lager[1]:#Das Gleiche für das y-Lager, nur in der zweiten Zeile\n", + " zeilen[1,self.nummernUnbekannte[knoten][1]]=1\n", + " i+=2#In der nächsten Iteration zwei Zeilen weiter schreiben\n", + " #########################################################################################################\n", + " def _nummeriereKnoten(self):\n", + " nummernUnbekannte={}#Ein leeres Dictionary\n", + " nr=0#ein Zähler, welche Spalte die nächste unbelegte ist\n", + " for stab in self.fachwerk.getStaebe():#über alle Stäbe iterieren\n", + " nummernUnbekannte[stab]=nr#In das Dictionary für dieses Stabobjekt die nächste freie Spalte hinterlegen\n", + " nr+=1#Die aktuelle Spalte ist belegt\n", + " for knoten in self.fachwerk.getKnoten():#Über alle Knoten iterieren\n", + " if knoten._lager[0] or knoten._lager[1]:#Falls der Knoten ein Lager in x- oder y-Richtung besitzt\n", + " nummern=[-1,-1]#Erst einmal eine Liste mit zwei ungültigen Indizes erstellen\n", + " if knoten._lager[0]:#Falls der Knoten eine Lagerbedingung in x-Richtung besitzt\n", + " nummern[0]=nr#Der x-Richtung die nächste Spalte zuordnen\n", + " nr+=1#Die aktuelle Spalte ist belegt, die nächste leere auswählen\n", + " if knoten._lager[1]:#das Gleiche für die y-Richtung\n", + " nummern[1]=nr\n", + " nr+=1\n", + " nummernUnbekannte[knoten]=nummern#Die erstellte Liste für dieses Knoten-Objekt hinterlegen\n", + " self.nummernUnbekannte=nummernUnbekannte#Die Liste als Attribut der Klasse speichern" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97dcd356-3613-498d-b73b-a189d2810704", + "metadata": {}, + "outputs": [], + "source": [ + "#Ein kleines Beispielfachwerk aus drei Stäben, einer Kraft und 3 Lagern\n", + "f=Fachwerk()\n", + "K1=f.addKnoten([0,0])\n", + "K2=f.addKnoten([5,5])\n", + "K3=f.addKnoten([15,0])\n", + "S1=f.addStab(K1,K2)\n", + "S2=f.addStab(K2,K3)\n", + "S3=f.addStab(K1,K3)\n", + "K1.setLager_x()\n", + "K1.setLager_y()\n", + "K3.setLager_y()\n", + "K2.setKraft([10,-40])\n", + "result=LoeseFachwerk(f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bdb8ae3-7b79-49b1-b642-643e15c6b877", + "metadata": {}, + "outputs": [], + "source": [ + "result.result" + ] + }, + { + "cell_type": "markdown", + "id": "c4ba3e88-28f2-4d2a-b908-5e66f82f54ae", + "metadata": {}, + "source": [ + "### **Aufgaben zum zu Hause ausprobieren**\n", + "- Probiere das Programm an komplizierteren Fachwerken aus (du kannst dich bei deinen TM Übungen inspirieren lassen)\n", + "\n", + "- Die überprüfte Bedingung für statische Bestimmtheit ist nicht die hinreichende Bedingung. Die hinreichende Bedingung wäre zu überprüfen, ob sich die Matrix $\\underline{M}$ invertieren lässt. Setze vor dem Lösungsversuch eine Überprüfung um und breche das Lösen ggf. ab\n", + "\n", + "Eine etwas kompliziertere Aufgabe, wenn du gerne einmal versuchen möchtest, selbst eine komplett neue Funktionalität zu planen und umzusetzen:\n", + "\n", + "- In einem Fachwerk kann es Nullstäbe geben. Versuche eine Methode in der *Fachwerk*-Klasse zu implementieren, die Nullstäbe identifiziert und als Liste zurückgiebt. Die *Fachwerk*-Klasse ist ein guter Ort dafür, da Nulltsäbe ein Phänomen der Fachwerke sind und unabhängig davon, wie man sie löst. Die Regeln für Nullstäbe sollten aus TM bekannt sein.\n", + "\n", + "Diese Aufgabe beinhaltet zwei Schwierigkeiten. Zum Einen musst du Regeln für das Auffinden von Nullstäben programmieren. Zum Anderen können nach dem Auffinden eines Nullstabs weitere Nullstäbe entstehen, da ein Nullstab theoretisch problemlos aus dem Fachwerk entfernt werden kann und dadurch neue Nullstäbe gefunden werden können. Der Algorithmus soll jedoch die Nullstäbe nicht entfernen, sondern lediglich identifizieren" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8f0ea49-3dd0-4082-b19c-1e15c576cc02", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}