// Numbas version: finer_feedback_settings {"name": "Moment of a couple", "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 a couple formed by two equal and opposite forces.
", "licence": "Creative Commons Attribution-NonCommercial 4.0 International"}, "statement": "{applet}
\n{setAxisVisible(applet,false)}
\nDetermine the moment of the couple formed by the two {F} {units[1]} forces shown. Grid units are in [{units[0]}].
", "advice": "The moment of a couple is found by multiplying the magnitude of force by the perpendicular distance between the lines of action of the two forces. The direction is determined by inspection. You will need to determine the perpendicular distance using the known locations of the two points, the direction of the force, geometry and trigonometry as we have done before.
\n$ M = F \\cdot d_\\perp$
\n$ M = (\\var{F}\\, \\var{units[1]} ) (\\var{abs(siground(moment/F,4))}\\, \\var{units[0]} ) = \\var{siground(abs(answer),4)}$ {if(moment >0,'Counterclockwise','Clockwise')}
\nAlternately, you get the same result by finding the moment of one force about a point on the line of action of the other one.
\nSo, for example, take the moment of the force at $A$ about point $B$ using Verignon's Theorem. The signs in the equation below are determined by the direction of the component moments, using the sign convention that counterclockwise moments are positive. The sign of the resulting moment indicates its direction and it should agree with your expectations from inspection of the diagram.
\n$ M = \\pm F_x d_y \\pm F_y d_x $
\n$ M = \\pm\\, ( \\var{d(Force[0] )} \\, \\var{units[1]} ) ( \\var{d(r[1])} \\, \\var{units[0]} ) \\pm\\, ( \\var{d(Force[1] )} \\, \\var{units[1]} ) ( \\var{d(r[0])} \\, \\var{units[0]} )$
\n$M = \\var{siground(answer,4)}$
\n$M = \\var{siground(abs(answer),4)} $ {if(moment >0,'Counterclockwise','Clockwise')}
", "rulesets": {}, "extensions": ["geogebra", "quantities"], "builtin_constants": {"e": true, "pi,\u03c0": true, "i": true}, "constants": [], "variables": {"F": {"name": "F", "group": "inputs", "definition": "random(10..400#10)", "description": "", "templateType": "anything", "can_override": false}, "A": {"name": "A", "group": "inputs", "definition": "vector(random(-8..8),random(-6..6))", "description": "", "templateType": "anything", "can_override": false}, "theta": {"name": "theta", "group": "inputs", "definition": "random(5..355#5 except [90,-90,180])", "description": "", "templateType": "anything", "can_override": false}, "r": {"name": "r", "group": "results", "definition": "A-B + vector(0,0,0)", "description": "position vector
", "templateType": "anything", "can_override": false}, "B": {"name": "B", "group": "inputs", "definition": "vector(random(-8..8),random(-6..6))", "description": "", "templateType": "anything", "can_override": false}, "Force": {"name": "Force", "group": "results", "definition": "vector(f cos(radians(theta)),f sin(radians(theta)),0)", "description": "Force vector
", "templateType": "anything", "can_override": false}, "answer": {"name": "answer", "group": "results", "definition": "d(moment) qty(units[1])qty(units[0])", "description": "rounded value of moment as quantity
", "templateType": "anything", "can_override": false}, "moment": {"name": "moment", "group": "results", "definition": "cross(r,force)[2]", "description": "Magnitude of moment
", "templateType": "anything", "can_override": false}, "units": {"name": "units", "group": "inputs", "definition": "random(['in','lb'],['m','kN'],['cm','N'])", "description": "", "templateType": "anything", "can_override": false}, "params": {"name": "params", "group": "Ungrouped variables", "definition": "[ A: A, B: B, '\u03b8': radians(theta), show: [definition: 'false', visible: false]]", "description": "", "templateType": "anything", "can_override": false}, "applet": {"name": "applet", "group": "Ungrouped variables", "definition": "geogebra_applet('whx4ybuq', params )", "description": "", "templateType": "anything", "can_override": false}, "dperp": {"name": "dperp", "group": "results", "definition": "abs(moment)/F", "description": "perpendicular distance
", "templateType": "anything", "can_override": false}}, "variablesTest": {"condition": "abs(r) > 2 // nice size\nand dperp/abs(r) < 0.96 // cos angle makes angle > 15\u00b0\nand dperp/abs(r) > 0.18 // cos angle makes angle < 80\u00b0\nand A[0] <> B[0] and A[1] <> B[1] // not on same vertical or horizontal axis", "maxRuns": 100}, "ungrouped_variables": ["params", "applet"], "variable_groups": [{"name": "inputs", "variables": ["A", "B", "theta", "units", "F"]}, {"name": "results", "variables": ["r", "Force", "moment", "answer", "dperp"]}], "functions": {"d": {"parameters": [["v", "number"]], "type": "number", "language": "jme", "definition": "siground(abs(v),4)"}, "setAxisVisible": {"parameters": [["app", "ggbapplet"], ["visible", "boolean"]], "type": "anything", "language": "javascript", "definition": "app.promise.then(function(d) {\n d.app.setAxesVisible(visible,visible);});\nreturn new Numbas.jme.types.ggbapplet(app);\n\n"}}, "preamble": {"js": "question.signals.on('adviceDisplayed',function() {\n try{\n var app = question.scope.variables.applet.app; \n app.setVisible(\"show\", true,false);\n app.setValue(\"show\", 1);\n }\n catch(err){} \n})", "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": "$M$ = [[0]] [[1]]
", "gaps": [{"type": "engineering-answer", "useCustomName": true, "customName": "mag", "marks": "10", "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": true, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "settings": {"correctAnswer": "abs(answer)", "right": "0.2", "close": "1.0", "C1": "75", "C2": "50", "C3": "25"}}, {"type": "1_n_2", "useCustomName": true, "customName": "dir", "marks": 0, "scripts": {}, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "showCorrectAnswer": true, "showFeedbackIcon": false, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "nextParts": [], "suggestGoingBack": false, "adaptiveMarkingPenalty": 0, "exploreObjective": null, "minMarks": 0, "maxMarks": 0, "shuffleChoices": true, "displayType": "dropdownlist", "displayColumns": 0, "showCellAnswerState": true, "choices": ["Clockwise", "Counterclockwise"], "matrix": "[if(moment<0,5,0),if(moment>0,5,0)]"}], "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/"}]}