// Numbas version: exam_results_page_options {"name": "Graphs: Horizontal scale transformation", "extensions": ["jsxgraph"], "custom_part_types": [], "resources": [], "navigation": {"allowregen": true, "showfrontpage": false, "preventleave": false, "typeendtoleave": false}, "question_groups": [{"pickingStrategy": "all-ordered", "questions": [{"functions": {}, "ungrouped_variables": ["selector", "vsh", "hsh", "vsc", "hsc", "yo", "yn", "xo", "xn", "yo0", "yo1", "yo2", "yo3", "yo4", "maxx", "maxy", "recip"], "name": "Graphs: Horizontal scale transformation", "tags": ["functions", "graphing", "graphs", "JSXgraph", "Jsxgraph", "jsxgraph", "transformations"], "preamble": {"css": "table#values th {\n background: none;\n text-align: center;\n}", "js": "function dragpoint_board() {\n var scope = question.scope;\n \n // var a = scope.variables.a.value;\n// var c = scope.variables.c.value;\n\n var yo0 = scope.variables.yo0.value;\n var yo1 = scope.variables.yo1.value;\n var yo2 = scope.variables.yo2.value;\n var yo3 = scope.variables.yo3.value; \n var yo4 = scope.variables.yo4.value;\n \n var maxx = scope.variables.maxx.value;\n var maxy = scope.variables.maxy.value;\n \n var div = Numbas.extensions.jsxgraph.makeBoard('500px','500px',{boundingBox:[-maxx,maxy,maxx,-maxy],grid:true});\n $(question.display.html).find('#dragpoint').append(div);\n \n var board = div.board;\n \n \n //create stationary points\n \n var op0 = board.create('point',[-2,yo0],{name:'',fixed:true,size:2,color:'black'});\n var op1 = board.create('point',[-1,yo1],{name:'',fixed:true,size:2,color:'black'});\n var op2 = board.create('point',[0,yo2],{name:'',fixed:true,size:2,color:'black'});\n var op3 = board.create('point',[1,yo3],{name:'',fixed:true,size:2,color:'black'});\n var op4 = board.create('point',[2,yo4],{name:'',fixed:true,size:2,color:'black'});\n \n \n //create draggable points\n //why are there are a cloine under each one?\n var np0 = board.create('point',[-2,yo0],{name:'A',size:2,snapSizeX: 0.25,snapSizeY: 0.25,snapToGrid: true});\n var np1 = board.create('point',[-1,yo1],{name:'B',size:2,snapSizeX: 0.25,snapSizeY: 0.25,snapToGrid: true});\n var np2 = board.create('point',[0,yo2],{name:'C',size:2,snapSizeX: 0.25,snapSizeY: 0.25,snapToGrid: true});\n var np3 = board.create('point',[1,yo3],{name:'D',size:2,snapSizeX: 0.25,snapSizeY: 0.25,snapToGrid: true});\n var np4 = board.create('point',[2,yo4],{name:'E',size:2,snapSizeX: 0.25,snapSizeY: 0.25,snapToGrid: true});\n \n \n \n \n //shorthand to evaluate a mathematical expression to a number\n function evaluate(expression) {\n try {\n var val = Numbas.jme.evaluate(expression,question.scope);\n return Numbas.jme.unwrapValue(val);\n }\n catch(e) {\n // if there's an error, return no number\n return NaN;\n }\n }\n \n // set up points array\n var num_points = 5;\n var points = [np0, np1, np2, np3, np4];\n \n \n // this function sets up the i^th point\n function make_point(i) {\n \n // calculate initial coordinates\n // var x = i-(num_points-1)/2;\n \n // create an invisible vertical line for the point to slide along\n // var line = board.create('line',[[x,0],[x,1]],{visible: false});\n \n // create the point\n // var point = points[i] = board.create(\n // 'point',\n // [i-(num_points-1)/2,0],\n // {\n // name:'',\n // size:2,\n // snapSizeY: 0.25, // the point will snap to y-coordinates which are multiples of 0.1\n // snapSizeX: 0.25,\n // snapToGrid: true\n // }\n // );\n \n var point = points[i];\n \n var x=point[0];\n var y=point[1];\n \n // the contents of the input box for this point\n var xstudentAnswer = question.parts[0].gaps[2*i].display.studentAnswer;\n var ystudentAnswer = question.parts[0].gaps[2*i+1].display.studentAnswer;\n \n // watch the student's input and reposition the point when it changes. \n ko.computed(function() {\n x = evaluate(xstudentAnswer());\n y = evaluate(ystudentAnswer());\n if(!(isNaN(x)) && !(isNaN(y)) && board.mode!=board.BOARD_MODE_DRAG) {\n point.moveTo([x,y],100);\n }\n });\n \n // when the student drags the point, update the gapfill input\n point.on('drag',function(){\n var x = Numbas.math.niceNumber(point.X());\n var y = Numbas.math.niceNumber(point.Y());\n xstudentAnswer(x);\n ystudentAnswer(y);\n });\n \n }\n \n // create each point\n for(var i=0;i\n

The point $A$ was $(-2,\\var{yo0})$ but it is now $\\big($[[0]],[[1]]$\\big)$.
The point $B$ was $(-1,\\var{yo1})$ but it is now $\\big($[[2]],[[3]]$\\big)$.
The point $C$ was $(0,\\var{yo2})$ but it is now $\\big($[[4]],[[5]]$\\big)$.
The point $D$ was $(1,\\var{yo3})$ but it is now $\\big($[[6]],[[7]]$\\big)$.
The point $E$ was $(2,\\var{yo4})$ but it is now $\\big($[[8]],[[9]]$\\big)$.

\n", "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "gaps": [{"allowFractions": true, "variableReplacements": [], "maxValue": "xn[0]", "minValue": "xn[0]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "yn[0]", "minValue": "yn[0]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "xn[1]", "minValue": "xn[1]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "yn[1]", "minValue": "yn[1]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "xn[2]", "minValue": "xn[2]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "yn[2]", "minValue": "yn[2]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "xn[3]", "minValue": "xn[3]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "yn[3]", "minValue": "yn[3]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "xn[4]", "minValue": "xn[4]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}, {"allowFractions": true, "variableReplacements": [], "maxValue": "yn[4]", "minValue": "yn[4]", "variableReplacementStrategy": "originalfirst", "correctAnswerFraction": false, "showCorrectAnswer": true, "scripts": {}, "marks": 1, "type": "numberentry", "showPrecisionHint": false}], "steps": [{"prompt": "

$y=\\simplify[fractionNumbers,all]{{vsc}f({hsc}x+{hsh})+{vsh}}$ means that to get the same $y$ value as the original graph the new $x$ value will have to be $2$ times what it was before $-2$ times what it was before the negative of what it was before half of what it was before the negative half of what it was before (so that when you multiply the new $x$ value by $\\var{hsc}$ you get the old one).

\n

\n

Since the $x$ value is displayed in the horizontal direction, this means the old graph is stretched or scaled horizontally by a factor of $\\simplify[fractionNumbers,all]{{recip}}$ to give the new graph, or in otherwords, compressed horizontally by a factor of $\\simplify[fractionNumbers,all]{{hsc}}$.

", "variableReplacements": [], "variableReplacementStrategy": "originalfirst", "showCorrectAnswer": true, "scripts": {}, "marks": 0, "type": "information"}], "scripts": {}, "marks": 0, "showCorrectAnswer": true, "type": "gapfill"}], "statement": "

The graph of a function $y=f(x)$ is shown below. Move the red points so the red curve represents $y=\\simplify[fractionNumbers,all]{{vsc}f({hsc}x+{hsh})+{vsh}}$.

", "variable_groups": [], "variablesTest": {"maxRuns": 100, "condition": ""}, "variables": {"recip": {"definition": "1/hsc", "templateType": "anything", "group": "Ungrouped variables", "name": "recip", "description": ""}, "hsc": {"definition": "if(selector='hsc',random(-2,-1,-0.5,0.5,2),1)", "templateType": "anything", "group": "Ungrouped variables", "name": "hsc", "description": ""}, "maxx": {"definition": "max(map(abs(a),a,xn)+5)+1", "templateType": "anything", "group": "Ungrouped variables", "name": "maxx", "description": ""}, "maxy": {"definition": "max(map(abs(a),a,yn)+5)+1", "templateType": "anything", "group": "Ungrouped variables", "name": "maxy", "description": ""}, "xn": {"definition": "map((x-hsh)/hsc,x,xo)", "templateType": "anything", "group": "Ungrouped variables", "name": "xn", "description": "

new transformed x values

"}, "xo": {"definition": "list(-2..2)", "templateType": "anything", "group": "Ungrouped variables", "name": "xo", "description": "

original x values

"}, "yo": {"definition": "repeat(random(-5..5),5)", "templateType": "anything", "group": "Ungrouped variables", "name": "yo", "description": "

the (random) original y values which relate to the x values

"}, "yn": {"definition": "map(vsc*y+vsh,y,yo)", "templateType": "anything", "group": "Ungrouped variables", "name": "yn", "description": "

new y values after the transformation

"}, "hsh": {"definition": "if(selector='hsh',random(-3..3 except 0),0)", "templateType": "anything", "group": "Ungrouped variables", "name": "hsh", "description": "

horizontal shift

"}, "selector": {"definition": "'hsc'", "templateType": "anything", "group": "Ungrouped variables", "name": "selector", "description": ""}, "vsc": {"definition": "if(selector='vsc',random(-2,-1,-0.5,0.5,2),1)", "templateType": "anything", "group": "Ungrouped variables", "name": "vsc", "description": ""}, "vsh": {"definition": "if(selector='vsh',random(-3..3#0.5 except 0),0)\n", "templateType": "anything", "group": "Ungrouped variables", "name": "vsh", "description": "

vertical shift

"}, "yo4": {"definition": "yo[4]", "templateType": "anything", "group": "Ungrouped variables", "name": "yo4", "description": ""}, "yo3": {"definition": "yo[3]", "templateType": "anything", "group": "Ungrouped variables", "name": "yo3", "description": ""}, "yo2": {"definition": "yo[2]", "templateType": "anything", "group": "Ungrouped variables", "name": "yo2", "description": ""}, "yo1": {"definition": "yo[1]", "templateType": "anything", "group": "Ungrouped variables", "name": "yo1", "description": ""}, "yo0": {"definition": "yo[0]", "templateType": "anything", "group": "Ungrouped variables", "name": "yo0", "description": ""}}, "metadata": {"notes": "", "description": "

of a random cubic spline

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