// Numbas version: finer_feedback_settings {"name": "Katrin'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

\n

1. replacing \"ohms\" with \"ohm\"  case insensitive

\n

2. replacing '-' with ' ' 

\n

3. replacing '°' with ' deg' 

\n

to 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.  

\n

If student_units are wrong  - replace with correct units

\n

If student_scalar has the wrong sign - replace with right sign

\n

If 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%,
99  N is accepted.", "input_type": "percent", "default_value": "75"}, {"name": "C2", "label": "No units or wrong sign", "help_url": "", "hint": "Partial credit for forgetting units or using wrong sign.
If the correct answer is 100 N, both 100 and -100 N are accepted.", "input_type": "percent", "default_value": "50"}, {"name": "C3", "label": "Close, no units.", "help_url": "", "hint": "Partial Credit for close value but forgotten units.
This value would be close if the expected units were provided.  If the correct answer is 100 N, and close is ±1%,
99 is accepted.", "input_type": "percent", "default_value": "25"}], "public_availability": "always", "published": true, "extensions": ["quantities"]}], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"variablesTest": {"maxRuns": 100, "condition": "B[1]<> C[1] and B[0] <> B[1] and C[0] <> C[1]"}, "variable_groups": [{"name": "magnitudes", "variables": ["F_w", "alpha", "beta", "magA", "magC", "x1", "y1", "x2", "y2"]}, {"name": "vectors", "variables": ["vecW", "vecA", "vecC", "sigma_f"]}], "functions": {"display": {"parameters": [["Q", "quantity"]], "language": "jme", "definition": "string(siground(q,4))", "type": "string"}}, "ungrouped_variables": ["B", "C", "fd", "me", "w", "units", "ggb_load", "debug"], "parts": [{"showFeedbackIcon": true, "unitTests": [], "variableReplacements": [], "sortAnswers": false, "customMarkingAlgorithm": "", "scripts": {}, "extendBaseMarkingAlgorithm": true, "variableReplacementStrategy": "originalfirst", "prompt": "

$A_x = $ [[0]]   $A_y = $ [[1]]  {vecA}

\n

$C_x = $ [[2]]   $C_y = $ [[3]]  {vecC}

", "marks": 0, "useCustomName": false, "type": "gapfill", "customName": "", "showCorrectAnswer": true, "gaps": [{"showFeedbackIcon": true, "unitTests": [], "variableReplacements": [], "useCustomName": false, "customMarkingAlgorithm": "", "scripts": {}, "extendBaseMarkingAlgorithm": true, "settings": {"C1": "75", "C2": "50", "C3": "25", "correctAnswer": "qty(vecA[0],units[0])", "close": "1.0", "right": "0.2"}, "variableReplacementStrategy": "originalfirst", "marks": "4", "type": "engineering-answer", "customName": "", "showCorrectAnswer": true}, {"showFeedbackIcon": true, "unitTests": [], "variableReplacements": [], "useCustomName": false, "customMarkingAlgorithm": "", "scripts": {}, "extendBaseMarkingAlgorithm": true, "settings": {"C1": "75", "C2": "50", "C3": "25", "correctAnswer": "qty(vecA[1],units[0])", "close": "1.0", "right": "0.2"}, "variableReplacementStrategy": "originalfirst", "marks": "4", "type": "engineering-answer", "customName": "", "showCorrectAnswer": true}, {"showFeedbackIcon": true, "unitTests": [], "variableReplacements": [], "useCustomName": false, "customMarkingAlgorithm": "", "scripts": {}, "extendBaseMarkingAlgorithm": true, "settings": {"C1": "75", "C2": "50", "C3": "25", "correctAnswer": "qty(vecC[0],units[0])", "close": "1.0", "right": "0.2"}, "variableReplacementStrategy": "originalfirst", "marks": "4", "type": "engineering-answer", "customName": "", "showCorrectAnswer": true}, {"showFeedbackIcon": true, "unitTests": [], "variableReplacements": [], "useCustomName": false, "customMarkingAlgorithm": "", "scripts": {}, "extendBaseMarkingAlgorithm": true, "settings": {"C1": "75", "C2": "50", "C3": "25", "correctAnswer": "qty(vecC[1],units[0])", "close": "1.0", "right": "0.2"}, "variableReplacementStrategy": "originalfirst", "marks": "4", "type": "engineering-answer", "customName": "", "showCorrectAnswer": true}]}], "statement": "

{geogebra_applet('qe7xhnse',[[\"B\",B],[\"C\",C],['units','\"'+units[1]+'\"']]+ggb_load )}

\n

The A-frame shown supports a {F_w} load as shown.  Determine the scalar components of the reactions at pins A and C.

\n

", "rulesets": {}, "extensions": ["geogebra", "quantities", "weh"], "variables": {"x2": {"group": "magnitudes", "definition": "qty(abs(b[0]-c[0]),units[1])", "templateType": "anything", "name": "x2", "description": ""}, "y2": {"group": "magnitudes", "definition": "qty(abs(b[1]-c[1]),units[1])", "templateType": "anything", "name": "y2", "description": ""}, "C": {"group": "Ungrouped variables", "definition": "vector(B[0]+ random(3..5),random(-2..3))", "templateType": "anything", "name": "C", "description": ""}, "vecC": {"group": "vectors", "definition": "siground(scalar(magC) *\nvector(cos(radians(180-beta)),\n sin(radians(180-beta))),4)", "templateType": "anything", "name": "vecC", "description": ""}, "vecA": {"group": "vectors", "definition": "siground(scalar(magA)*\nvector(cos(radians(alpha)),\n sin(radians(alpha))),4)", "templateType": "anything", "name": "vecA", "description": ""}, "magC": {"group": "magnitudes", "definition": "F_w cos(radians(alpha))/sin(radians(alpha+beta))", "templateType": "anything", "name": "magC", "description": ""}, "fd": {"group": "Ungrouped variables", "definition": "0//random(-250..250#50 except 0)", "templateType": "anything", "name": "fd", "description": ""}, "me": {"group": "Ungrouped variables", "definition": "0//random(-1000..1000#100 except 0)", "templateType": "anything", "name": "me", "description": ""}, "beta": {"group": "magnitudes", "definition": "degrees(angle(vector(-1,0),B-C))", "templateType": "anything", "name": "beta", "description": ""}, "x1": {"group": "magnitudes", "definition": "qty(B[0],units[1])", "templateType": "anything", "name": "x1", "description": ""}, "units": {"group": "Ungrouped variables", "definition": "random(['N','m'],['lb','ft'])", "templateType": "anything", "name": "units", "description": ""}, "sigma_f": {"group": "vectors", "definition": "vecW+vecA+vecC", "templateType": "anything", "name": "sigma_f", "description": ""}, "alpha": {"group": "magnitudes", "definition": "degrees(angle(vector(1,0),B))", "templateType": "anything", "name": "alpha", "description": ""}, "F_w": {"group": "magnitudes", "definition": "qty(w,units[0])", "templateType": "anything", "name": "F_w", "description": ""}, "ggb_load": {"group": "Ungrouped variables", "definition": "[['me', 0],['fd', 0],['w',-w]]", "templateType": "anything", "name": "ggb_load", "description": "

Below this will select either the force or the moment, but not both.

\n

\n

random(
[['fd',fd], ['me', 0]],
[['me',me], ['fd', 0]]
) + [['w',0]]

"}, "vecW": {"group": "vectors", "definition": "vector(0,-w)", "templateType": "anything", "name": "vecW", "description": ""}, "magA": {"group": "magnitudes", "definition": "F_w cos(radians(beta))/sin(radians(alpha+beta))", "templateType": "anything", "name": "magA", "description": ""}, "B": {"group": "Ungrouped variables", "definition": "vector(random(3..5),random(3..5))", "templateType": "anything", "name": "B", "description": ""}, "w": {"group": "Ungrouped variables", "definition": "random(100..500#25)", "templateType": "anything", "name": "w", "description": ""}, "debug": {"group": "Ungrouped variables", "definition": "false", "templateType": "anything", "name": "debug", "description": ""}, "y1": {"group": "magnitudes", "definition": "qty(B[1],units[1])", "templateType": "anything", "name": "y1", "description": ""}}, "tags": ["equilibrium", "Equilibrium", "frame", "Frame", "mechanics", "Mechanics", "Statics", "statics"], "name": "Katrin's copy of Frame: A-frame Difficulty 1", "preamble": {"js": "", "css": ""}, "advice": "

{geogebra_applet('uyjv6v8r',[[\"B\",B],[\"C\",C]] + ggb_load )}

\n

\n

Strategy:

\n

Note 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

\n

Known:

\n

$W$ = {F_w}

\n

Determine 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)}$°

\n

Using 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$

\n

Find the scalar components of the forces at pins A and C.

\n

Note: 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}$

\n

Check

\n

You 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}$

", "metadata": {"licence": "Creative Commons Attribution-NonCommercial 4.0 International", "description": "

An A-frame structure supporting a load at the top.  Simple because both legs are two force bodies.

"}, "type": "question", "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}, {"name": "Katrin Thomson", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/3424/"}]}]}], "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}, {"name": "Katrin Thomson", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/3424/"}]}