// Numbas version: finer_feedback_settings {"name": "Equilibrium of a rigid body: Car on a hill", "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%,Classic problem of a vehicle parked on an incline. Best solved by rotating the coordinate system.
\nImage Credit: https://svgsilh.com/image/34325.html CC-0
", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "{geogebra_applet('w4xb6n95',['alpha': radians(alpha), 'fbd': [visible: false] ])}
\nA car is parked on a {alpha}° slope, with the rear wheels locked by the parking brake. Find the components of the forces acting on each of the front and rear wheels, parallel and perpendicular to the roadbed.
\nVehicle Specifications
\nWheelbase | \n$L = $ {wb} mm | \n
Curb weight | \n$m = $ {m} kg | \n
Center of Gravity | \n$d = $ {d} mm $h = $ {h} mm | \n
{geogebra_applet('w4xb6n95',['alpha': radians(alpha), 'fbd': [definition: 'true', visible: true] ])}
\nFirst, draw a free body diagram of the vehicle.
\nFor convenience, let the x- and y- directions be parallel and perpendicular to the roadbed and define $\\alpha$ as the the angle the road makes with the horizontal. Note that $\\alpha$ is also the angle between the weight and the y-direction. Treat the front wheels like a roller, the rear wheels like a rough surface.
\n$\\alpha = \\var{alpha}°$
\nDefine $L$ as the distance between the front and rear wheels:
\n$L= \\var{qty(wb,'mm')}$
\nNote that the curb 'weight' is actually a mass, so let:
\n$\\begin{align}W &= m g\\\\ &= (\\var{qty(m,'kg')}) \\cdot (\\var{qty(g, 'm/s^2')}) =\\var{show(w)}\\\\ W_x& = W \\sin \\alpha = \\var{show(w_x)}\\\\W_y& = W \\cos \\alpha = \\var{show(w_y)}\\end{align}$
\nApply the equations of equilibrium, starting with the sum of the moments about either A or B, since two unknown forces intersect there.
\n$\\begin{align}\\Sigma M_A &= 0\\\\ B_y (L) &= W_y(d) + W_x (h)\\\\ B_y &= W \\left(\\dfrac{d \\cos \\alpha + h \\sin \\alpha}{L}\\right)\\\\&= \\var{show(B_y)}\\\\\\\\ \\Sigma F_x &= 0\\\\ B_x &= W_x\\\\ B_x &= \\var{show(w_x)}\\\\\\\\ \\Sigma F_y &= 0\\\\A + B_y &= W_y \\\\A &= W_y-B_y\\\\&=\\var{show(A)}\\end{align}$
\nSince there are two front wheels and two rear wheels, the forces acting on each wheel are half of these values:
\n$A_{||} = 0 \\text{ N} \\qquad A_\\perp = A/2 = \\var{show(A/2)} \\qquad B_{||} = B_x/2 = \\var{show(B_x/2)} \\qquad B_\\perp = B_y/2 = \\var{show(B_y/2)}$
", "rulesets": {}, "extensions": ["geogebra", "quantities", "weh"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"B_x": {"name": "B_x", "group": "answers", "definition": "w_x", "description": "", "templateType": "anything", "can_override": false}, "h": {"name": "h", "group": "Ungrouped variables", "definition": "round(random(90..110) d /100)", "description": "", "templateType": "anything", "can_override": false}, "A": {"name": "A", "group": "answers", "definition": "w_y-b_y", "description": "", "templateType": "anything", "can_override": false}, "w_y": {"name": "w_y", "group": "answers", "definition": "W cos(radians(alpha))", "description": "", "templateType": "anything", "can_override": false}, "d": {"name": "d", "group": "Ungrouped variables", "definition": "round(random(0.25..0.35#0.01)wb)", "description": "", "templateType": "anything", "can_override": false}, "B_y": {"name": "B_y", "group": "answers", "definition": "(w_x h + w_y d)/wb", "description": "", "templateType": "anything", "can_override": false}, "m": {"name": "m", "group": "Ungrouped variables", "definition": "random(1200..1400)", "description": "curb weight in kg
", "templateType": "anything", "can_override": false}, "W": {"name": "W", "group": "answers", "definition": "m g ", "description": "weight of vechicle
", "templateType": "anything", "can_override": false}, "w_x": {"name": "w_x", "group": "answers", "definition": "W sin(radians(alpha))", "description": "", "templateType": "anything", "can_override": false}, "g": {"name": "g", "group": "Ungrouped variables", "definition": "9.81", "description": "", "templateType": "anything", "can_override": false}, "wb": {"name": "wb", "group": "Ungrouped variables", "definition": "random(2450..2580)", "description": "wheelbase in mm
", "templateType": "anything", "can_override": false}, "alpha": {"name": "alpha", "group": "Ungrouped variables", "definition": "random([10,15,20,25,30])", "description": "", "templateType": "anything", "can_override": false}, "units": {"name": "units", "group": "Ungrouped variables", "definition": "['N','mm']", "description": "", "templateType": "anything", "can_override": false}, "debug": {"name": "debug", "group": "answers", "definition": "false", "description": "", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["alpha", "m", "wb", "units", "d", "h", "g"], "variable_groups": [{"name": "answers", "variables": ["w_y", "A", "w_x", "B_x", "B_y", "W", "debug"]}], "functions": {"show": {"parameters": [["f", "number"]], "type": "number", "language": "jme", "definition": "siground(qty(f,'N'),4)"}}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": false, "customName": "", "marks": 0, "scripts": {"mark": {"script": "//numbasGGBApplet0.setValue('fbd',true)\n//numbasGGBApplet0.setVisible('fbd',true)", "order": "after"}}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "$A_{||} =$ [[0]] $\\qquad A_\\perp = $ [[3]] $0 B_{\\perp} = \\var{qty(A/2 ,'N')}$
\n$B_{||} =$ [[1]] $\\qquad B_\\perp = $ [[2]] $B_{||}= \\var{qty(B_x/2,'N')} B_{\\perp} = \\var{qty(B_y/2,'N')}$
", "gaps": [{"type": "engineering-answer", "useCustomName": false, "customName": "", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(0, 'N')", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": false, "customName": "", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(B_x/2,'N')", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": false, "customName": "", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(B_y/2,'N')", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": false, "customName": "", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "qty(A/2 ,'N')", "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", "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/"}]}