// Numbas version: finer_feedback_settings {"name": "32. Frames and Machines 2", "metadata": {"description": "

Homework set.  More frame and machine problems.

", "licence": "Creative Commons Attribution-ShareAlike 4.0 International"}, "duration": 0, "percentPass": 0, "showQuestionGroupNames": false, "shuffleQuestionGroups": false, "showstudentname": true, "question_groups": [{"name": "Group", "pickingStrategy": "all-ordered", "pickQuestions": 1, "questionNames": ["", "", ""], "variable_overrides": [[], [], []], "questions": [{"name": "Frame: A-frame Difficulty 3", "extensions": ["geogebra", "quantities", "weh"], "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}, "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}], "tags": ["frame", "Frame", "Mechanics", "mechanics", "Rigid body equilibrium", "rigid body equilibrium", "Statics", "statics"], "metadata": {"description": "

An A-frame structure supporting a force and a moment. The feet are at the same vertical position, so taking moments at one foot yields the y component of the reaction at the other.

", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "

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

\n

The A-frame shown supports a {display(abs(F_d))} force $D$ at the midpoint of member AB and a {display(abs(M_E)) } {if(me>0,\"counter-\",\"\")}clockwise moment $M_E$ at E as shown.  

\n

Determine the scalar components of the reactions at pins A and C.  

\n

Note: the sign of a scalar component indicates the sense of the force. A positive sense indicates the force points towards the positive end of the corresponding axis. 

\n

\n

", "advice": "

Strategy:

\n

       Draw a free body diagram of the entire frame and each of its legs.  Note that members AB or BC are not two-force bodies; therefore the direction of the forces at A and C don't align with the members and should be represented with x and y components.  In this case all three of the free body diagrams have four unknowns.  Fortunately, the lines of action of three of the unknowns on FBD I intersect at points A and C.

\n

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

\n

Known:

\n

$M_E = \\var{display(abs(M_E))}$ and $D = \\var{display(abs(F_D))}$

\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

Start with FBD I  and take moments at point A to find force $C_y$. 

\n
\n

$\\begin{align} \\textrm{I: } \\Sigma M_A &= 0\\\\ \\simplify{{sign(-fd)} D   ({y1/2}) + {sign(me)} M_E } + C_y ( \\var{x1 + x2}) &= 0\\\\ C_y &= \\dfrac{\\simplify{({sign(fd)} D   ({y1/2})  + {-sign(me)} M_E )}} { \\simplify{({x1+x2})}}\\\\ &= \\var{display(Cy)}\\\\ &= \\var{display(abs(Cy))}  \\var{if(VecC[1]<0,latex('\\\\downarrow'),latex('\\\\uparrow'))} \\end{align}$

\n

Use FBD III and take moment about B to find $C_x$.

\n

$\\begin{align} \\textrm{III: } \\Sigma M_B &= 0\\\\  \\simplify{- C_x ({y1}) + C_y ({x2}) + {sign(me)} M_E }  &= 0\\\\ C_x &= \\dfrac{\\simplify{( C_y ({x2})  + {-sign(me)} M_E )}} {\\var{y2}}\\\\ &= \\var{display(Cx)}\\\\ &= \\var{display(abs(Cx))}  \\var{if(VecC[0]<0,latex('\\\\leftarrow'),latex('\\\\rightarrow'))} \\end{align}$

\n

Apply $\\Sigma F_x = 0$ and $\\Sigma F_y=0$ to FBD I to find the reactions at A.

\n
\n
\n

$\\begin{align} \\Sigma F_x &= 0\\\\   \\simplify{ A_x  +  {sign(fd)} D } - C_x &= 0\\\\ A_x &= \\simplify{C_x - {sign(fd)} D } \\\\&= \\simplify[!collectNumbers]{({-siground(vecC[0],4)}) + ({-vecD[0]})}\\\\ &= \\simplify{({-siground(vecC[0],4)}) + ({-vecD[0]})}\\\\&= \\var{display(abs(qty(vecA[0],units[0])))} \\var{if(vecA[0]<0,latex('\\\\leftarrow'),latex('\\\\rightarrow'))} \\end{align}$  

\n

$\\begin{align}\\Sigma F_y &= 0\\\\ A_y + C_y &=0\\\\A_y &= -C_y \\\\ &= -( \\var{display(qty(vecC[1],units[0]))}) \\\\ &=  \\var{display(abs(qty(vecA[1],units[0])))} \\var{if(vecA[1]<0,latex('\\\\downarrow'),latex('\\\\uparrow'))} \\end{align}$

\n
", "rulesets": {}, "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"F_d": {"name": "F_d", "group": "quantities", "definition": "qty(fd,units[0])", "description": "", "templateType": "anything", "can_override": false}, "vecD": {"name": "vecD", "group": "vectors", "definition": "vector(scalar(f_d),0)", "description": "", "templateType": "anything", "can_override": false}, "x2": {"name": "x2", "group": "quantities", "definition": "qty(abs(b[0]-c[0]),units[1])", "description": "", "templateType": "anything", "can_override": false}, "debug": {"name": "debug", "group": "Ungrouped variables", "definition": "false", "description": "", "templateType": "anything", "can_override": false}, "F_w": {"name": "F_w", "group": "quantities", "definition": "qty(w,units[0])", "description": "", "templateType": "anything", "can_override": false}, "M_E": {"name": "M_E", "group": "quantities", "definition": "qty(me,units[0]+\"*\"+units[1])", "description": "", "templateType": "anything", "can_override": false}, "alpha": {"name": "alpha", "group": "quantities", "definition": "degrees(angle(vector(1,0),B))", "description": "", "templateType": "anything", "can_override": false}, "Cy": {"name": "Cy", "group": "quantities", "definition": "( F_d y1/2 - M_E ) /(x1+x2)", "description": "

( sign(fd)} D   y1/2  + -sign(me) M_E ) /(x1+x2)

", "templateType": "anything", "can_override": false}, "vecW": {"name": "vecW", "group": "vectors", "definition": "vector(0,-w)", "description": "

always 0 in this problem

", "templateType": "anything", "can_override": false}, "w": {"name": "w", "group": "Ungrouped variables", "definition": "0//random(100..500#25)", "description": "", "templateType": "anything", "can_override": false}, "beta": {"name": "beta", "group": "quantities", "definition": "degrees(angle(vector(-1,0),B-C))", "description": "", "templateType": "anything", "can_override": false}, "fd": {"name": "fd", "group": "Ungrouped variables", "definition": "random(-500..500#25 except 0)", "description": "

the magnitude of the force

", "templateType": "anything", "can_override": false}, "description": {"name": "description", "group": "quantities", "definition": "display(abs(F_d)) + \" force $D$ at the midpoint of member AB and\"+\n display(abs(M_E)) + if(me>0,\" counter-\",\" \") + \"clockwise moment $M_E$ \"", "description": "", "templateType": "anything", "can_override": false}, "units": {"name": "units", "group": "Ungrouped variables", "definition": "random(['N','m'],['lb','ft'])", "description": "", "templateType": "anything", "can_override": false}, "ggb_load": {"name": "ggb_load", "group": "Ungrouped variables", "definition": "[['fd',fd],['me',me],['w',0]]", "description": "

This will select either the force or the moment, but not both.  Weight is always zero.

\n

\n

", "templateType": "anything", "can_override": false}, "x1": {"name": "x1", "group": "quantities", "definition": "qty(B[0],units[1])", "description": "", "templateType": "anything", "can_override": false}, "B": {"name": "B", "group": "Ungrouped variables", "definition": "vector(random(3..5),random(3..5))", "description": "

location of pin B

", "templateType": "anything", "can_override": false}, "me": {"name": "me", "group": "Ungrouped variables", "definition": "random(100..2000#100) random(1,-1)", "description": "

the magnitude of the moment

", "templateType": "anything", "can_override": false}, "sigma_f": {"name": "sigma_f", "group": "vectors", "definition": "vecW+vecA+vecC + vecD", "description": "", "templateType": "anything", "can_override": false}, "y2": {"name": "y2", "group": "quantities", "definition": "qty(abs(b[1]-c[1]),units[1])", "description": "", "templateType": "anything", "can_override": false}, "C": {"name": "C", "group": "Ungrouped variables", "definition": "vector(B[0]+ random(3..5),0)", "description": "

Location of pin C.  Pin A is at (0,0)

", "templateType": "anything", "can_override": false}, "vecA": {"name": "vecA", "group": "vectors", "definition": "-(vecD+VecC)", "description": "

reactions at A for both versions as a vector

", "templateType": "anything", "can_override": false}, "vecC": {"name": "vecC", "group": "vectors", "definition": "vector(scalar(-cx),scalar(cy))", "description": "

reactions at C for both versions as a vector

", "templateType": "anything", "can_override": false}, "Cx": {"name": "Cx", "group": "quantities", "definition": "( Cy x2 + M_E )/ y2", "description": "", "templateType": "anything", "can_override": false}, "y1": {"name": "y1", "group": "quantities", "definition": "qty(B[1],units[1])", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "B[1]<> C[1] ", "maxRuns": 100}, "ungrouped_variables": ["B", "C", "fd", "me", "w", "units", "ggb_load", "debug"], "variable_groups": [{"name": "quantities", "variables": ["F_w", "F_d", "M_E", "alpha", "beta", "x1", "y1", "x2", "y2", "description", "Cy", "Cx"]}, {"name": "vectors", "variables": ["vecW", "vecA", "vecC", "sigma_f", "vecD"]}], "functions": {"display": {"parameters": [["Q", "quantity"]], "type": "string", "language": "jme", "definition": "string(siground(q,4))"}}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": false, "customName": "", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

$A_x = $ [[0]]   $A_y = $ [[1]] $C_x = $ [[2]]   $C_y = $ [[3]]

", "gaps": [{"type": "engineering-answer", "useCustomName": true, "customName": "$A_x$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecA[0],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$A_y$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecA[1],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$C_x$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecC[0],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$C_y$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecC[1],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}], "sortAnswers": false}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "type": "question"}, {"name": "Frame: A-frame Difficulty 4", "extensions": ["geogebra", "quantities", "stats"], "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}, "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}], "tags": [], "metadata": {"description": "

An A-frame structure supporting a force and a moment. The feet are at the different vertical positions so the solution will require simultaneous equations, unless you rotate the coordinate system.

", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "

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

\n

The A-frame shown supports a {display(abs(F_d))} force $D$ at the midpoint of member AB and a {display(abs(M_E)) } {if(me>0,\"counter-\",\"\")}clockwise moment $M_E$ at E as shown.  

\n

Determine the scalar components of the reactions at pins A and C.  

\n

Note: the sign of a scalar component indicates the sense of the force. A positive sense indicates the force points towards the positive end of the corresponding axis. 

", "advice": "

Strategy:

\n

       Draw a free body diagram of the entire frame and each of its legs.  Note that members AB or BC are not two-force bodies; therefore the direction of the forces at A and C don't align with the members and should be represented with x and y components.  Since all of the free body diagrams have four unknowns, there is no simple way to find one unknown using just one equation.  The general approach in this case is to write two equations which contain the same two unknowns, then solve them simultaneously.  

\n

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

\n

Known:

\n

$M_E = \\var{display(abs(M_E))}$ and $D = \\var{display(abs(F_D))}$

\n

Determine necessary angles:

\n

$\\begin{align}\\alpha &= \\tan^{-1}\\left(\\frac{\\var{y1}}{\\var{x1}}\\right) = \\var{siground(alpha,4)}°  & \\beta &= \\tan^{-1}\\left(\\frac{\\var{y2}}{\\var{x2}}\\right) = \\var{siground(beta,4)}°\\end{align}$

\n

Use FBDs II and III to generate two independent equations containing $B_x$ and $B_y$:

\n
\n

$\\begin{align} \\textrm{II: } \\Sigma M_A &= 0    & \\textrm{III: } \\Sigma M_C &= 0\\\\B_x (\\var{y1}) + B_y (\\var{x1}) &=  \\simplify{{sign(fd)} D   ({y1/2})}&   - B_x (\\var{y2}) + B_y (\\var{x2}) &=  \\simplify{ - {sign(me)} M_E  } \\\\  \\var{scalar(y1)} B_x + \\var{scalar(x1)}B_y& = \\var{fd scalar( y1/2) }\\qquad (1) &  - \\var{scalar(y2)} B_x + \\var{Scalar(x2)} B_y &=  \\var{scalar(-M_E ) }\\qquad (2)\\end{align}$

\n

Solve equations (1) and (2) simultaneously to find $B_x$ and $B_y$:

\n

$\\qquad B_x = \\var{display(Bx)}  \\qquad\\qquad\\qquad\\qquad\\qquad  B_y = \\var{display(By)}$

\n

From FBD III:

\n

$\\begin{align} \\textrm{III: }\\Sigma F_x &= 0  &   \\textrm{III: }\\Sigma F_y &= 0 \\\\  C_x &= B_x & C_y & = B_y \\\\ &= \\var{display(abs(Cx))}  \\var{if(vecC[0]<0,latex('\\\\leftarrow'),latex('\\\\rightarrow'))}& &= \\var{display(abs(Cy))} \\var{if(vecC[1]<0,latex('\\\\downarrow'),latex('\\\\uparrow'))} \\end{align}$

\n

From FBD II:

\n
\n
\n

$\\begin{align} \\textrm{II: }\\Sigma F_x &= 0 & \\textrm{II: } \\Sigma F_y &= 0\\\\ A_x &= \\simplify{B_x - {sign(fd)} D }  & A_y &= -B_y  \\\\&= \\simplify[!collectNumbers]{({display(-qty(vecC[0],units[0]))}) + ({-F_D})}& &=  - ( \\var{display(qty(vecC[1],units[0]))}) \\\\ &=\\var{display(abs(qty(vecA[0],units[0])))} \\var{if(vecA[0]<0,latex('\\\\leftarrow'),latex('\\\\rightarrow'))} & &= \\var{display(abs(qty(vecA[1],units[0])))} \\var{if(vecA[1]<0,latex('\\\\downarrow'),latex('\\\\uparrow'))}\\end{align}$  

\n
", "rulesets": {}, "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"vecW": {"name": "vecW", "group": "vectors", "definition": "vector(0,-w)", "description": "

always 0 in this problem

", "templateType": "anything", "can_override": false}, "Cy": {"name": "Cy", "group": "quantities", "definition": "By", "description": "

( sign(fd)} D   y1/2  + -sign(me) M_E ) /(x1+x2)

", "templateType": "anything", "can_override": false}, "fd": {"name": "fd", "group": "Ungrouped variables", "definition": "random(-500..500#25 except 0)", "description": "

the magnitude of the force

", "templateType": "anything", "can_override": false}, "me": {"name": "me", "group": "Ungrouped variables", "definition": "random(100..2000#100) random(1,-1)", "description": "

the magnitude of the moment

", "templateType": "anything", "can_override": false}, "x2": {"name": "x2", "group": "quantities", "definition": "qty(abs(b[0]-c[0]),units[1])", "description": "", "templateType": "anything", "can_override": false}, "F_w": {"name": "F_w", "group": "quantities", "definition": "qty(w,units[0])", "description": "", "templateType": "anything", "can_override": false}, "alpha": {"name": "alpha", "group": "quantities", "definition": "degrees(angle(vector(1,0),B))", "description": "", "templateType": "anything", "can_override": false}, "x1": {"name": "x1", "group": "quantities", "definition": "qty(B[0],units[1])", "description": "", "templateType": "anything", "can_override": false}, "F_d": {"name": "F_d", "group": "quantities", "definition": "qty(fd,units[0])", "description": "", "templateType": "anything", "can_override": false}, "Cx": {"name": "Cx", "group": "quantities", "definition": "Bx", "description": "

( C_y x2  + -sign(me) M_E )/ y2

", "templateType": "anything", "can_override": false}, "det": {"name": "det", "group": "quantities", "definition": "det(matrix(\n [scalar(y1),scalar(x1)],\n [-scalar(y2),scalar(x2)]\n))", "description": "", "templateType": "anything", "can_override": false}, "dety": {"name": "dety", "group": "quantities", "definition": "det(matrix(\n [scalar(y1) ,fd scalar(y1) /2],\n [-scalar(y2) ,- me]\n))", "description": "", "templateType": "anything", "can_override": false}, "vecC": {"name": "vecC", "group": "vectors", "definition": "vector(scalar(-cx),scalar(cy))", "description": "

reactions at C for both versions as a vector

", "templateType": "anything", "can_override": false}, "y2": {"name": "y2", "group": "quantities", "definition": "qty(abs(b[1]-c[1]),units[1])", "description": "", "templateType": "anything", "can_override": false}, "M_E": {"name": "M_E", "group": "quantities", "definition": "qty(me,units[0]+\"*\"+units[1])", "description": "", "templateType": "anything", "can_override": false}, "sigma_f": {"name": "sigma_f", "group": "vectors", "definition": "vecW+vecA+vecC + vecD", "description": "", "templateType": "anything", "can_override": false}, "B": {"name": "B", "group": "Ungrouped variables", "definition": "vector(random(3..5),random(3..5))", "description": "

location of pin B

", "templateType": "anything", "can_override": false}, "vecD": {"name": "vecD", "group": "vectors", "definition": "vector(scalar(f_d),0)", "description": "", "templateType": "anything", "can_override": false}, "w": {"name": "w", "group": "Ungrouped variables", "definition": "0//random(100..500#25)", "description": "", "templateType": "anything", "can_override": false}, "y1": {"name": "y1", "group": "quantities", "definition": "qty(B[1],units[1])", "description": "", "templateType": "anything", "can_override": false}, "beta": {"name": "beta", "group": "quantities", "definition": "degrees(angle(vector(-1,0),B-C))", "description": "", "templateType": "anything", "can_override": false}, "units": {"name": "units", "group": "Ungrouped variables", "definition": "random(['N','m'],['lb','ft'])", "description": "", "templateType": "anything", "can_override": false}, "Bx": {"name": "Bx", "group": "quantities", "definition": "qty(detx/det,units[0])", "description": "", "templateType": "anything", "can_override": false}, "description": {"name": "description", "group": "quantities", "definition": "display(abs(F_d)) + \" force $D$ at the midpoint of member AB and\"+\n display(abs(M_E)) + if(me>0,\" counter-\",\" \") + \"clockwise moment $M_E$ \"", "description": "", "templateType": "anything", "can_override": false}, "detx": {"name": "detx", "group": "quantities", "definition": "det(matrix(\n [fd scalar(y1)/2 ,scalar(x1)],\n [- me ,scalar(x2)]\n))", "description": "", "templateType": "anything", "can_override": false}, "By": {"name": "By", "group": "quantities", "definition": "qty(dety/det,units[0])", "description": "", "templateType": "anything", "can_override": false}, "vecA": {"name": "vecA", "group": "vectors", "definition": "-(vecD+VecC)", "description": "

reactions at A for both versions as a vector

", "templateType": "anything", "can_override": false}, "C": {"name": "C", "group": "Ungrouped variables", "definition": "vector(B[0]+ random(3..5),random(-4..4 except 0))", "description": "

Location of pin C.  Pin A is at (0,0)

", "templateType": "anything", "can_override": false}, "ggb_load": {"name": "ggb_load", "group": "Ungrouped variables", "definition": "[['fd',fd],['me',me],['w',0]]", "description": "

This will select either the force or the moment, but not both.  Weight is always zero.

\n

\n

", "templateType": "anything", "can_override": false}, "debug": {"name": "debug", "group": "Ungrouped variables", "definition": "true", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "B[1] > C[1] ", "maxRuns": 100}, "ungrouped_variables": ["B", "C", "fd", "me", "w", "units", "ggb_load", "debug"], "variable_groups": [{"name": "quantities", "variables": ["F_w", "F_d", "M_E", "alpha", "beta", "x1", "y1", "x2", "y2", "description", "Cy", "Cx", "Bx", "By", "det", "detx", "dety"]}, {"name": "vectors", "variables": ["vecW", "vecA", "vecC", "vecD", "sigma_f"]}], "functions": {"display": {"parameters": [["Q", "quantity"]], "type": "string", "language": "jme", "definition": "string(siground(q,4))"}}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": false, "customName": "", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

$A_x = $ [[0]] $A_y = $ [[1]] $C_x = $ [[2]] $C_y = $ [[3]] 

", "gaps": [{"type": "engineering-answer", "useCustomName": true, "customName": "$A_x$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecA[0],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$A_y$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecA[1],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$C_x$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecC[0],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "$C_y$", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(vecC[1],units[0])", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}], "sortAnswers": false}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "type": "question"}, {"name": "Machine: Vice grips", "extensions": ["geogebra", "quantities"], "custom_part_types": [], "resources": [["question-resources/vicegrips2FBD_VTYoSKJ.png", "/srv/numbas/media/question-resources/vicegrips2FBD_VTYoSKJ.png"], ["question-resources/vicegrips2.vwx", "/srv/numbas/media/question-resources/vicegrips2.vwx"]], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}], "tags": ["Equilibrium", "equilibrium", "machine", "Mechanics", "mechanics", "Statics", "statics"], "metadata": {"description": "Find the mechanical advantage of a pair of 'vice-grip' pliers.", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "

{applet}

", "advice": "

Start by drawing neat, correct, labeled free body diagrams for the lower handle and the lower jaw.  Recognize that piece $CE$ is a two force member in compression so the force on pin $E$ acts down and left along a line passing through $C$ and $E$.

\n

\n

Geometry

\n

Determine angle $\\theta$ from the geometry of the pliers.  

\n

\\[\\theta = \\tan^{-1}\\left( \\dfrac{\\var{q(x3)}}{\\var{q(y1)}}\\right) = \\var{d(theta)}°\\]

\n

FBD II

\n

\\[\\begin{align}\\text{II: } \\Sigma M_B &= 0\\\\ CE_x \\,(\\var{q(y2)}) -CE_y\\,(\\var{q(x2)}) + P \\,( \\var{q(x2+x3+x4)})& = 0 \\\\ CE\\left( \\var{y2} \\sin \\theta - \\var{x2} \\cos \\theta \\right) &=  -P \\,( \\var{q(x2)}+\\var{q(x3)}+\\var{q(x4)})\\\\CE &=-P \\,\\left( \\dfrac{\\var{q(x2+x3+x4)}}{\\var{-q(dperp)}} \\right)\\\\ &= \\var{d(ce)} P \\\\ \\\\ \\text{II: }\\Sigma F_x &= 0\\\\ B_x &= CE_x\\\\ &= CE \\sin{\\theta}\\\\ &= ( \\var{d(ce)} P )\\,(\\sin \\var{d(theta)}°)\\\\&= \\var{d(bx)} P\\end{align}\\]

\n

FBD I

\n

\\[\\begin{align} \\text{I: }\\Sigma M_D &=0\\\\ A\\,(\\var{q(x1)}) &= B_x\\,(\\var{q(y1)} + \\var{q(y2)})\\\\ A &= (\\var{d(bx)} P) \\, \\left(\\dfrac{\\var{q(y1+y2)}}{\\var{q(x1)}}\\right)\\\\  &= \\var{d(A)} P\\end{align}\\]

\n

", "rulesets": {}, "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"dperp": {"name": "dperp", "group": "solution", "definition": "x2 cos(radians(theta)) - y2 sin(radians(theta))", "description": "

\\var{x2} \\cos \\theta - \\var{y2} \\sin \\theta

", "templateType": "anything", "can_override": false}, "Y2": {"name": "Y2", "group": "Ungrouped variables", "definition": "9 + random(-2..2)", "description": "", "templateType": "anything", "can_override": false}, "Y1": {"name": "Y1", "group": "Ungrouped variables", "definition": "24+random(-3..3)", "description": "", "templateType": "anything", "can_override": false}, "X1": {"name": "X1", "group": "Ungrouped variables", "definition": "43 + random(-5..5)\n", "description": "

x

", "templateType": "anything", "can_override": false}, "X3": {"name": "X3", "group": "Ungrouped variables", "definition": "61 + random(-6..6)", "description": "", "templateType": "anything", "can_override": false}, "X2": {"name": "X2", "group": "Ungrouped variables", "definition": "35 + random(-5..5)", "description": "", "templateType": "anything", "can_override": false}, "X4": {"name": "X4", "group": "Ungrouped variables", "definition": "20 + random(-3..3)", "description": "", "templateType": "anything", "can_override": false}, "CE": {"name": "CE", "group": "solution", "definition": "(x2+x3+x4)/dperp", "description": "

\\dfrac{\\var{q(x2+x3+x4)}}{\\var{q(dperp)}}

", "templateType": "anything", "can_override": false}, "Bx": {"name": "Bx", "group": "solution", "definition": "ce sin(radians(theta))", "description": "", "templateType": "anything", "can_override": false}, "params": {"name": "params", "group": "Ungrouped variables", "definition": "[['x1',x1],['x2',x2],['x3',x3],['x4',x4],['y1',y1],['y2',y2]]", "description": "", "templateType": "anything", "can_override": false}, "theta": {"name": "theta", "group": "solution", "definition": "degrees(arctan(x3/y1))", "description": "", "templateType": "anything", "can_override": false}, "A": {"name": "A", "group": "solution", "definition": "bx * (y1+y2)/x1", "description": "

 (\\var{d(bx)} P) \\left(dfrac{\\var{q(y1+y2)}}{\\var{q(x1)}}

", "templateType": "anything", "can_override": false}, "applet": {"name": "applet", "group": "Ungrouped variables", "definition": "geogebra_applet('vugb9fzx', params)", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["X1", "X2", "X3", "X4", "Y1", "Y2", "params", "applet"], "variable_groups": [{"name": "solution", "variables": ["theta", "dperp", "CE", "Bx", "A"]}], "functions": {"q": {"parameters": [["n", "number"]], "type": "number", "language": "jme", "definition": "qty(d(n),'mm')"}, "d": {"parameters": [["n", "number"]], "type": "number", "language": "jme", "definition": "siground(n,4)"}}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": false, "customName": "", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "

Determine the compressive force on object $A$ in terms of squeezing forces $P$ when the vice grip pliers are in the position shown. (Assume that the forces acting on $A$ are vertical.)

\n

$A$ = [[0]] 

", "gaps": [{"type": "jme", "useCustomName": true, "customName": "A", "marks": "20", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "answer": "{siground(A,4)} P", "showPreview": true, "checkingType": "reldiff", "checkingAccuracy": "0.002", "failureRate": 1, "vsetRangePoints": 5, "vsetRange": ["0", "1"], "checkVariableNames": false, "singleLetterVariables": false, "allowUnknownFunctions": true, "implicitFunctionComposition": false, "caseSensitive": false, "valuegenerators": [{"name": "p", "value": ""}]}], "sortAnswers": false}], "partsMode": "all", "maxMarks": 0, "objectives": [], "penalties": [], "objectiveVisibility": "always", "penaltyVisibility": "always", "type": "question"}]}], "allowPrinting": true, "navigation": {"allowregen": true, "reverse": true, "browse": true, "allowsteps": true, "showfrontpage": false, "showresultspage": "oncompletion", "navigatemode": "sequence", "onleave": {"action": "none", "message": ""}, "preventleave": true, "startpassword": ""}, "timing": {"allowPause": true, "timeout": {"action": "none", "message": ""}, "timedwarning": {"action": "none", "message": ""}}, "feedback": {"showactualmark": true, "showtotalmark": true, "showanswerstate": true, "allowrevealanswer": true, "advicethreshold": 0, "intro": "", "end_message": "", "reviewshowscore": true, "reviewshowfeedback": true, "reviewshowexpectedanswer": true, "reviewshowadvice": true, "feedbackmessages": [], "enterreviewmodeimmediately": true, "showexpectedanswerswhen": "inreview", "showpartfeedbackmessageswhen": "always", "showactualmarkwhen": "always", "showtotalmarkwhen": "always", "showanswerstatewhen": "always", "showadvicewhen": "inreview"}, "diagnostic": {"knowledge_graph": {"topics": [], "learning_objectives": []}, "script": "diagnosys", "customScript": ""}, "type": "exam", "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}], "extensions": ["geogebra", "quantities", "stats", "weh"], "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": [["question-resources/vicegrips2FBD_VTYoSKJ.png", "/srv/numbas/media/question-resources/vicegrips2FBD_VTYoSKJ.png"], ["question-resources/vicegrips2.vwx", "/srv/numbas/media/question-resources/vicegrips2.vwx"]]}