// Numbas version: finer_feedback_settings {"name": "Parallel Axis Theorem: semi and quarter circles", "extensions": ["geogebra", "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%,Find the moment of inertia of semi and quarter circles using the parallel axis theorem.
", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "{geogebra_applet('emjtbcxv',ggb_points)}
\nDetermine the moment of inertia and radius of gyration about the {axis}-axis for the {lower(names[pts[0]])} and the {lower(names[pts[1]])} .
\nGrid units are [{units}].
\n\naxis | \nradius | \narea | \nibar | \nd | \nI | \nCentroid | \n
x | \n{r[\"A\"]} | \n{area[\"A\"]} | \n{ibarx[\"A\"]} | \n{d[\"x\"][\"A\"]} | \n{Ix[\"A\"]} | \n{siground(Centroid[\"A\"],3)} | \n
y | \n{r[\"A\"]} | \n{area[\"A\"]} | \n{ibary[\"A\"]} | \n{d[\"y\"][\"A\"]} | \n{Iy[\"A\"]} | \n\n |
axis | \nradius | \narea | \nibar | \nd | \nI | \nCentroid | \n
x | \n{r[\"B\"]} | \n{area[\"B\"]} | \n{ibarx[\"B\"]} | \n{d[\"x\"][\"B\"]} | \n{Ix[\"B\"]} | \n{siground(Centroid[\"B\"],3)} | \n
y | \n{r[\"B\"]} | \n{area[\"B\"]} | \n{ibary[\"B\"]} | \n{d[\"y\"][\"B\"]} | \n{Iy[\"B\"]} | \n\n |
axis | \nradius | \narea | \nibar | \nd | \nI | \nCentroid | \n
x | \n{r[\"C\"]} | \n{area[\"C\"]} | \n{ibarx[\"C\"]} | \n{d[\"x\"][\"C\"]} | \n{Ix[\"C\"]} | \n{siground(Centroid[\"C\"],3)} | \n
y | \n{r[\"C\"]} | \n{area[\"C\"]} | \n{ibary[\"C\"]} | \n{d[\"y\"][\"C\"]} | \n{Iy[\"C\"]} | \n\n |
For the circle:
\n$r = \\var{q(r[\"A\"],units)} \\qquad A = \\pi r^2 = \\var{q(area[\"A\"],units+'^2')}$
\n$\\bar{x} =\\var{q(centroid[\"A\"][0],units)} \\qquad \\bar{y} = \\var{q(centroid[\"A\"][1],units)}$
\nPlace a {if(axis=\"x\", \"horizontal\", \"vertical\" )} axis through the centroid of the {names[\"A\"]}. The centroidal moment of inertia with respect to this axis is:
\n$\\bar{I} = \\dfrac{\\pi r^4}{4} = \\var{q(Ibar[axis][\"A\"],units+'^4')}$
\nand the distance between the parallel axes is:
\n$d = \\var{q(abs(d[axis][\"A\"]),units)}$
\nApplying the parallel axis theorem and the definition of radius of gyration:
\n$I_{\\var{axis}} = \\bar{I} + A d^2 = \\var{q(I'[axis][\"A\"],units+'^4')}$
\n$k_{\\var{axis}} = \\sqrt{\\dfrac{I_{\\var{axis}}}{A}} = \\var{q(k[axis][\"A\"],units)}$
\n\nFor the semi-circle:
\n$r = \\var{q(r[\"B\"],units)} \\qquad A = \\dfrac{\\pi r^2}{2} = \\var{q(area[\"B\"],units+'^2')}$
\n$\\bar{x} = \\var{latex( offset(0,centers[\"B\"], radii[\"B\"]))} \\var{q(centroid[\"B\"][0],units)} \\qquad \\bar{y} = \\var{latex( offset(1,centers[\"B\"], radii[\"B\"]))} \\var{q(centroid[\"B\"][1],units)}$
\nPlace a {if(axis=\"x\", \"horizontal\", \"vertical\" )} axis through the centroid of the {names[\"B\"]}. The centroidal moment of inertia with respect to this axis is:
\n$\\bar{I} =\\var{ if(orientation=axis,latex(\"0.1098 r^4\"),latex(\"\\\\dfrac\\{\\\\pi r^4\\}\\{8\\}\")) }= \\var{q(Ibar[axis][\"B\"],units+'^4')}$
\nand the distance between the parallel axes is:
\n$d = \\var{q(abs(d[axis][\"B\"]),units)}$
\nApplying the parallel axis theorem and the definition of radius of gyration:
\n$I_{\\var{axis}} = \\bar{I} + A d^2 = \\var{q(I'[axis][\"B\"],units+'^4')}$
\n$k_{\\var{axis}} = \\sqrt{\\dfrac{I_{\\var{axis}}}{A}} = \\var{q(k[axis][\"B\"],units)}$
\n\nFor the quarter-circle:
\n$r = \\var{q(r[\"C\"],units)} \\qquad A = \\dfrac{\\pi r^2}{4} = \\var{q(area[\"C\"],units+'^2')}$
\n$\\bar{x} = \\var{latex( offset(0,centers[\"C\"], radii[\"C\"]))} \\var{q(centroid[\"C\"][0],units)} \\qquad \\bar{y} =\\var{latex( offset(1,centers[\"C\"], radii[\"C\"]))} \\var{q(centroid[\"C\"][1],units)}$
\nPlace a {if(axis=\"x\", \"horizontal\", \"vertical\" )} axis through the centroid of the {names[\"C\"]}. The centroidal moment of inertia with respect to this axis is:
\n$\\bar{I} = 0.0549 r^4= \\var{q(Ibar[axis][\"C\"],units+'^4')}$
\nand the distance between the parallel axes is:
\n$d = \\var{q(abs(d[axis][\"C\"]),units)}$
\nApplying the parallel axis theorem and the definition of radius of gyration:
\n$I_{\\var{axis}} = \\bar{I} + A d^2 = \\var{q(I'[axis][\"C\"],units+'^4')}$
\n$k_{\\var{axis}} = \\sqrt{\\dfrac{I_{\\var{axis}}}{A}} = \\var{q(k[axis][\"C\"],units)}$
\nrandomly located center points for the shapes
", "templateType": "anything", "can_override": false}, "k0": {"name": "k0", "group": "Unnamed group", "definition": "qty(k[axis][pts[0]],units)", "description": "", "templateType": "anything", "can_override": false}, "radii": {"name": "radii", "group": "Ungrouped variables", "definition": "[\"A\":centers[\"A\"] + random(1..5) * vector(0,1), \"B\":centers[\"B\"] + random(1..5) * vector(random([1,0],[-1,0],[0,-1],[0,1])), \"C\":centers[\"C\"] + random(1..5) / sqrt(2) * vector(random([1,1],[-1,1],[-1,-1],[-1,1]))]", "description": "This is a point which defines the radius. The centroid is on a line passing through center and this point.
\nThe actual radius is the distance between center and radii.
\n", "templateType": "anything", "can_override": false}, "names": {"name": "names", "group": "Ungrouped variables", "definition": "[\"A\":\"Circle\",\"B\":\"Semi-circle\",\"C\":\"Quarter-circle\"]\n", "description": "the names of the shapes
", "templateType": "anything", "can_override": false}, "centroid": {"name": "centroid", "group": "calculated", "definition": "[\"A\": centers[\"A\"], \"B\": centers[\"B\"] + 4 (radii[\"B\"] - centers[\"B\"]) /3 /pi, \"C\": centers[\"C\"] + 4 sqrt(2) (radii[\"C\"] - centers[\"C\"]) /3 /pi]", "description": "need sqrt(2) for quarter circle because of the way radii is defined
", "templateType": "anything", "can_override": false}, "axis": {"name": "axis", "group": "Ungrouped variables", "definition": "random('x','y')", "description": "random choice for question
", "templateType": "anything", "can_override": false}, "I'": {"name": "I'", "group": "calculated", "definition": "[\"x\":Ix,\"y\":Iy]", "description": "Cant call it I because I is a reserved variable
", "templateType": "anything", "can_override": false}, "k": {"name": "k", "group": "calculated", "definition": "[\"x\":kx,\"y\":ky]", "description": "", "templateType": "anything", "can_override": false}, "units": {"name": "units", "group": "Ungrouped variables", "definition": "random('in','cm','ft','mm')", "description": "", "templateType": "anything", "can_override": false}, "d": {"name": "d", "group": "calculated", "definition": "[\"x\": dict(map([p,centroid[p][1]],p,sort(pts))), \"y\": dict(map([p,centroid[p][0]],p,sort(pts)))]", "description": "d[\"x\"] gives distance from the y-axis
\nThis is the value needed for parallel axis theorem when calculating I_x
", "templateType": "anything", "can_override": false}, "Ix": {"name": "Ix", "group": "calculated", "definition": "dict(map([p,Ibarx[p] + Area[p] * \n d[\"x\"][p]^2],p,sort(pts)))", "description": "", "templateType": "anything", "can_override": false}, "orientation": {"name": "orientation", "group": "calculated", "definition": "if(centers[\"B\"][0] = radii[\"B\"][0],\"x\",\"y\")", "description": "This determines which axis the semicircle's diameter is parallel to.
", "templateType": "anything", "can_override": false}, "debug": {"name": "debug", "group": "Ungrouped variables", "definition": "false", "description": "", "templateType": "anything", "can_override": false}, "pts": {"name": "pts", "group": "Ungrouped variables", "definition": "shuffle([\"A\",\"B\",\"C\"])", "description": "this is where the randomizing of the shapes occurs.
", "templateType": "anything", "can_override": false}, "ggb_points": {"name": "ggb_points", "group": "Ungrouped variables", "definition": "map([p,centers[p]],p,pts) +\nmap(['R'+p,radii[p]],p,pts)[0..2]+\nmap(['R'+p,centers[p]],p,pts)[2..3]", "description": "The problem is about two shapes randomly selected, which are the first two values in the pts array.
\nThe first map is the center coordinates for all three shapes.
\nthe second map is the random radii for the first two shapes,
\nThe last map sets the radius of the third shapes to its center, which hides it in GGB.
\n\nmap([p,centers[p]],p,pts) +
map(['R'+p,radii[p]],p,pts)[0..2]+
map(['R'+p,centers[p]],p,pts)[2..3]
the radii of the three shapes
", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "", "maxRuns": 100}, "ungrouped_variables": ["pts", "axis", "ggb_points", "names", "centers", "radii", "units", "debug"], "variable_groups": [{"name": "calculated", "variables": ["r", "area", "centroid", "Ibarx", "Iy", "Ibary", "Ix", "ky", "kx", "Ibar", "k", "I'", "d", "orientation"]}, {"name": "Unnamed group", "variables": ["I0", "I1", "k0", "k1"]}], "functions": {"": {"parameters": [], "type": "number", "language": "jme", "definition": ""}, "q": {"parameters": [["q", "number"], ["u", "string"]], "type": "string", "language": "jme", "definition": "siground(qty(q,u),4)"}, "offset": {"parameters": [["way", "number"], ["c", "vector"], ["d", "vector"]], "type": "string", "language": "jme", "definition": "let(dir,sign(d[way]-c[way]),r,siground(abs(c-d),3),\n if(dir=0,'', c[way] + \"\\\\textrm{ \" + units + \"\\} \" + if(dir=1,\"+\",\"-\") + \n\"\\\\dfrac\\{4r\\}\\{3\\\\pi\\} =\"))"}}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": true, "customName": "{names[pts[0]]}", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "$I_\\var{axis}$ = [[0]] $k_\\var{axis}$ = [[1]]
\n{siground(I0,4)} {siground(k0,4)}
", "gaps": [{"type": "engineering-answer", "useCustomName": true, "customName": "I", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "I0", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "k", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "k0", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}], "sortAnswers": false}, {"type": "gapfill", "useCustomName": true, "customName": "{names[pts[1]]}", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "prompt": "$I_\\var{axis}$ = [[0]] $k_\\var{axis}$ = [[1]]
\n{siground(I1,4)} {siground(k1,4)}
", "gaps": [{"type": "engineering-answer", "useCustomName": true, "customName": "I", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "I1", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "engineering-answer", "useCustomName": true, "customName": "k", "marks": "5", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": false, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "k1", "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/"}]}