// Numbas version: finer_feedback_settings {"name": "Keith's copy of Frame: A-frame Difficulty 1", "extensions": ["geogebra", "weh", "quantities"], "custom_part_types": [{"source": {"pk": 19, "author": {"name": "William Haynes", "pk": 2530}, "edit_page": "/part_type/19/edit"}, "name": "Engineering Accuracy with units", "short_name": "engineering-answer", "description": "
A value with units marked right if within an adjustable % error of the correct value. Marked close if within a wider margin of error.
", "help_url": "", "input_widget": "string", "input_options": {"correctAnswer": "siground(settings['correctAnswer'],4)", "hint": {"static": true, "value": ""}, "allowEmpty": {"static": true, "value": true}}, "can_be_gap": true, "can_be_step": true, "marking_script": "mark:\nswitch( \n right and good_units and right_sign, add_credit(1.0,'Correct.'),\n right and good_units and not right_sign, add_credit(settings['C2'],'Wrong sign.'),\n right and right_sign and not good_units, add_credit(settings['C2'],'Correct value, but wrong or missing units.'),\n close and good_units, add_credit(settings['C1'],'Close.'),\n close and not good_units, add_credit(settings['C3'],'Answer is close, but wrong or missing units.'),\n incorrect('Wrong answer.')\n)\n\n\ninterpreted_answer:\nqty(student_scalar, student_units)\n\n\n\ncorrect_quantity:\nsettings[\"correctAnswer\"]\n\n\n\ncorrect_units:\nunits(correct_quantity)\n\n\nallowed_notation_styles:\n[\"plain\",\"en\"]\n\nmatch_student_number:\nmatchnumber(studentAnswer,allowed_notation_styles)\n\nstudent_scalar:\nmatch_student_number[1]\n\nstudent_units:\nreplace_regex('ohms','ohm',\n replace_regex('\u00b0', ' deg',\n replace_regex('-', ' ' ,\n studentAnswer[len(match_student_number[0])..len(studentAnswer)])),\"i\")\n\ngood_units:\ntry(\ncompatible(quantity(1, student_units),correct_units),\nmsg,\nfeedback(msg);false)\n\n\nstudent_quantity:\nswitch(not good_units, \n student_scalar * correct_units, \n not right_sign,\n -quantity(student_scalar, student_units),\n quantity(student_scalar,student_units)\n)\n \n\n\npercent_error:\ntry(\nscalar(abs((correct_quantity - student_quantity)/correct_quantity))*100 \n,msg,\nif(student_quantity=correct_quantity,0,100))\n \n\nright:\npercent_error <= settings['right']\n\n\nclose:\nright_sign and percent_error <= settings['close']\n\nright_sign:\nsign(student_scalar) = sign(correct_quantity)", "marking_notes": [{"name": "mark", "description": "This is the main marking note. It should award credit and provide feedback based on the student's answer.", "definition": "switch( \n right and good_units and right_sign, add_credit(1.0,'Correct.'),\n right and good_units and not right_sign, add_credit(settings['C2'],'Wrong sign.'),\n right and right_sign and not good_units, add_credit(settings['C2'],'Correct value, but wrong or missing units.'),\n close and good_units, add_credit(settings['C1'],'Close.'),\n close and not good_units, add_credit(settings['C3'],'Answer is close, but wrong or missing units.'),\n incorrect('Wrong answer.')\n)\n"}, {"name": "interpreted_answer", "description": "A value representing the student's answer to this part.", "definition": "qty(student_scalar, student_units)\n\n"}, {"name": "correct_quantity", "description": "", "definition": "settings[\"correctAnswer\"]\n\n"}, {"name": "correct_units", "description": "", "definition": "units(correct_quantity)\n"}, {"name": "allowed_notation_styles", "description": "", "definition": "[\"plain\",\"en\"]"}, {"name": "match_student_number", "description": "", "definition": "matchnumber(studentAnswer,allowed_notation_styles)"}, {"name": "student_scalar", "description": "", "definition": "match_student_number[1]"}, {"name": "student_units", "description": "Modify the unit portion of the student's answer by
\n1. replacing \"ohms\" with \"ohm\" case insensitive
\n2. replacing '-' with ' '
\n3. replacing '°' with ' deg'
\nto allow answers like 10 ft-lb and 30°
", "definition": "replace_regex('ohms','ohm',\n replace_regex('\u00b0', ' deg',\n replace_regex('-', ' ' ,\n studentAnswer[len(match_student_number[0])..len(studentAnswer)])),\"i\")"}, {"name": "good_units", "description": "", "definition": "try(\ncompatible(quantity(1, student_units),correct_units),\nmsg,\nfeedback(msg);false)\n"}, {"name": "student_quantity", "description": "This fixes the student answer for two common errors.
\nIf student_units are wrong - replace with correct units
\nIf student_scalar has the wrong sign - replace with right sign
\nIf student makes both errors, only one gets fixed.
", "definition": "switch(not good_units, \n student_scalar * correct_units, \n not right_sign,\n -quantity(student_scalar, student_units),\n quantity(student_scalar,student_units)\n)\n \n"}, {"name": "percent_error", "description": "", "definition": "try(\nscalar(abs((correct_quantity - student_quantity)/correct_quantity))*100 \n,msg,\nif(student_quantity=correct_quantity,0,100))\n "}, {"name": "right", "description": "", "definition": "percent_error <= settings['right']\n"}, {"name": "close", "description": "Only marked close if the student actually has the right sign.
", "definition": "right_sign and percent_error <= settings['close']"}, {"name": "right_sign", "description": "", "definition": "sign(student_scalar) = sign(correct_quantity) "}], "settings": [{"name": "correctAnswer", "label": "Correct Quantity.", "help_url": "", "hint": "The correct answer given as a JME quantity.", "input_type": "code", "default_value": "", "evaluate": true}, {"name": "right", "label": "% Accuracy for right.", "help_url": "", "hint": "Question will be considered correct if the scalar part of the student's answer is within this % of correct value.", "input_type": "code", "default_value": "0.2", "evaluate": true}, {"name": "close", "label": "% Accuracy for close.", "help_url": "", "hint": "Question will be considered close if the scalar part of the student's answer is within this % of correct value.", "input_type": "code", "default_value": "1.0", "evaluate": true}, {"name": "C1", "label": "Close with units.", "help_url": "", "hint": "Partial Credit for close value with appropriate units. if correct answer is 100 N and close is ±1%,An A-frame structure supporting a load at the top. Simple because both legs are two force bodies.
"}, "parts": [{"marks": 0, "type": "gapfill", "showCorrectAnswer": true, "gaps": [{"marks": "4", "type": "engineering-answer", "showCorrectAnswer": true, "scripts": {}, "variableReplacementStrategy": "originalfirst", "extendBaseMarkingAlgorithm": true, "settings": {"C3": "25", "close": "1.0", "correctAnswer": "qty(vecA[0],units[0])", "C2": "50", "right": "0.2", "C1": "75"}, "unitTests": [], "variableReplacements": [], "customMarkingAlgorithm": "", "customName": "", "showFeedbackIcon": true, "useCustomName": false}, {"marks": "4", "type": "engineering-answer", "showCorrectAnswer": true, "scripts": {}, "variableReplacementStrategy": "originalfirst", "extendBaseMarkingAlgorithm": true, "settings": {"C3": "25", "close": "1.0", "correctAnswer": "qty(vecA[1],units[0])", "C2": "50", "right": "0.2", "C1": "75"}, "unitTests": [], "variableReplacements": [], "customMarkingAlgorithm": "", "customName": "", "showFeedbackIcon": true, "useCustomName": false}, {"marks": "4", "type": "engineering-answer", "showCorrectAnswer": true, "scripts": {}, "variableReplacementStrategy": "originalfirst", "extendBaseMarkingAlgorithm": true, "settings": {"C3": "25", "close": "1.0", "correctAnswer": "qty(vecC[0],units[0])", "C2": "50", "right": "0.2", "C1": "75"}, "unitTests": [], "variableReplacements": [], "customMarkingAlgorithm": "", "customName": "", "showFeedbackIcon": true, "useCustomName": false}, {"marks": "4", "type": "engineering-answer", "showCorrectAnswer": true, "scripts": {}, "variableReplacementStrategy": "originalfirst", "extendBaseMarkingAlgorithm": true, "settings": {"C3": "25", "close": "1.0", "correctAnswer": "qty(vecC[1],units[0])", "C2": "50", "right": "0.2", "C1": "75"}, "unitTests": [], "variableReplacements": [], "customMarkingAlgorithm": "", "customName": "", "showFeedbackIcon": true, "useCustomName": false}], "scripts": {}, "useCustomName": false, "variableReplacementStrategy": "originalfirst", "extendBaseMarkingAlgorithm": true, "unitTests": [], "variableReplacements": [], "customMarkingAlgorithm": "", "sortAnswers": false, "customName": "", "showFeedbackIcon": true, "prompt": "$A_x = $ [[0]] $A_y = $ [[1]] {vecA}
\n$C_x = $ [[2]] $C_y = $ [[3]] {vecC}
"}], "name": "Keith's copy of Frame: A-frame Difficulty 1", "variablesTest": {"maxRuns": 100, "condition": "B[1]<> C[1] and B[0] <> B[1] and C[0] <> C[1]"}, "functions": {"display": {"parameters": [["Q", "quantity"]], "type": "string", "language": "jme", "definition": "string(siground(q,4))"}}, "variables": {"C": {"name": "C", "templateType": "anything", "group": "Ungrouped variables", "description": "", "definition": "vector(B[0]+ random(3..5),random(-2..3))"}, "x1": {"name": "x1", "templateType": "anything", "group": "magnitudes", "description": "", "definition": "qty(B[0],units[1])"}, "w": {"name": "w", "templateType": "anything", "group": "Ungrouped variables", "description": "", "definition": "random(100..500#25)"}, "beta": {"name": "beta", "templateType": "anything", "group": "magnitudes", "description": "", "definition": "degrees(angle(vector(-1,0),B-C))"}, "vecW": {"name": "vecW", "templateType": "anything", "group": "vectors", "description": "", "definition": "vector(0,-w)"}, "y1": {"name": "y1", "templateType": "anything", "group": "magnitudes", "description": "", "definition": "qty(B[1],units[1])"}, "y2": {"name": "y2", "templateType": "anything", "group": "magnitudes", "description": "", "definition": "qty(abs(b[1]-c[1]),units[1])"}, "sigma_f": {"name": "sigma_f", "templateType": "anything", "group": "vectors", "description": "", "definition": "vecW+vecA+vecC"}, "fd": {"name": "fd", "templateType": "anything", "group": "Ungrouped variables", "description": "", "definition": "0//random(-250..250#50 except 0)"}, "F_w": {"name": "F_w", "templateType": "anything", "group": "magnitudes", "description": "", "definition": "qty(w,units[0])"}, "debug": {"name": "debug", "templateType": "anything", "group": "Ungrouped variables", "description": "", "definition": "false"}, "ggb_load": {"name": "ggb_load", "templateType": "anything", "group": "Ungrouped variables", "description": "Below this will select either the force or the moment, but not both.
\n\nrandom(
[['fd',fd], ['me', 0]],
[['me',me], ['fd', 0]]
) + [['w',0]]
{geogebra_applet('uyjv6v8r',[[\"B\",B],[\"C\",C]] + ggb_load )}
\n\n
Strategy:
\nNote that members AB and BC are two-force bodies and both act on pin B in known directions. Draw a free body diagram of the two members and of the forces acting on pin at B, and solve it for the magnitudes of A and C using the equilibrium equation method or the force-triangle method
\nKnown:
\n$W$ = {F_w}
\nDetermine necessary angles:
\n$\\alpha = \\tan^{-1}\\left(\\frac{\\var{y1}}{\\var{x1}}\\right) = \\var{siground(alpha,4)}$°
\n$\\beta = \\tan^{-1}\\left(\\frac{\\var{y2}}{\\var{x2}}\\right) = \\var{siground(beta,4)}$°
\nUsing the law of sines to solve for forces A and C:
\n$\\dfrac{W}{\\sin(\\alpha+\\beta)} = \\dfrac{AB}{\\sin(90°-\\alpha)} = \\dfrac{CB}{\\sin(90°-\\beta)}$
\n$A = W \\dfrac{\\cos(\\alpha)}{\\sin(\\alpha+\\beta)}$ = {display(magA)} $\\nearrow$
\n$C = W \\dfrac{\\cos(\\beta)}{\\sin(\\alpha+\\beta)}$ = {display(magC)} $\\nwarrow$
\nFind the scalar components of the forces at pins A and C.
\nNote: Scalar components have a sign which indicates direction: positive values indicate $\\uparrow$ or $\\rightarrow$, negative indicate $\\downarrow$ or $\\leftarrow$.
\n$\\begin{align} A_x = A \\cos(\\alpha) &= \\var{qty(vecA[0],units[0])}& &C_x = C \\cos(\\beta) = \\var{qty(vecC[0],units[0])} \\\\ A_y = A \\sin(\\alpha) &= \\var{qty(vecA[1],units[0])} && C_y = C \\sin(\\beta) = \\var{qty(vecC[1],units[0])} \\end{align}$
\nCheck
\nYou can use the equations of equilibrium to verify that these answers put point $B$ in equilibrium.
\n$\\begin{align}A_x &\\stackrel{?}{=}C_x &A_y + C_y &\\stackrel{?}{=}W\\\\ \\var{vecA[0]} &= \\var{-vecC[0]} \\quad \\checkmark & \\var{vecA[1]} + \\var{vecC[1]} &= \\var{W} \\quad \\checkmark\\\\ \\end{align}$
", "variable_groups": [{"name": "magnitudes", "variables": ["F_w", "alpha", "beta", "magA", "magC", "x1", "y1", "x2", "y2"]}, {"name": "vectors", "variables": ["vecW", "vecA", "vecC", "sigma_f"]}], "tags": ["equilibrium", "Equilibrium", "frame", "Frame", "mechanics", "Mechanics", "Statics", "statics"], "statement": "{geogebra_applet('qe7xhnse',[[\"B\",B],[\"C\",C],['units','\"'+units[1]+'\"']]+ggb_load )}
\nThe A-frame shown supports a {F_w} load as shown. Determine the scalar components of the reactions at pins A and C.
\n", "extensions": ["geogebra", "quantities", "weh"], "type": "question", "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}, {"name": "Keith Tarnowski", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/3425/"}]}]}], "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}, {"name": "Keith Tarnowski", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/3425/"}]}