// Numbas version: exam_results_page_options {"name": "Equilibrium of a rigid body: bell crank", "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.

Does clumsy substitution to

\n

1. replace '-' with ' '

\n

2. replace '°' with ' deg'

\n

to allow answers like 10 ft-lb and 30°

", "name": "student_units"}, {"definition": "try(\ncompatible(quantity(1, student_units),correct_units),\nmsg,\nfeedback(msg);false)\n", "description": "", "name": "good_units"}, {"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", "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.

", "name": "student_quantity"}, {"definition": "try(\nscalar(abs((correct_quantity - student_quantity)/correct_quantity))*100 \n,msg,\nif(student_quantity=correct_quantity,0,100))\n ", "description": "", "name": "percent_error"}, {"definition": "percent_error <= settings['right']\n", "description": "", "name": "right"}, {"definition": "right_sign and percent_error <= settings['close']", "description": "

Only marked close if the student actually has the right sign.

", "name": "close"}, {"definition": "sign(student_scalar) = sign(correct_quantity) ", "description": "", "name": "right_sign"}], "settings": [{"input_type": "code", "evaluate": true, "hint": "The correct answer given as a JME quantity.", "default_value": "", "label": "Correct Quantity.", "help_url": "", "name": "correctAnswer"}, {"input_type": "code", "evaluate": true, "hint": "Question will be considered correct if the scalar part of the student's answer is within this % of correct value.", "default_value": "0.2", "label": "% Accuracy for right.", "help_url": "", "name": "right"}, {"input_type": "code", "evaluate": true, "hint": "Question will be considered close if the scalar part of the student's answer is within this % of correct value.", "default_value": "1.0", "label": "% Accuracy for close.", "help_url": "", "name": "close"}, {"input_type": "percent", "hint": "Partial Credit for close value with appropriate units.  if correct answer is 100 N and close is ±1%,
99  N is accepted.", "default_value": "75", "label": "Close with units.", "help_url": "", "name": "C1"}, {"input_type": "percent", "hint": "Partial credit for forgetting units or using wrong sign.
If the correct answer is 100 N, both 100 and -100 N are accepted.", "default_value": "50", "label": "No units or wrong sign", "help_url": "", "name": "C2"}, {"input_type": "percent", "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.", "default_value": "25", "label": "Close, no units.", "help_url": "", "name": "C3"}], "public_availability": "restricted", "published": false, "extensions": ["quantities"]}, {"source": {"pk": 23, "author": {"name": "William Haynes", "pk": 2530}, "edit_page": "/part_type/23/edit"}, "name": "Drop-down axis reference", "short_name": "drop-down-axis-reference", "description": "

Choose a reference axis. Returns an integer index between 0 and 3.  0 =+x axis 1 = +y axis 2 = -x axis 3 = -y axis

\n

To work with angle quantity part type, include a list variable angle_from_ref, and use the axis choice as index. Replace theta with name of angle.

\n

let(ang,theta,
[if(ang>180,ang-360,ang),
if(ang>270,ang-450,if(ang < -90,ang+270,ang-90)),
if(ang>0,ang-180,ang+180),
if(ang>90,ang-270,90+ang)])

\n

\n

and this (modified as necessary) in the mark student answer (after) script:

\n

angles = Numbas.jme.unwrapValue(Numbas.exam.currentQuestion.scope.getVariable('angle_from_ref'));
ans = Qty(angles[index]+' deg');
this.parentPart.gaps[1].settings.correct_quantity.value=ans;
this.markingComment(\"For your axis, the direction is \" + ans.toString() +'.');

\n

", "help_url": "", "input_widget": "dropdown", "input_options": {"correctAnswer": "0", "hint": {"value": "", "static": true}, "choices": {"value": ["Positive x-axis", "Positive y-axis", "Negative x-axis", "Negative y-axis"], "static": true}}, "can_be_gap": true, "can_be_step": true, "marking_script": "mark:\ncorrect('You chose the ' \n+ ['positive x',\n 'positive y',\n 'negative x',\n 'negative y'][interpreted_answer] +'-axis.')\n \n \n \n\ninterpreted_answer:\nstudentAnswer", "marking_notes": [{"definition": "correct('You chose the ' \n+ ['positive x',\n 'positive y',\n 'negative x',\n 'negative y'][interpreted_answer] +'-axis.')\n \n \n ", "description": "This is the main marking note. It should award credit and provide feedback based on the student's answer.", "name": "mark"}, {"definition": "studentAnswer", "description": "A value representing the student's answer to this part.", "name": "interpreted_answer"}], "settings": [{"label": "dummy", "input_type": "string", "name": "dummy", "hint": "", "subvars": false, "help_url": "", "default_value": "'ignore'"}], "public_availability": "restricted", "published": false, "extensions": []}, {"source": {"pk": 24, "author": {"name": "William Haynes", "pk": 2530}, "edit_page": "/part_type/24/edit"}, "name": "Angle quantity", "short_name": "angle-quantity-from-reference", "description": "

Angle as a quantity in degrees.

\n

Two forces act on a bell crank. This problem has two unknown magnitudes and an unknown direction which makes it tricky to solve by the equilibrium equation method.

\n

The solution is much simpler if three force body principle is used.

", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "name": "Equilibrium of a rigid body: bell crank", "rulesets": {}, "ungrouped_variables": [], "variable_groups": [{"name": "inputs", "variables": ["L_C", "alpha", "beta", "L_B", "limit", "units", "debug"]}, {"name": "output", "variables": ["mag_c", "mag_b", "theta_C", "FC", "FB", "mag_a", "theta_A", "FA", "angle_from_ref"]}], "tags": ["mechanics", "Mechanics", "Rigid body equilibrium", "rigid body equilibrium", "statics", "Statics", "Three force body", "three force body"], "statement": "

Two forces, B and C, act on the arms of the rigid bell crank shown.  Arm AB is {L_B} long, and arm AC is {L_C} long, and the bell crank is free to pivot on pin A

\n

{geogebra_applet('at35nexv',[['L_B',scalar(L_B)],['L_C',scalar(L_C)],['α',alpha+'°'],['β',beta+'°']])}

\n

\n

Equilibrium Equation approach :

\n

Four Unknowns: Magnitudes of B and C,  $A_x$ , $A_y$

\n

Four Equations:  Three equations of equilibrium plus A = $\\sqrt{A_x^2 + A_y^2} = \\var{limit}$

\n

\n

\\\begin{align}\\Sigma M_A &= 0\\\\ M_B &= M_C \\\\B \\cdot d_{AB}\\, \\cos \\beta &= C \\cdot d_{AC}\\\\C&= B \\,\\cos \\var{beta}°\\left( \\frac{\\var{L_B}}{\\var{L_C}}\\right)\\\\C &=\\var{siground(cos(radians(beta)) * (L_B /L_C),4)}B \\end{align}\

\n

\\\begin{align}\\Sigma F_x &= 0\\\\A_x &= C_x\\\\&=C \\,\\sin \\var{alpha}°\\\\&=(\\var{siground(cos(radians(beta)) * (L_B /L_C),4)} B)\\, \\sin \\var{alpha}°\\\\&=\\var{siground(mag_c * sin(radians(alpha)),4) } B \\end{align}\

\n

\\\begin{align}\\Sigma F_y &= 0\\\\A_y &=B+ C_y\\\\&= B +C \\cos \\var{alpha}°\\\\ &= B +(\\var{siground(mag_C,4)} B ) \\cos \\var{alpha}° \\\\ &= \\var{siground(1 + mag_c * cos(radians(alpha)),4) } B \\end{align}\

\n

\\\begin{align}A=\\sqrt{A_x^2 + A_y^2} &= \\var{limit}\\\\ \\sqrt{(\\var{siground(mag_c * sin(radians(alpha)),4) } B)^2 + (\\var{siground(1 + mag_c * cos(radians(alpha)) ,4) } B)^2 }&= \\var{limit}\\\\B\\sqrt{(\\var{siground(mag_c * sin(radians(alpha)),4) })^2 + (\\var{siground(1 + mag_c * cos(radians(alpha)) ,4) })^2 }&= \\var{limit}\\\\B=\\var{siground(limit/mag_A,4)}\\end{align}\

\n

Three force body approach:

\n

Three unknowns: Magnitudes of B and C, direction of A.

\n

The lines of action of B and C are known so you can use geometry to find their intersection point.  Force A passes through this point too, so you can determine from this the direction of A.

\n

With the three directions known as well as the magnitude of A, draw a force triangle and solve for B and C.

", "parts": [{"variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "useCustomName": false, "marks": 0, "scripts": {}, "showCorrectAnswer": true, "gaps": [{"variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "useCustomName": false, "marks": "4", "scripts": {}, "showCorrectAnswer": true, "settings": {"C3": "25", "C1": "75", "close": "1.0", "C2": "50", "correctAnswer": "limit/mag_A", "right": "0.2"}, "showFeedbackIcon": true, "extendBaseMarkingAlgorithm": true, "unitTests": [], "customName": "", "variableReplacements": [], "type": "engineering-answer"}], "showFeedbackIcon": true, "extendBaseMarkingAlgorithm": true, "sortAnswers": false, "unitTests": [], "customName": "", "prompt": "

Determine the maximum force which can be applied at B if the magnitude of the reaction at A is not to exceed {limit}.

\n

B = [[0]]

\n

B = {siground(limit/mag_A,4)}

", "variableReplacements": [], "type": "gapfill"}, {"variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "useCustomName": false, "marks": 0, "scripts": {}, "showCorrectAnswer": true, "gaps": [{"variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "useCustomName": false, "marks": "4", "scripts": {}, "showCorrectAnswer": true, "settings": {"C3": "25", "C1": "75", "close": "1.0", "C2": "50", "correctAnswer": "mag_C limit/mag_A", "right": "0.2"}, "showFeedbackIcon": true, "extendBaseMarkingAlgorithm": true, "unitTests": [], "customName": "", "variableReplacements": [], "type": "engineering-answer"}], "showFeedbackIcon": true, "extendBaseMarkingAlgorithm": true, "sortAnswers": false, "unitTests": [], "customName": "", "prompt": "

What is the corresponding magnitude of the force at ?

\n

C = [[0]]

\n

C  = {siground(mag_C limit/mag_A,4)}

", "variableReplacements": [], "type": "gapfill"}, {"variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "useCustomName": false, "marks": 0, "scripts": {}, "showCorrectAnswer": true, "gaps": [{"variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "useCustomName": false, "marks": "0", "scripts": {"mark": {"script": "index = Numbas.jme.unwrapValue(this.studentAnswerAsJME());\nangles = Numbas.jme.unwrapValue(Numbas.exam.currentQuestion.scope.getVariable('angle_from_ref'));\nans = Qty(angles[index]+' deg');\nthis.parentPart.gaps[1].settings.correct_quantity.value=ans;\nthis.markingComment(\"For your axis, the direction is \" + ans.toString() +'.');", "order": "after"}}, "showCorrectAnswer": true, "settings": {"dummy": "'ignore'"}, "showFeedbackIcon": true, "extendBaseMarkingAlgorithm": true, "unitTests": [], "customName": "", "variableReplacements": [], "type": "drop-down-axis-reference"}, {"variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "useCustomName": false, "marks": "4", "scripts": {}, "showCorrectAnswer": true, "settings": {"C3": "25", "restrict_angle": true, "C1": "75", "correct_quantity": "qty(theta_A,'deg')", "close": "1.0", "C2": "50", "right": "0.2"}, "showFeedbackIcon": true, "extendBaseMarkingAlgorithm": true, "unitTests": [], "customName": "", "variableReplacements": [], "type": "angle-quantity-from-reference"}], "showFeedbackIcon": true, "extendBaseMarkingAlgorithm": true, "sortAnswers": false, "unitTests": [], "customName": "", "prompt": "

In what direction does the force at A act?

\n

$\\theta_A$ = [[1]] measured from the [[0]].

\n

$\\theta_A$ = {theta_A}

", "variableReplacements": [], "type": "gapfill"}], "extensions": ["geogebra", "quantities", "weh"], "variablesTest": {"condition": "(180 - alpha - beta) >=70", "maxRuns": 100}, "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}]}]}], "contributors": [{"name": "William Haynes", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/2530/"}]}