// Numbas version: exam_results_page_options {"duration": 900, "showQuestionGroupNames": false, "timing": {"timedwarning": {"action": "warn", "message": "

test message 3

"}, "allowPause": true, "timeout": {"action": "warn", "message": "

test message 2

"}}, "question_groups": [{"pickQuestions": 1, "name": "Group", "pickingStrategy": "all-ordered", "questions": [{"name": "Vector addition by summing scalar components", "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.

Add three vectors by determining their scalar components, summing them and then resolving the rectangular components to find the magnitude and direction of the resultant

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

Three forces act on the bracket at point A:   A = {FA} {units[1]}, B = {FB} {units[1]} and, = {FC} {units[1]}.

\n

Find the magnitude and direction of the resultant force R by summing scalar components.

\n

{geogebra_applet('dtf3t2dp', [['A',A],['B',B],['C',C],['F_a',FA],['F_b',FB],['F_c',FC],['α', alpha],['unit','\"'+units[0]+'\"']])}

\n

\n

Force A: {fa} at {alpha} = {forceA}

\n

Force B: {fb} at {beta} = {forceB}

\n

Force C: {fc} at {gamma} = {forceC}

\n

Resultant: {R} at {rho}  = {forceR}

\n

$R_x = \\Sigma F_x = (\\var{siground(ForceA[0],4)}) + (\\var{siground(ForceB[0],4)}) +( \\var{siground(ForceC[0],4)}) = \\var{siground(ForceR[0],4)}$ {units[1]}

\n

$R_y = \\Sigma F_y = (\\var{siground(ForceA[1],4)}) + (\\var{siground(ForceB[1],4)}) +( \\var{siground(ForceC[1],4)}) = \\var{siground(ForceR[1],4)}$ {units[1]}

\n

\n

$R=\\sqrt{R_x^2 + R_y^2} = \\sqrt{(\\var{siground(ForceR[0],4)})^2 +(\\var{siground(ForceR[0],4)})^2} = \\var{siground(abs(ForceR),4)}$ {units[1]}

\n

\n

$\\theta = \\tan^{-1}\\left(\\left|\\frac{R_y}{R_x}\\right| \\right) = \\tan^{-1}\\left(\\left|\\frac{\\var{siground(ForceR[1],4)}}{\\var{siground(ForceR[0],4)}}\\right| \\right) = \\var{siground(degrees(arctan(abs(forceR[1])/forceR[0])),4)}° = (\\var{siground(rho,4)}°$ from the positive x-axis.)

", "rulesets": {}, "variables": {"FC": {"name": "FC", "group": "Inputs", "definition": "random(10..100#5)", "description": "

Magnitude of force C

", "templateType": "anything"}, "A": {"name": "A", "group": "Inputs", "definition": "vector(0,0)", "description": "

Position of point A

", "templateType": "anything"}, "C": {"name": "C", "group": "Inputs", "definition": "vector(random(1,-1)random(2..6),random(1,-1)random(2..6))", "description": "

Position of point C

", "templateType": "anything"}, "B": {"name": "B", "group": "Inputs", "definition": "vector( random(1,-1) random(4..10),random(1,-1) random(2..5))", "description": "

Position of point B

", "templateType": "anything"}, "FA": {"name": "FA", "group": "Inputs", "definition": "random(10..100#5)", "description": "

Magnitude of force A

", "templateType": "anything"}, "debug": {"name": "debug", "group": "Inputs", "definition": "false", "description": "", "templateType": "anything"}, "ForceR": {"name": "ForceR", "group": "Outputs", "definition": "ForceA+ForceB+ForceC", "description": "

Resultant as a vector

", "templateType": "anything"}, "R": {"name": "R", "group": "Outputs", "definition": "sqrt(ForceR[0]^2+forceR[1]^2)", "description": "

Magnitude of resultant

", "templateType": "anything"}, "ForceC": {"name": "ForceC", "group": "Outputs", "definition": "FC *( vector(cos(radians(gamma)),sin(radians(gamma))))", "description": "

Force C as a vector

", "templateType": "anything"}, "FB": {"name": "FB", "group": "Inputs", "definition": "random(10..100#10)", "description": "

Magnitude of Force B

", "templateType": "anything"}, "rho": {"name": "rho", "group": "Outputs", "definition": "degrees(direction(ForceR))", "description": "

direction of resultant

", "templateType": "anything"}, "beta": {"name": "beta", "group": "Outputs", "definition": "degrees(direction(vector(B[0]-A[0],B[1]-A[1])))", "description": "

Direction of force B

", "templateType": "anything"}, "ForceA": {"name": "ForceA", "group": "Outputs", "definition": "FA *( vector(cos(radians(alpha)),sin(radians(alpha))))", "description": "

force A as a vector

", "templateType": "anything"}, "angle_from_ref": {"name": "angle_from_ref", "group": "Outputs", "definition": "let(ang,rho,\n[if(ang>180,ang-360,ang),\nif(ang>270,ang-450,if(ang < -90,ang+270,ang-90)),\nif(ang>0,ang-180,ang+180),\nif(ang>90,ang-270,90+ang)])", "description": "", "templateType": "anything"}, "gamma": {"name": "gamma", "group": "Outputs", "definition": "degrees(direction(vector(C[0]-A[0],C[1]-A[1])))", "description": "

Direction of force C in degrees

", "templateType": "anything"}, "ForceB": {"name": "ForceB", "group": "Outputs", "definition": "FB *( vector(cos(radians(beta)),sin(radians(beta))))", "description": "

Force B as a vector

", "templateType": "anything"}, "units": {"name": "units", "group": "Inputs", "definition": "random(['ft','lb'],['in','lb'],['cm','N'])", "description": "", "templateType": "anything"}, "alpha": {"name": "alpha", "group": "Inputs", "definition": "(random(-80..175#5 except[45,135,-45,80,100]))", "description": "

direction of force A

", "templateType": "anything"}}, "variablesTest": {"condition": "B[0]<>C[0] and B[1]<>C[1] and abs(alpha-beta) >= 15 and abs(gamma-beta) >= 15 and abs(gamma-alpha) >= 15", "maxRuns": 100}, "ungrouped_variables": [], "variable_groups": [{"name": "Inputs", "variables": ["A", "B", "C", "alpha", "FA", "FB", "FC", "units", "debug"]}, {"name": "Outputs", "variables": ["ForceA", "beta", "gamma", "ForceB", "ForceC", "ForceR", "rho", "R", "angle_from_ref"]}], "functions": {"direction": {"parameters": [["v", "vector"]], "type": "number", "language": "javascript", "definition": "return Math.atan2(v[1],v[0])"}}, "preamble": {"js": "", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": true, "customName": "Components of Components", "marks": 0, "showCorrectAnswer": true, "showFeedbackIcon": true, "scripts": {}, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "adaptiveMarkingPenalty": 0, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "prompt": "

Find the scalar components of the component forces A, B, and C

\n

$A_x =$ [[0]]  $B_x =$ [[2]]  $C_x =$ [[4]]

\n

$A_y =$ [[1]]  $B_y =$ [[3]]  $C_y =$ [[5]]

Sum the scalar components to get the scalar components of the resultant R.

\n

$R_x = \\Sigma F_x = A_x + B_x + C_x =$ [[0]]

\n

$R_y = \\Sigma F_y = A_y + B_y + C_y =$ [[1]]

Resolve $R_x$ and $R_y$ to find the magnitude and direction of R.

\n

$R = \\sqrt{{R_x}^2 +{R_y}^2}$ = [[0]]

\n

$\\theta = \\tan^{-1}\\left(\\left|\\dfrac{R_y}{R_x}\\right| \\right)$ = [[2]]  measured from the  [[1]]

\n

{angle_from_ref}

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": 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.

Determine the perpendicular distance between point B = ({B[0]}, {B[1]})  and the line passing through point A = ({A[0]}, {A[1]}) .  Grid units are {units}.

\n

\n

alpha: {alpha} beta: {beta} d: {d} dperp: {dperp}

", "variables": {"dperp": {"templateType": "anything", "definition": "abs(d * sin(radians(alpha-beta)))", "name": "dperp", "description": "

perpendicular distance from B to line

", "group": "Ungrouped variables"}, "alpha": {"templateType": "anything", "definition": "random(20..160#5 except 90)", "name": "alpha", "description": "", "group": "input"}, "debug": {"templateType": "anything", "definition": "false", "name": "debug", "description": "", "group": "Ungrouped variables"}, "d": {"templateType": "anything", "definition": "sqrt((A[0] - B[0])^2 + (A[1] - B[1])^2)", "name": "d", "description": "

distance from A to B

", "group": "Ungrouped variables"}, "A": {"templateType": "anything", "definition": "vector(random(-8..8),random(-8..8))", "name": "A", "description": "", "group": "input"}, "B": {"templateType": "anything", "definition": "vector(random(-8..8),random(-8..8))", "name": "B", "description": "", "group": "input"}, "beta": {"templateType": "anything", "definition": "degrees(arctan((A[1]-B[1])/(A[0]-B[0])))", "name": "beta", "description": "

angle d makes with horizontal

", "group": "Ungrouped variables"}, "units": {"templateType": "anything", "definition": "random('in','ft','mm','cm','m')", "name": "units", "description": "", "group": "Ungrouped variables"}}, "variablesTest": {"maxRuns": 100, "condition": "dperp > 5 and (alpha-beta) > 20 and beta<>0 and beta<> 90"}, "parts": [{"showFeedbackIcon": true, "showCorrectAnswer": true, "prompt": "

Find:

\n

The length of the segment AB:

\n

$d =$ [[0]]

\n

The angle that AB makes with the horizontal:

\n

$\\beta =$ [[1]]

\n

The perpendicular distance:

\n

$d_{\\perp} =$ [[2]]

", "unitTests": [], "variableReplacements": [], "extendBaseMarkingAlgorithm": true, "marks": 0, "variableReplacementStrategy": "originalfirst", "type": "gapfill", "sortAnswers": false, "steps": [{"showFeedbackIcon": true, "showCorrectAnswer": true, "variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "unitTests": [], "variableReplacements": [], "prompt": "

", "extendBaseMarkingAlgorithm": true, "marks": 0, "type": "information", "scripts": {}}], "scripts": {}, "gaps": [{"showFeedbackIcon": true, "showCorrectAnswer": true, "variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "unitTests": [], "variableReplacements": [], "settings": {"C3": "25", "C2": "50", "right": "0.1", "correctAnswer": "quantity(d, units)", "C1": "75", "close": "1.0"}, "extendBaseMarkingAlgorithm": true, "marks": "4", "type": "engineering-answer", "scripts": {}}, {"showFeedbackIcon": true, "showCorrectAnswer": true, "variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "unitTests": [], "variableReplacements": [], "settings": {"restrict_angle": true, "C3": "25", "C2": "50", "right": "0.2", "C1": "75", "close": "1.0", "correct_quantity": "qty(abs(beta),'deg')"}, "extendBaseMarkingAlgorithm": true, "marks": "4", "type": "angle-quantity-from-reference", "scripts": {}}, {"showFeedbackIcon": true, "showCorrectAnswer": true, "variableReplacementStrategy": "originalfirst", "customMarkingAlgorithm": "", "unitTests": [], "variableReplacements": [], "settings": {"C3": "25", "C2": "50", "right": "0.1", "correctAnswer": "quantity(dperp, units)", "C1": "75", "close": "1.0"}, "extendBaseMarkingAlgorithm": true, "marks": "4", "type": "engineering-answer", "scripts": {}}], "stepsPenalty": "3", "customMarkingAlgorithm": ""}], "advice": "
\n
1. Draw a diagram showing a triangle with sides that are the perpendicular distance $d_\\perp$ and direct distance AB.
2. \n
3. Use the distance formula to find the length of segment AB.
4. \n
5. Use trig to find the angle that segment AB makes with the x- or y- axis.
6. \n
7. Use geometry to determine an angle in the triangle.  Note that the angle that $d_\\perp$ makes with the vertical is the same as the angle that the line makes with the horizontal.  Perpendicular lines have negative reciprocal slopes.
8. \n
9. Use trig with the known hypotenuse AB and the angle to solve for perpendicular distance $d_\\perp$.
10. \n
", "rulesets": {}, "metadata": {"licence": "Creative Commons Attribution-NonCommercial 4.0 International", "description": "

Given a point and a line, determine the distance between them.

"}, "type": "question"}, {"name": "Equilibrium of a rigid body: truss", "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.

Find the reactions of a rigid body (a truss) at a pin and roller.  All loads are either horizontal or vertical.

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

The truss shown consists of three sections {b} {units[1]} wide and {h} {units[1]} tall, subjected to the loads shown.

\n

Determine the reactions at the pin and the roller.

\n

{geogebra_applet('xqsbgp9c',[['b',b],['h',h],['F_F',FF],['F_E',FE],['F_C',FC],['F_B',FB],['unitsF','\"'+units[0]+'\"'],['unitsD','\"'+units[1]+'\"']])}

\n

D: {siground(D,3)} {units[0]}

\n

A:  {siground(magA,3)} {units[0]} at {siground(dirA,3)}° from the x-axis

\n

Ax: {Ax}  Ay: {Ay}

\n

\n
1. Draw a free body diagram.
2. \n
3. Apply $\\Sigma M_A$ = 0 to find the reaction at $D$.  There's no x-component at $D$, because the support there is a roller.  This should have been indicated on your free body diagram.
4. \n
5. Once force $D$ and the loads are known, apply $\\Sigma F_x = 0$ and $\\Sigma F_y=0$ to find components $A_x$ and $A_y$.
6. \n
7. With $A_x$ and $A_y$ known, use the pythagorean theorem to calculate the magnitude of force $A$, and use trig to get the its direction.
8. \n
", "rulesets": {}, "variables": {"Ay": {"name": "Ay", "group": "Ungrouped variables", "definition": "Fe + Ff - D\n", "description": "

x-component of reaction at A.  up is positive

", "templateType": "anything"}, "FC": {"name": "FC", "group": "inputs", "definition": "random(0..5)", "description": "", "templateType": "anything"}, "dirA": {"name": "dirA", "group": "Ungrouped variables", "definition": "mod(degrees(atan2(Ay,Ax))+360,360)", "description": "", "templateType": "anything"}, "A": {"name": "A", "group": "Ungrouped variables", "definition": "vector(Ax,Ay)", "description": "", "templateType": "anything"}, "FB": {"name": "FB", "group": "inputs", "definition": "random(0..5)", "description": "", "templateType": "anything"}, "magA": {"name": "magA", "group": "Ungrouped variables", "definition": "abs(A)", "description": "

magnitude of A

", "templateType": "anything"}, "angle_from_ref": {"name": "angle_from_ref", "group": "Ungrouped variables", "definition": "let(ang,dirA,\n[if(ang>180,ang-360,ang),\nif(ang>270,ang-450,if(ang < -90,ang+270,ang-90)),\nif(ang>0,ang-180,ang+180),\nif(ang>90,ang-270,90+ang)])\n", "description": "", "templateType": "anything"}, "D": {"name": "D", "group": "Ungrouped variables", "definition": "(Fb * h + Fc * h + Ff * b + Fe * 2 * b)/(3*b)", "description": "

Reaction at D.  Up is positive

", "templateType": "anything"}, "FF": {"name": "FF", "group": "inputs", "definition": "random(0..5)", "description": "", "templateType": "anything"}, "Ax": {"name": "Ax", "group": "Ungrouped variables", "definition": "-(Fb+Fc)", "description": "

x- component of reaction at A. positive is to the right

", "templateType": "anything"}, "b": {"name": "b", "group": "inputs", "definition": "random(2..4#0.4)", "description": "", "templateType": "anything"}, "h": {"name": "h", "group": "inputs", "definition": "random(2..4#0.2)", "description": "", "templateType": "anything"}, "units": {"name": "units", "group": "inputs", "definition": "['kN','m']", "description": "", "templateType": "anything"}, "FE": {"name": "FE", "group": "inputs", "definition": "random(0..5)", "description": "", "templateType": "anything"}, "debug": {"name": "debug", "group": "inputs", "definition": "false", "description": "", "templateType": "anything"}, "angleFromX": {"name": "angleFromX", "group": "Ungrouped variables", "definition": "qty(atan2(Ay,Ax) * 180 / pi,'deg')", "description": "", "templateType": "anything"}}, "variablesTest": {"condition": "len(filter(x>0,x,[Fb,Fc,Fe,Ff]))>1", "maxRuns": 100}, "ungrouped_variables": ["D", "dirA", "angleFromX", "angle_from_ref", "Ay", "Ax", "A", "magA"], "variable_groups": [{"name": "inputs", "variables": ["debug", "h", "b", "FB", "FF", "FE", "FC", "units"]}], "functions": {"dirA": {"parameters": [], "type": "number", "language": "javascript", "definition": "numbasGGBApplet0.getValue('arg(f_A)')"}}, "preamble": {"js": "var flag=false;\n\nNumbas.extensions.weh.scope.ggbApplet.then(function(applet){\n applet.setVisible('R_A',flag);\n applet.setVisible('R_D',flag);\n});", "css": ""}, "parts": [{"type": "gapfill", "useCustomName": true, "customName": "Reactions at D", "marks": 0, "showCorrectAnswer": true, "showFeedbackIcon": true, "scripts": {}, "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "adaptiveMarkingPenalty": 0, "customMarkingAlgorithm": "", "extendBaseMarkingAlgorithm": true, "unitTests": [], "prompt": "

Use $\\Sigma M_A = 0$ to find the reaction at D.

\n

$D_x =$ [[0]]

\n

$D_y =$ [[1]]

Use $\\Sigma F_x = 0$ and $\\Sigma F_y=0$ to find the magnitude and direction of the components of the reaction at A.

\n

\n

$A_x =$ [[0]]  [[1]]

\n

$A_y =$ [[2]]  [[3]]

Determine the magnitude and direction of the resultant force $\\textbf{A}$ by resolving the components found in part b).

\n

Force $\\textbf{A}$ has a magnitude of [[0]], acting [[2]] from the positive x-axis.

\n

test message

"}, "showfrontpage": true, "showresultspage": "oncompletion", "preventleave": true, "startpassword": "", "allowregen": true, "reverse": true}, "metadata": {"licence": "None specified", "description": "description test message
"}, "name": "test exam", "feedback": {"allowrevealanswer": true, "intro": "

introduction test message

", "showactualmark": true, "feedbackmessages": [{"threshold": "51", "message": "

feedback test message

"}], "advicethreshold": 0, "showtotalmark": true, "showanswerstate": true}, "type": "exam", "contributors": [{"name": "Kathryn Jackson", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/3439/"}], "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