# Khan/khan-exercises

### Subversion checkout URL

You can clone with
or
.
Fetching contributors…
Cannot retrieve contributors at this time
292 lines (266 sloc) 12.2 KB
 Graphing parabolas 1
randRangeNonZero( -5, 5 ) randRangeNonZero( -5, 5 ) randRangeNonZero( -5, 5 ) A === 1 ? "" : A === -1 ? "-" : A

Graph the following equation:

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", "above" ); 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: [ 0, 5 ], snapX: 0.5, snapY: 0.5, normalStyle: { stroke: KhanUtil.BLUE, fill: KhanUtil.BLUE } }); // returns true if the three points don't form a parabola (that opens vertically) graph.invalid = function( p1, p2, p3 ) { return ( ( p1[ 0 ] - p2[ 0 ] ) * ( p1[ 0 ] - p3[ 0 ] ) * ( p2[ 0 ] - p3[ 0 ] ) === 0 ); }; // Fits a parabola to 3 points graph.fitParabola = function( p1, p2, p3 ) { var denom = (p1[0] - p2[0]) * (p1[0] - p3[0]) * (p2[0] - p3[0]); if ( denom !== 0 ) { var A = (p3[0] * (p2[1] - p1[1]) + p2[0] * (p1[1] - p3[1]) + p1[0] * (p3[1] - p2[1])) / denom; var B = ((p3[0] * p3[0]) * (p1[1] - p2[1]) + (p2[0] * p2[0]) * (p3[1] - p1[1]) + (p1[0] * p1[0]) * (p2[1] - p3[1])) / denom; var C = (p2[0] * p3[0] * (p2[0] - p3[0]) * p1[1] + p3[0] * p1[0] * (p3[0] - p1[0]) * p2[1] + p1[0] * p2[0] * (p1[0] - p2[0]) * p3[1]) / denom; return [ A, B, C ]; } else { return [ 0, 0, 0 ]; } }; // A and B can't be in the same place graph.pointA.onMove = function( x, y ) { if ( graph.invalid( [ x, y ], graph.pointB.coord, graph.pointC.coord ) ) { return false; } graph.pointA.coord = [ x, y ]; graph.drawParabola(); }; graph.pointB.onMove = function( x, y ) { if ( graph.invalid( graph.pointA.coord, [ x, y ], graph.pointC.coord ) ) { return false; } graph.pointB.coord = [ x, y ]; graph.drawParabola(); }; graph.pointC.onMove = function( x, y ) { if ( graph.invalid( graph.pointA.coord, graph.pointB.coord, [ x, y ] ) ) { return false; } graph.pointC.coord = [ x, y ]; graph.drawParabola(); }; graph.parabola = bogusShape; graph.drawParabola = function() { graph.parabola.remove(); var coeffs = graph.fitParabola( graph.pointA.coord, graph.pointB.coord, graph.pointC.coord ); style({ stroke: KhanUtil.BLUE }, function() { graph.parabola = plot( function( x ) { return coeffs[0] * x * x + coeffs[1] * x + coeffs[2]; }, [ -11, 11 ] ); graph.parabola.toBack(); }); }; graph.drawParabola(); graph.showSolution = function() { $( "html, body" ).animate({ scrollTop:$( ".question" ).offset().top }, { duration: 500, easing: "swing", complete: function() { var coords = { x1: graph.pointA.coord[0], y1: graph.pointA.coord[1], x2: graph.pointB.coord[0], y2: graph.pointB.coord[1], x3: graph.pointC.coord[0], y3: graph.pointC.coord[1] }; \$( coords ).delay( 100 ).animate({ x1: X1, y1: Y1, x2: X2, y2: Y2, x3: H, y3: K }, { duration: 500, easing: "linear", step: function( now, fx ) { coords[ fx.prop ] = now; graph.pointA.setCoord([ coords.x1, coords.y1 ]); graph.pointB.setCoord([ coords.x2, coords.y2 ]); graph.pointC.setCoord([ coords.x3, coords.y3 ]); graph.drawParabola(); } }); } }); };
Drag the three points to graph the equation.
[ graph.pointA.coord, graph.pointB.coord, graph.pointC.coord ]
var coeffs = graph.fitParabola( graph.pointA.coord, graph.pointB.coord, graph.pointC.coord ); if ( coeffs[0] === 0 && coeffs[1] === 0 && coeffs[2] === 5 ) { return ""; } return abs( A - coeffs[0] ) < 0.001 && abs( (-2 * A * H) - coeffs[1] ) < 0.001 && abs( (A * H * H + K) - coeffs[2] ) < 0.001;
graph.pointA.setCoord( guess[0] ); graph.pointB.setCoord( guess[1] ); graph.pointC.setCoord( guess[2] ); graph.drawParabola();
H + 1 A * ( X1 - H ) * ( X1 - H ) + K H - 1 A * ( X2 - H ) * ( X2 - H ) + K [ parse( "y &= a( x - #{h})^2 + #{k}", [ GREEN, GREEN ] ), parse( "y &= " + A_DISP + "( x - #{" + H + "})^2 + #{" + K + "}", [ GREEN, GREEN ] ) ] [ parse( A_DISP + "( #{x} - " + H + ")^2 + " + K + " &= y", [ PINK ] ), parse( A_DISP + "( #{" + X1 + "} - " + H + ")^2 + " + K + " &= #{" + Y1 + "}", [ PINK, PINK ] ) ]

y = A_DISP(x - H)^2 + K

The equation is in vertex form, so we can use the vertex as one of the points.

When the equation is written in vertex form like this, the vertex is the point (h, k):

\qquad formatGroup( GROUP1, [ 0 ] )

\qquad formatGroup( GROUP1, [ 1 ] )

Examining our equation, we can see the vertex of the parabola is at (H, K).

style({ stroke: GREEN, strokeWidth: 3 }, function() { line( [ H - 0.3, K - 0.3 ], [ H + 0.3, K + 0.3 ] ).toBack(); line( [ H - 0.3, K + 0.3 ], [ H + 0.3, K - 0.3 ] ).toBack(); });

To find another point on the parabola, we can try plugging an x value into the equation.

Since the vertex is at x = H, let's try one unit to the right and evaluate the equation at x = X1.

\qquad formatGroup( GROUP2, [ 0, 1 ] )

Another point on the parabola is (X1, Y1)

style({ stroke: PINK, strokeWidth: 3 }, function() { line( [ X1 - 0.3, Y1 - 0.3 ], [ X1 + 0.3, Y1 + 0.3 ] ).toBack(); line( [ X1 - 0.3, Y1 + 0.3 ], [ X1 + 0.3, Y1 - 0.3 ] ).toBack(); });

A parabola has an axis of symmetry that passes through its vertex.

style({ stroke: GREEN, strokeDasharray: "-" }, function() { line( [ H, -11 ], [ H, 11 ] ).toBack(); });

Because the parabola is symmetric, we can reflect the point (X1, Y1) across the axis of symmetry to get another point, (X2, Y2), that must also be on the parabola.

style({ stroke: ORANGE, strokeWidth: 3 }, function() { line( [ X2 - 0.3, Y2 - 0.3 ], [ X2 + 0.3, Y2 + 0.3 ] ).toBack(); line( [ X2 - 0.3, Y2 + 0.3 ], [ X2 + 0.3, Y2 - 0.3 ] ).toBack(); });

There is only one graph of a parabola that passes through all three points we found.