// Numbas version: finer_feedback_settings {"name": "Truss: zero force members", "extensions": ["geogebra"], "custom_part_types": [], "resources": [["question-resources/FBD_kZRowVa.png", "FBD_kZRowVa.png"]], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"name": "Truss: zero force members", "tags": ["Mechanics", "mechanics", "Statics", "statics", "truss", "zero-force"], "metadata": {"description": "Given a loaded truss, identify any zero force members by inspection.", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "
{truss}
\nLoads: down is positive
\nLoads and reactions: down is positive
\n{loads[0]} = {f[loads[0]]} {loads[1]} = {f[loads[1]]} {supports[0]} = {reactions[0]} {supports[1]} = {reactions[1]} $\\Sigma M_A:$ = {13 x[loads[0]]+ 17 x[loads[1]] + reactions[0] * x[supports[0]] + reactions[1] * x[supports[1]]}
\nForces in members: Tension is positive
\n{m}
\nJoint Equilibrium:
\nJoint A: {precround(polar(f[\"A\"], -90) + polar(AB,0) + polar(AG,30),1)}, Joint B: {precround(polar(f[\"B\"], -90) + polar(AB,180) + polar(BC,0) + polar(BG,120) + polar(BH,60) ,1)}, Joint C: {precround(polar(f[\"C\"], -90) + polar(BC,180) + polar(CD,0) + polar(CH,120) + polar(CN,60) ,1)}, Joint D: {precround(polar(f[\"D\"], -90) + polar(CD,180) + polar(DE,0) + polar(DO,120) + polar(DL,60),1)},
\nJoint E: {precround(polar(f[\"E\"], -90) + polar(DE,180) + polar(EF,0) + polar(EL,120) + polar(EM,60),1)}, Joint F: {precround(polar(f[\"F\"], -90) + polar(EF,180) + polar(FM,150),1)}, Joint G: {precround(polar(f[\"G\"], -90) + polar(GH,30) + polar(AG,-150) + polar(BG,-60),1)}, Joint H: {precround(polar(f[\"H\"], -90) + polar(HN,0) + polar(CH, -60) + polar(BH,-120) + polar(GH, -150) + polar(HI, 30),1)},
\nJoint I: {precround(polar(f[\"I\"], -90) + polar(IJ,30) + polar(NI,-60) + polar(HI,-150),1)}, Joint J: {precround(polar(f[\"J\"], -90) + polar(JK,-30) + polar(JO,-60) + polar(JN,-120) + polar(IJ,-150),1)}, Joint K: {precround(polar(f[\"K\"], -90) + polar(KL,-30) + polar(KO,-120) + polar(JK,150),1)}, Joint L: {precround(polar(f[\"L\"], -90) + polar(LM,-30 ) + polar(EL, -60) + polar(DL,-120) + polar(LO, 180) + polar(KL, 150),1)},
\nJoint M: {precround(polar(f[\"M\"], -90) + polar(FM,-30) + polar(EM,-120) + polar(LM,150),1)}, Joint N: {precround(polar(f[\"N\"], -90) + polar(NI,120 ) + polar(HN, 180) + polar(JN,60) + polar(CN,-120),1)}, Joint O: {precround(polar(f[\"O\"], -90) + polar(KO, 60) + polar(LO, 0) + polar(JO,120) + polar(DO, -60),1)}
\nLook for situations like 1a) and 2a) in the diagram below.
\n\n\n
In figure 1a), members $AB$ and $AC$ share the same line of action and member $AD$ is zero-force. If a load is added to $A$, then member $AD$ must pick up load to support it and will not be zero-force.
\nIf figure 2a), members $AB$ and $AC$ do not share the same line of action and both must be zero-force to maintain equilibrium of joint $A$. If a load is added at $A$ as shown in figure 2b) then $AB$ and $AC$ will pick up load to maintain equilibrium.
\nWhen a member is identified as zero-force, then it may produce zero-force members at adjacent joints.
", "rulesets": {}, "extensions": ["geogebra"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true, "j": false}, "constants": [], "variables": {"IJ": {"name": "IJ", "group": "members", "definition": "HI + f[\"I\"]* cos(radians(60))", "description": "", "templateType": "anything", "can_override": false}, "DO": {"name": "DO", "group": "members", "definition": "F[\"D\"] / 2.0/ cos(radians(30)) + DE - CD", "description": "", "templateType": "anything", "can_override": false}, "x": {"name": "x", "group": "setup", "definition": "[\"A\":0,\"B\":2,\"C\":4,\"D\":8,\"E\":10,\"F\":12,\n \"G\":1.5,\"H\":3,\"I\":4.5,\"J\":6,\"K\":7.5,\"L\":9,\n\"M\":10.5,\"N\":5,\"O\":7]", "description": "horizontal location as dictionary
", "templateType": "anything", "can_override": false}, "GH": {"name": "GH", "group": "members", "definition": "0.5 f[\"G\"] + AG", "description": "", "templateType": "anything", "can_override": false}, "EL": {"name": "EL", "group": "members", "definition": "F[\"E\"]/sin(radians(60)) - EM", "description": "", "templateType": "anything", "can_override": false}, "BH": {"name": "BH", "group": "members", "definition": "F[\"B\"]/sin(radians(60)) - BG", "description": "", "templateType": "anything", "can_override": false}, "NI": {"name": "NI", "group": "members", "definition": "-f[\"I\"] * cos(radians(30))", "description": "forces in members as dictionary
\n[ \"AB\", \"AG\", \"BC\", \"BG\", \"BH\", \"CD\", \"CH\", \"CN\", \"DE\", \"DL\", \"DO\", \"EF\", \"EL\", \"EM\", \"FM\", \"GH\", \"HI\", \"HN\", \"IJ\", \"JK\", \"JN\", \"JO\", \"KL\", \"KO\", \"LM\", \"LO\", \"NI\" ]
", "templateType": "anything", "can_override": false}, "AB": {"name": "AB", "group": "members", "definition": "-AG cos(radians(30))", "description": "", "templateType": "anything", "can_override": false}, "loads": {"name": "loads", "group": "setup", "definition": "shuffle(set(points)-set(supports))[0..2]\n//[\"J\",\"B\"]//", "description": "2 loads, anywhere but at the supports
\npassed to geogebra
", "templateType": "anything", "can_override": false}, "JN": {"name": "JN", "group": "members", "definition": "NI + CN + HN/cos(radians(60))", "description": "", "templateType": "anything", "can_override": false}, "zeroForce": {"name": "zeroForce", "group": "setup", "definition": "map(if(m[pt]=0,1,0),pt,members)", "description": "This makes a list of true/false values indicating which members are zero-force. 1=zero force
", "templateType": "anything", "can_override": false}, "JK": {"name": "JK", "group": "members", "definition": "KL + F[\"K\"]* cos(radians(60))", "description": "", "templateType": "anything", "can_override": false}, "KL": {"name": "KL", "group": "members", "definition": "2.0 F[\"L\"] + 2.0 (EL + DL) cos(radians(30)) + LM", "description": "", "templateType": "anything", "can_override": false}, "LM": {"name": "LM", "group": "members", "definition": "0.5 F[\"M\"] + FM", "description": "", "templateType": "anything", "can_override": false}, "points": {"name": "points", "group": "setup", "definition": "[\"A\",\"B\",\"C\",\"D\",\"E\", \"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\"]", "description": "names of the points
", "templateType": "anything", "can_override": false}, "EM": {"name": "EM", "group": "members", "definition": "- F[\"M\"] * cos(radians(30))", "description": "", "templateType": "anything", "can_override": false}, "EF": {"name": "EF", "group": "members", "definition": "-FM cos(radians(30))", "description": "", "templateType": "anything", "can_override": false}, "AG": {"name": "AG", "group": "members", "definition": "2.0 f[\"A\"] ", "description": "", "templateType": "anything", "can_override": false}, "BC": {"name": "BC", "group": "members", "definition": "AB + 0.5(BG-BH)", "description": "", "templateType": "anything", "can_override": false}, "LO": {"name": "LO", "group": "members", "definition": "-( 2.0 f[\"L\"] * cos(radians(30)) + 2.0 DL + EL)", "description": "", "templateType": "anything", "can_override": false}, "CD": {"name": "CD", "group": "members", "definition": "-(6 * f[\"A\"] + 4 * f[\"B\"] + 2* f[\"C\"]\n + 4.5 * f[\"G\"] + 3 * f[\"H\"] + 1.5 * f[\"I\"] + f[\"N\"]) / (6 tan(radians(30)))", "description": "sum m at j
", "templateType": "anything", "can_override": false}, "members": {"name": "members", "group": "setup", "definition": "[ \"AB\", \"AG\", \"BC\", \"BG\", \"BH\", \"CD\", \"CH\", \"CN\", \"DE\", \"DL\", \"DO\", \"EF\", \"EL\", \"EM\", \"FM\", \"GH\", \"HI\", \"HN\", \"IJ\", \"JK\", \"JN\", \"JO\", \"KL\", \"KO\", \"LM\", \"LO\", \"NI\" ]\n ", "description": "names of the members
", "templateType": "anything", "can_override": false}, "BG": {"name": "BG", "group": "members", "definition": "- F[\"G\"] * cos(radians(30))", "description": "", "templateType": "anything", "can_override": false}, "f": {"name": "f", "group": "setup", "definition": "dict(map([pt, 0], pt, set(points)-set(supports) - set(loads))) +\ndict(map([supports[pt],reactions[pt]],pt,[0,1]))+\ndict(map([loads[pt],[13,17][pt]], pt, [0,1]))", "description": "forces as dictionary
\ndownward forces are positive
\nLoads have magnitude 1
\n", "templateType": "anything", "can_override": false}, "JO": {"name": "JO", "group": "members", "definition": "f[\"O\"]/2/cos(radians(30)) + LO + DO", "description": "", "templateType": "anything", "can_override": false}, "HI": {"name": "HI", "group": "members", "definition": "0.5 F[\"H\"] +(BH - HN) cos(radians(30)) + GH", "description": "", "templateType": "anything", "can_override": false}, "DE": {"name": "DE", "group": "members", "definition": "EF + 0.5(EM - EL)", "description": "", "templateType": "anything", "can_override": false}, "reactions": {"name": "reactions", "group": "setup", "definition": "[ -(13 (x[loads[0]] - x[supports[1]]) +\n17 (x[loads[1]] - x[supports[1]]))/(x[supports[0]]-x[supports[1]]),\n -(13(x[loads[0]] - x[supports[0]])+\n17 (x[loads[1]] - x[supports[0]]))/(x[supports[1]]-x[supports[0]])\n]\n\n", "description": "sum of moments at the supports
\nreactions at supports[0] and supports[1]
\nLoads assumed to be 13 and 17
", "templateType": "anything", "can_override": false}, "supports": {"name": "supports", "group": "setup", "definition": "shuffle([\"A\",\"B\",\"C\",\"D\",\"E\",\"F\"])[0..2]\n//[\"C\",\"D\"]", "description": "reactions -- along the bottom
\npassed to geogebra
", "templateType": "anything", "can_override": false}, "HN": {"name": "HN", "group": "members", "definition": "-(2.0 CH + BH + 2.0 f[\"H\"] * cos(radians(30)))", "description": "", "templateType": "anything", "can_override": false}, "truss": {"name": "truss", "group": "Ungrouped variables", "definition": "geogebra_applet('frtfqyat', [supports: to_ggb(supports), loads: to_ggb(loads)])", "description": "", "templateType": "anything", "can_override": false}, "to_ggb": {"name": "to_ggb", "group": "Ungrouped variables", "definition": "(l)->\"\\\\{\" + replace_regex(\"[\\\\]\\\\[]\", \"\", jme_string(l),\"g\") + \"\\\\}\"", "description": "Formats a numbas list to a ggb list.
\nFirst removes square brackets, then wraps with curly brackets.
", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["truss", "to_ggb"], "variable_groups": [{"name": "setup", "variables": ["points", "loads", "members", "supports", "f", "m", "x", "reactions", "zeroForce"]}, {"name": "members", "variables": ["AB", "AG", "BC", "BG", "BH", "CD", "CH", "CN", "DE", "DL", "DO", "EF", "EL", "EM", "FM", "GH", "HI", "HN", "IJ", "JK", "JO", "JN", "KL", "KO", "LO", "LM", "NI"]}], "functions": {"polar": {"parameters": [["mag", "number"], ["dir", "number"]], "type": "vector", "language": "jme", "definition": "vector([mag * cos(radians(dir)), mag * sin(radians(dir))])"}}, "preamble": {"js": "question.signals.on('adviceDisplayed',function() {\n\n // change look of zero force members\n var v = question.scope;\n try{\n var app = question.applet.app;\n\n for (index = 0; index < 27; index++) { \n var link = v.evaluate(\"members[\"+index+\"]\").value;\n var load = v.evaluate(link).value;\n if(load*load < 0.00005) {\n app.setVisible(`${link}_1`, false);\n app.setColor(`${link}_2`, 200,200,200);}\n else { \n app.setVisible(`${link}_1`, true);\n app.setColor(`${link}_2`, 0,0,0);}\n }\n }\n catch(err){} \n})", "css": ""}, "parts": [{"type": "extension", "useCustomName": false, "customName": "", "marks": "20", "scripts": {}, "customMarkingAlgorithm": "mark: \n feedback(\"You have correctly identified \" + score + \" out of 27 members.\");\n correctif(interpreted_answer = correct_answer)\n \ncorrect_answer:\n zeroforce\n\ninterpreted_answer: \n map((m)-> if(value(truss,m), 1, 0), members)\n\nright_choices:\n map(s-> if(s[0]=s[1],1,0), zip(interpreted_answer, correct_answer))\n\nscore:\n foldl((total, x) -> total + x, 0, right_choices)\n", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "Click all the zero force members. All or nothing scoring.
"}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}], "resources": ["question-resources/FBD_kZRowVa.png"]}]}], "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}]}