// Numbas version: exam_results_page_options {"name": "Heat and temperature [temp] - graph", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"functions": {"onestep": {"definition": "// This function creates the board and sets it up, then returns an\n// HTML div tag containing the board.\n \n// The line is described by the equation \n// y = a*x + b\n\n// This function takes as its parameters the coefficients a and b,\n// and the coordinates (x2,y2) of a point on the line.\n\n// First, make the JSXGraph board.\n// The function provided by the JSXGraph extension wraps the board up in \n// a div tag so that it's easier to embed in the page.\nvar div = Numbas.extensions.jsxgraph.makeBoard('400px','400px',\n{boundingBox: [-2,16,20,-2],\n axis: false,\n showNavigation: false,\n grid: true\n});\n \n// div.board is the object created by JSXGraph, which you use to \n// manipulate elements\nvar board = div.board; \n\n// create the x-axis.\nvar xaxis = board.create('line',[[0,0],[1,0]], {strokeColor: 'black', fixed: true});\n//var xticks = board.create('ticks',[xaxis,2],{\n// drawLabels: true,\n// label: {offset: [-4, -10]},\n// minorTicks: 0\n//});\n\n// create the y-axis\nvar yaxis = board.create('line',[[0,0],[0,1]], { strokeColor: 'black', fixed: true });\nvar yticks = board.create('ticks',[yaxis,2],{\ndrawLabels: true,\nlabel: {offset: [-20, 0]},\nminorTicks: 0\n});\n\n// create the static line based on the coefficients a and b\nvar line1 = board.create('line',[[0,b],[1,a+b]],{fixed:true, strokeWidth: 1});\n\n// mark the two given points - one on the y-axis, and one at (x2,y2)\nvar p1 = board.create('point',[0,b],{fixed:true, size:3, name: 'P_1', face: 'cross'});\nvar p2 = board.create('point',[x2,y2],{fixed:true, size:3, name: 'P_2', face: 'cross'});\n\n// Now we can do the clever stuff with the student's answer!\n// We'll add a curve to the board which is a plot of a function we provide.\n// That function will parse the student's input and evaluate it.\n\n// The variable studentExpression will store the parsed version of\n// the student's expression.\nvar studentExpression;\n\n// This function evaluates the student's expression at a given point t.\nfunction makestudentline(x){\n // Create a JME scope with the variable x set to the given value.\n var nscope = new Numbas.jme.Scope([\nNumbas.jme.builtinScope,\n{variables: {x: new Numbas.jme.types.TNum(x)}}\n ]);\n \n // If the student's input has been parsed, evaluate it\n if(studentExpression) {\ntry {\n var val = Numbas.jme.evaluate(studentExpression,nscope).value;\n return val;\n}\ncatch(e) {\n // If there was an error evaluating the student's expression\n // (wrong variables, or some other weirdness)\n // throw an error\n throw(e)\n}\n }\n // Otherwise, if the student's expression hasn't been parsed\n // (they haven't written anything, or they wrote bad syntax)\n // return 0\n else {\nreturn 0;\n }\n}\nvar studentline = board.create('functiongraph', \n [makestudentline,-13,13],\n {strokeColor:'black', strokeWidth: 3, visible: false}\n );\n\n// This is where some voodoo happens.\n// Because the HTML for the question is inserted into the page after the function eqnline\n// is called, we need to wait until the 'question-html-attached' event is fired\n// to do the interaction with the student input box.\n// So:\n\n// When the question is inserted into the page\n$('body').on('question-html-attached',function(e,question,qd) {\n \n // Create a Knockout.js observable\n ko.computed(function(){\n// Get the student's input string from part 0, gap 0.\nvar studentString = question.parts.gaps.display.studentAnswer();\n\n// Try to parse it as a JME expression\ntry {\n studentExpression = Numbas.jme.compile(studentString,scope);\n \n // If the student didn't write anything, compile returns null\n if(studentExpression === null)\nthrow(new Error('no expression'));\n \n // If everything worked, show the line and update it\n // (this calls makestudentline on a few points)\n studentline.showElement();\n studentline.updateCurve();\n}\ncatch(e) {\n // If something went wrong, hide the curve\n studentExpression = null;\n studentline.hideElement();\n}\n\nboard.update();\n });\n}); \n\nreturn div;", "type": "html", "language": "javascript", "parameters": []}}, "ungrouped_variables": ["", "end_temp", "mass", "start_temp", "switcharoo", "asfdasd"], "name": "Heat and temperature [temp] - graph", "tags": [], "preamble": {"css": "", "js": ""}, "advice": "\n First Method. \n You are given that the line goes through$(0,\\var{b})$and$(-1,\\var{b-a})$and the equation of the line is of the form$y=ax+b$\n Hence: \n 1) At$x=0$we have$y=\\var{b}$, and this gives$\\var{b}=a \\times 0 +b =b$on putting$x=0$into$y=ax+b$. \n So$b=\\var{b}$. \n 2) At$x=-1$we have$y=\\var{b-a}$, and this gives$\\var{b-a}=a \\times (-1) +b =\\simplify[all,!collectNumbers]{-a+{b}}$on putting$x=-1$into$y=ax+b$. \n On rearranging we obtain$a=\\simplify[all,!collectNumbers]{{b}-{b-a}}=\\var{a}$. \n So$a=\\var{a}$. \n So the equation of the line is$\\simplify{y={a}*x+{b}}$. \n Second Method. \n The equation$y=ax+b$tells us that the graph crosses the$y$-axis (when$x=0$) at$y=b$. \n So looking at the graph we immediately see that$b=\\var{b}$. \n$a$is the gradient of the line and is given by the change from$(-1,\\var{b-a})$to$(0,\\var{b})$: \n \$a=\\frac{\\text{Change in y}}{\\text{Change in x}}=\\frac{\\simplify[all,!collectNumbers]{({b-a}-{b})}}{-1-0}=\\var{a}\$ \n\n", "rulesets": {}, "parts": [{"prompt": " Write the equation of the line in the diagram. The line described by your equation will also be drawn on the diagram. ", "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}, "marks": 0, "type": "information"}], "extensions": ["jsxgraph"], "statement": " {onestep(a,b,x2,y2)} \n The above graph shows a line which has an equation of the form$y=ax+b$, where$a$and$b$are integers. \n You are given two points on the line,$(0,\\var{b})$and$(\\var{x2},\\var{y2})\$, as indicated on the diagram.

", "variable_groups": [{"variables": ["switcharoo_comment", "switcharoo_type", "phase_temp", "phase_latentheat"], "name": "switcharoo"}, {"variables": ["g_or_kg", "g_or_kg_string", "mass_string"], "name": "kg or g"}, {"variables": ["phase2_temp", "phase1_temp", "phase2_latentheat", "phase1_latentheat"], "name": "Phases"}], "variablesTest": {"maxRuns": 100, "condition": ""}, "variables": {"": {"definition": "", "templateType": "anything", "group": "Ungrouped variables", "name": "", "description": ""}, "phase1_temp": {"definition": "273", "templateType": "anything", "group": "Phases", "name": "phase1_temp", "description": ""}, "switcharoo_comment": {"definition": "[ \"solid_to_liquid\", \"solid_to_gas\", \"liquid_to_gas\" ]", "templateType": "list of strings", "group": "switcharoo", "name": "switcharoo_comment", "description": ""}, "phase1_latentheat": {"definition": "334000", "templateType": "anything", "group": "Phases", "name": "phase1_latentheat", "description": ""}, "switcharoo": {"definition": "random(3,4,5)-3", "templateType": "anything", "group": "Ungrouped variables", "name": "switcharoo", "description": ""}, "mass_string": {"definition": "mass*(10^(g_or_kg*3))", "templateType": "anything", "group": "kg or g", "name": "mass_string", "description": ""}, "end_temp": {"definition": "if(switcharoo>0,random(phase2_temp+10..phase2_temp+100),random(phase1_temp+10..phase2_temp-10))", "templateType": "anything", "group": "Ungrouped variables", "name": "end_temp", "description": ""}, "switcharoo_type": {"definition": "switcharoo_comment[switcharoo]", "templateType": "anything", "group": "switcharoo", "name": "switcharoo_type", "description": ""}, "start_temp": {"definition": "if(switcharoo<2,random(phase1_temp-100..phase1_temp-10),random(phase1_temp+10..phase2_temp-10))", "templateType": "anything", "group": "Ungrouped variables", "name": "start_temp", "description": ""}, "phase_temp": {"definition": "if(switcharoo<2,phase1_temp,phase2_temp)", "templateType": "anything", "group": "switcharoo", "name": "phase_temp", "description": ""}, "phase2_latentheat": {"definition": "2264760", "templateType": "anything", "group": "Phases", "name": "phase2_latentheat", "description": ""}, "mass": {"definition": "random(0.01..2.00#0.01)", "templateType": "anything", "group": "Ungrouped variables", "name": "mass", "description": ""}, "phase_latentheat": {"definition": "if(switcharoo<2,phase1_latentheat,phase2_latentheat)", "templateType": "anything", "group": "switcharoo", "name": "phase_latentheat", "description": ""}, "phase2_temp": {"definition": "373", "templateType": "anything", "group": "Phases", "name": "phase2_temp", "description": ""}, "g_or_kg_string": {"definition": "if(mass<1,' g',' kg')", "templateType": "anything", "group": "kg or g", "name": "g_or_kg_string", "description": ""}, "g_or_kg": {"definition": "if(mass<1,1,0)", "templateType": "anything", "group": "kg or g", "name": "g_or_kg", "description": ""}, "asfdasd": {"definition": "random(0..2)", "templateType": "anything", "group": "Ungrouped variables", "name": "asfdasd", "description": ""}}, "metadata": {"description": "

There are copious comments in the definition of the function eqnline about the voodoo needed to have a JSXGraph diagram interact with the input box for a part.

", "licence": "Creative Commons Attribution 4.0 International"}, "type": "question", "showQuestionGroupNames": false, "question_groups": [{"name": "", "pickingStrategy": "all-ordered", "pickQuestions": 0, "questions": []}], "contributors": [{"name": "Tom Stallard", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/841/"}]}]}], "contributors": [{"name": "Tom Stallard", "profile_url": "https://numbas.mathcentre.ac.uk/accounts/profile/841/"}]}