# Khan/khan-exercises

Switch branches/tags
Nothing to show
Fetching contributors…
Cannot retrieve contributors at this time
610 lines (574 sloc) 32.4 KB
 Graphing and solving systems of inequalities
randRangeNonZero(-5, 5) randRange(-5, 5)
randRangeExclude(-5, 5, [0, Y]) randRangeExclude(-5, 5, [0, Y])
(Y - YINT_1) / X (Y - YINT_2) / X toFraction(SLOPE_1, 0.001) toFraction(SLOPE_2, 0.001)
fractionVariable(SLOPE_FRAC_1[0], SLOPE_FRAC_1[1], "x") fractionVariable(SLOPE_FRAC_2[0], SLOPE_FRAC_2[1], "x") randRangeNonZero(-3, 3) randRangeNonZero(-3, 3) SLOPE_FRAC_1[0] * -MULT_1 SLOPE_FRAC_2[0] * -MULT_2 SLOPE_FRAC_1[1] * MULT_1 SLOPE_FRAC_2[1] * MULT_2 SLOPE_FRAC_1[1] * YINT_1 * MULT_1 SLOPE_FRAC_2[1] * YINT_2 * MULT_2 randFromArray([true, false]) randFromArray([true, false]) randFromArray(["<", ">", "≤", "≥"]) randFromArray(["<", ">", "≤", "≥"]) B_1 < 0 ? { "<": ">", ">": "<", "≤": "≥", "≥": "≤" }[COMP_1] : COMP_1 B_2 < 0 ? { "<": ">", ">": "<", "≤": "≥", "≥": "≤" }[COMP_2] : COMP_2 COMP_1 === "<" || COMP_1 === "≤" COMP_2 === "<" || COMP_2 === "≤" COMP_1 === "≥" || COMP_1 === "≤" COMP_2 === "≥" || COMP_2 === "≤" (function() { // Create a point on one of the lines var minN = -floor((9 + X) / abs(SLOPE_FRAC_1[1])); var maxN = floor((9 - X) / abs(SLOPE_FRAC_1[1])); var n = randRange(minN, maxN); if (rand(2) < 1) { return [X + n * SLOPE_FRAC_1[1], Y + n * SLOPE_FRAC_1[0]]; } else { return [X + n * SLOPE_FRAC_2[1], Y + n * SLOPE_FRAC_2[0]]; } })() randFromArray([ [randRangeExclude(-9, 9, [-1, -2]), randRangeExclude(-9, 9, [-1, -2])], [randRangeExclude(-9, 9, [-1, -2]), randRangeExclude(-9, 9, [-1, -2])], EDGE_POINT ]) (function() { var p = POINT[1]; var p1 = SLOPE_1 * POINT[0] + YINT_1; var p2 = SLOPE_2 * POINT[0] + YINT_2; return ((COMP_1 === "<" && p < p1) || (COMP_1 === "≤" && p <= p1) || (COMP_1 === ">" && p > p1) || (COMP_1 === "≥" && p >= p1)) && ((COMP_2 === "<" && p < p2) || (COMP_2 === "≤" && p <= p2) || (COMP_2 === ">" && p > p2) || (COMP_2 === "≥" && p >= p2)); })()

Graph the following system of inequalities:

\blue{expr([ "+", [ "*", A_1, "x" ], [ "*", B_1, "y" ] ]) STD_FORM_COMP_1 C_1}

\blue{y COMP_1 PRETTY_SLOPE_1 + YINT_1}

\green{expr([ "+", [ "*", A_2, "x" ], [ "*", B_2, "y" ] ]) STD_FORM_COMP_2 C_2}

\green{y COMP_2 PRETTY_SLOPE_2 + YINT_2}

Inequality 1:

Inequality 2:
graphInit({ range: 11, scale: 20, axisArrows: "<->", tickStep: 1, labelStep: 1, gridOpacity: 0.05, axisOpacity: 0.2, tickOpacity: 0.4, labelOpacity: 0.5 }); label( [ 0, -11 ], "y", "below" ); label( [ 11, 0 ], "x", "right" ); addMouseLayer(); graph.pointA = addMovablePoint({ coord: [ -5, 5 ], snapX: 0.5, snapY: 0.5, normalStyle: { stroke: KhanUtil.BLUE, fill: KhanUtil.BLUE } }); graph.pointB = addMovablePoint({ coord: [ 5, 5 ], snapX: 0.5, snapY: 0.5, normalStyle: { stroke: KhanUtil.BLUE, fill: KhanUtil.BLUE } }); graph.pointC = addMovablePoint({ coord: [ -5, -5 ], snapX: 0.5, snapY: 0.5, normalStyle: { stroke: KhanUtil.BLUE, fill: KhanUtil.BLUE } }); graph.pointD = addMovablePoint({ coord: [ 5, -5 ], snapX: 0.5, snapY: 0.5, normalStyle: { stroke: KhanUtil.BLUE, fill: KhanUtil.BLUE } }); graph.set = raphael.set(); graph.update = function() { graph.set.remove(); if ( abs( graph.pointB.coord[0] - graph.pointA.coord[0] ) > 0.001 ) { var slope = ( graph.pointB.coord[1] - graph.pointA.coord[1] ) / ( graph.pointB.coord[0] - graph.pointA.coord[0] ); var yint = slope * ( 0 - graph.pointA.coord[0] ) + graph.pointA.coord[1]; var shadeEdge = ( ( graph.pointA.coord[0] < graph.pointB.coord[0] ) ? graph.shadetop1 : !graph.shadetop1 ) ? 11 : -11; style({ stroke: BLUE, strokeWidth: 2, strokeDasharray: graph.dasharray1 }, function() { graph.set.push( line( [ -11, -11 * slope + yint ], [ 11, 11 * slope + yint ] ) ); }); style({ fill: BLUE, stroke: null, opacity: KhanUtil.FILL_OPACITY }, function() { graph.set.push( path([ [ 11, shadeEdge ], [ 11, 11 * slope + yint ], [ -11, -11 * slope + yint ], [ -11, shadeEdge ] ]) ); }); } else { // vertical line var x = graph.pointA.coord[0]; var shadeEdge = ( ( graph.pointB.coord[1] < graph.pointA.coord[1] ) ? graph.shadetop1 : !graph.shadetop1 ) ? 11 : -11; style({ stroke: BLUE, strokeWidth: 2, strokeDasharray: graph.dasharray1 }, function() { graph.set.push( line( [ x, -11 ], [ x, 11 ] ) ); }); style({ fill: BLUE, stroke: null, opacity: KhanUtil.FILL_OPACITY }, function() { graph.set.push( path([ [ x, -11 ], [ x, 11 ], [ shadeEdge, 11 ], [ shadeEdge, -11 ] ]) ); }); } if ( abs( graph.pointD.coord[0] - graph.pointC.coord[0] ) > 0.001 ) { var slope = ( graph.pointD.coord[1] - graph.pointC.coord[1] ) / ( graph.pointD.coord[0] - graph.pointC.coord[0] ); var yint = slope * ( 0 - graph.pointC.coord[0] ) + graph.pointC.coord[1]; var shadeEdge = ( ( graph.pointC.coord[0] < graph.pointD.coord[0] ) ? graph.shadetop2 : !graph.shadetop2 ) ? 11 : -11; style({ stroke: GREEN, strokeWidth: 2, strokeDasharray: graph.dasharray2 }, function() { graph.set.push( line( [ -11, -11 * slope + yint ], [ 11, 11 * slope + yint ] ) ); }); style({ fill: GREEN, stroke: null, opacity: KhanUtil.FILL_OPACITY }, function() { graph.set.push( path([ [ 11, shadeEdge ], [ 11, 11 * slope + yint ], [ -11, -11 * slope + yint ], [ -11, shadeEdge ] ]) ); }); } else { // vertical line var x = graph.pointC.coord[0]; var shadeEdge = ( ( graph.pointD.coord[1] < graph.pointC.coord[1] ) ? graph.shadetop2 : !graph.shadetop2 ) ? 11 : -11; style({ stroke: GREEN, strokeWidth: 2, strokeDasharray: graph.dasharray2 }, function() { graph.set.push( line( [ x, -11 ], [ x, 11 ] ) ); }); style({ fill: GREEN, stroke: null, opacity: KhanUtil.FILL_OPACITY }, function() { graph.set.push( path([ [ x, -11 ], [ x, 11 ], [ shadeEdge, 11 ], [ shadeEdge, -11 ] ]) ); }); } graph.set.toBack(); }; graph.showCorrect = function() { graph.pointA.setCoord([ 0, YINT_1 ]); graph.pointB.setCoord([ SLOPE_FRAC_1[1], YINT_1 + SLOPE_FRAC_1[0] ]); graph.pointC.setCoord([ 0, YINT_2 ]); graph.pointD.setCoord([ SLOPE_FRAC_2[1], YINT_2 + SLOPE_FRAC_2[0] ]); graph.shadetop1 = graph.pointA.coord[0] > graph.pointB.coord[0] ? LESS_THAN_1 : !LESS_THAN_1; graph.shadetop2 = graph.pointC.coord[0] > graph.pointD.coord[0] ? LESS_THAN_2 : !LESS_THAN_2; if ( INCLUSIVE_1 ) { graph.dasharray1 = ''; $( 'input[name=dashradio1][value=solid]' ).attr( 'checked', true ); } else { graph.dasharray1 = '- ';$( 'input[name=dashradio1][value=dashed]' ).attr( 'checked', true ); } if ( INCLUSIVE_2 ) { graph.dasharray2 = ''; $( 'input[name=dashradio2][value=solid]' ).attr( 'checked', true ); } else { graph.dasharray2 = '- ';$( 'input[name=dashradio2][value=dashed]' ).attr( 'checked', true ); } graph.update(); }; // A and B can't be in the same place graph.pointA.onMove = function( x, y ) { if ( x != graph.pointB.coord[0] || y != graph.pointB.coord[1] ) { graph.pointA.setCoord([ x, y ]); graph.update(); return true; } else { return false; } } graph.pointB.onMove = function( x, y ) { if ( x != graph.pointA.coord[0] || y != graph.pointA.coord[1] ) { graph.pointB.setCoord([ x, y, ]); graph.update(); return true; } else { return false; } } // C and D can't be in the same place graph.pointC.onMove = function( x, y ) { if ( x != graph.pointD.coord[0] || y != graph.pointD.coord[1] ) { graph.pointC.setCoord([ x, y ]); graph.update(); return true; } else { return false; } } graph.pointD.onMove = function( x, y ) { if ( x != graph.pointC.coord[0] || y != graph.pointC.coord[1] ) { graph.pointD.setCoord([ x, y, ]); graph.update(); return true; } else { return false; } } graph.dasharray1 = ""; graph.dasharray2 = ""; graph.shadetop1 = true; graph.shadetop2 = false; graph.update(); graph.pointA.toFront(); graph.pointB.toFront(); graph.pointC.toFront(); graph.pointD.toFront();

Is (POINT[0], POINT[1]) a solution to this system of the inequalities?

[ graph.pointA.coord, graph.pointB.coord, graph.pointA.coord[0] > graph.pointB.coord[0] ? graph.shadetop1 : !graph.shadetop1, graph.dasharray1 === "- " ? false : true, graph.pointC.coord, graph.pointD.coord, graph.pointC.coord[0] > graph.pointD.coord[0] ? graph.shadetop2 : !graph.shadetop2, graph.dasharray2 === "- " ? false : true, $("input[name='isSolution']:checked").attr("id")] if (_.isEqual(guess, [[-5,5],[5,5],false,true,[-5,-5],[5,-5],true,true])) { return ""; } var slope1 = ( guess[1][1] - guess[0][1] ) / ( guess[1][0] - guess[0][0] ); var yint1 = slope1 * ( 0 - guess[0][0] ) + guess[0][1]; var slope2 = ( guess[5][1] - guess[4][1] ) / ( guess[5][0] - guess[4][0] ); var yint2 = slope2 * ( 0 - guess[4][0] ) + guess[4][1]; return POINT_SOLUTION === (guess[8] === 'yes') && (abs(SLOPE_1 - slope1) < 0.001 && abs(YINT_1 - yint1) < 0.001 && guess[2] === LESS_THAN_1 && guess[3] === INCLUSIVE_1 && abs(SLOPE_2 - slope2) < 0.001 && abs(YINT_2 - yint2) < 0.001 && guess[6] === LESS_THAN_2 && guess[7] === INCLUSIVE_2) || (abs(SLOPE_2 - slope1) < 0.001 && abs(YINT_2 - yint1) < 0.001 && guess[2] === LESS_THAN_2 && guess[3] === INCLUSIVE_2 && abs(SLOPE_1 - slope2) < 0.001 && abs(YINT_1 - yint2) < 0.001 && guess[6] === LESS_THAN_1 && guess[7] === INCLUSIVE_1) graph.pointA.setCoord( guess[0] ); graph.pointB.setCoord( guess[1] ); graph.pointC.setCoord( guess[4] ); graph.pointD.setCoord( guess[5] ); graph.shadetop1 = graph.pointA.coord[0] > graph.pointB.coord[0] ? guess[2] : !guess[2]; graph.shadetop2 = graph.pointC.coord[0] > graph.pointD.coord[0] ? guess[6] : !guess[6]; if ( guess[3] ) { graph.dasharray1 = "";$( "input[name=dashradio1][value=solid]" ).attr( "checked", true ); } else { graph.dasharray1 = "- "; $( "input[name=dashradio1][value=dashed]" ).attr( "checked", true ); } if ( guess[7] ) { graph.dasharray2 = "";$( "input[name=dashradio2][value=solid]" ).attr( "checked", true ); } else { graph.dasharray2 = "- "; $( "input[name=dashradio2][value=dashed]" ).attr( "checked", true ); } graph.update(); Let's first graph the boundary lines. If an inequality is in slope-intercept form, we can use it to determine the slope and the y-intercept of the line. If an inequality isn't in slope-intercept form, let's convert it to this form. The inequality signs in each inequality then tell us which side of the lines are to be shaded and whether the lines are solid or dashed. Finally, we can see whether or not our given point lies in the shaded area representing both inequalities to check if it's a solution of the system. The first inequality, \blue{expr(["+", ["*", A_1, "x"], ["*", B_1, "y"]])STD_FORM_COMP_1C_1}, isn't in slope-intercept form. Let's convert it: \qquad\begin{eqnarray} expr(["+", ["*", A_1, "x"], ["*", B_1, "y"]]) &STD_FORM_COMP_1& C_1 \\ coefficient(B_1)y &STD_FORM_COMP_1& expr([ "+", [ "*", -A_1, "x" ], C_1 ]) \\ y &COMP_1& PRETTY_SLOPE_1 + YINT_1 \end{eqnarray} Now we see the slope of the line is \pink{fractionReduce(SLOPE_FRAC_1[0], SLOPE_FRAC_1[1])} and its y-intercept is \purple{(0, YINT_1)}. The first inequality, \blue{y COMP_1 PRETTY_SLOPE_1 + YINT_1}, is in slope-intercept form: the slope of the line is fractionReduce(SLOPE_FRAC_1[0], SLOPE_FRAC_1[1]) and its y-intercept is (0, YINT_1). According to the slope, we know the line also passes through (0 \pink{+ SLOPE_FRAC_1[1]}, YINT_1 \purple{+ SLOPE_FRAC_1[0]}) = (SLOPE_FRAC_1[1], YINT_1 + SLOPE_FRAC_1[0]) . graph.pointA.setCoord([0, YINT_1]); graph.pointB.setCoord([SLOPE_FRAC_1[1], YINT_1 + SLOPE_FRAC_1[0]]); graph.update(); The second inequality, \green{expr(["+", ["*", A_2, "x"], ["*", B_2, "y"]])STD_FORM_COMP_2C_2}, isn't in slope-intercept form. Let's convert it: \qquad\begin{eqnarray} expr(["+", ["*", A_2, "x"], ["*", B_2, "y"]]) &STD_FORM_COMP_2& C_2 \\ coefficient(B_2)y &STD_FORM_COMP_2& expr([ "+", [ "*", -A_2, "x" ], C_2 ]) \\ y &COMP_2& PRETTY_SLOPE_2 + YINT_2 \end{eqnarray} Now we see the slope of the line is \pink{fractionReduce(SLOPE_FRAC_2[0], SLOPE_FRAC_2[1])} and its y-intercept is \purple{(0, YINT_2)}. The second inequality, \green{y COMP_2 PRETTY_SLOPE_2 + YINT_2}, is in slope-intercept form: the slope of the line is fractionReduce(SLOPE_FRAC_2[0], SLOPE_FRAC_2[1]) and its y-intercept is (0, YINT_2). According to the slope, we know the line also passes through (0 \pink{+ SLOPE_FRAC_2[1]}, YINT_2 \purple{+ SLOPE_FRAC_2[0]}) = (SLOPE_FRAC_2[1], YINT_2 + SLOPE_FRAC_2[0]) . graph.pointC.setCoord([0, YINT_2]); graph.pointD.setCoord([SLOPE_FRAC_2[1], YINT_2 + SLOPE_FRAC_2[0]]); graph.update(); According to the sign of the first inequality, \blue{y COMP_1 PRETTY_SLOPE_1 + YINT_1}, its solution set lies below the boundary line and the line should be solid. According to the sign of the first inequality, \blue{y COMP_1 PRETTY_SLOPE_1 + YINT_1}, its solution set lies below the boundary line and the line should be dashed. According to the sign of the first inequality, \blue{y COMP_1 PRETTY_SLOPE_1 + YINT_1}, its solution set lies above the boundary line and the line should be solid. According to the sign of the first inequality, \blue{y COMP_1 PRETTY_SLOPE_1 + YINT_1}, its solution set lies above the boundary line and the line should be dashed. According to the sign of the second inequality, \green{y COMP_2 PRETTY_SLOPE_2 + YINT_2}, its solution set lies below the boundary line and the line should be solid. According to the sign of the second inequality, \green{y COMP_2 PRETTY_SLOPE_2 + YINT_2}, its solution set lies below the boundary line and the line should be dashed. According to the sign of the second inequality, \green{y COMP_2 PRETTY_SLOPE_2 + YINT_2}, its solution set lies above the boundary line and the line should be solid. According to the sign of the second inequality, \green{y COMP_2 PRETTY_SLOPE_2 + YINT_2}, its solution set lies above the boundary line and the line should be dashed. graph.shadetop1 = graph.pointA.coord[0] > graph.pointB.coord[0] ? LESS_THAN_1 : !LESS_THAN_1; graph.shadetop2 = graph.pointC.coord[0] > graph.pointD.coord[0] ? LESS_THAN_2 : !LESS_THAN_2; if (INCLUSIVE_1) { graph.dasharray1 = '';$('input[name=dashradio1][value=solid]').attr('checked', true); } else { graph.dasharray1 = '- '; $('input[name=dashradio1][value=dashed]').attr('checked', true); } if (INCLUSIVE_2) { graph.dasharray2 = '';$('input[name=dashradio2][value=solid]').attr('checked', true); } else { graph.dasharray2 = '- '; \$('input[name=dashradio2][value=dashed]').attr('checked', true); } graph.update();
style({ stroke: RED, fill: RED }, function() { circle(POINT, 0.2); label(POINT, "\\red{(" + POINT[0] + ", " + POINT[1] + ")}", "right"); });

We can see that the point \red{(POINT[0], POINT[1])} lies in the shaded area representing both inequalities, which means that it is a solution of the system represented by the graph.

We can see that the point \red{(POINT[0], POINT[1])} does not lie in the shaded area representing both inequalities, which means that it is not a solution of the system represented by the graph.