Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

245 lines (231 sloc) 10.21 kB
<!DOCTYPE html>
<html data-require="math math-format polynomials graphie interactive word-problems">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Positive and negative parts of functions</title>
<script data-main="../local-only/main.js" src="../local-only/require.js"></script>
</head>
<body>
<div class="exercise">
<div class="vars">
<!-- Some hard-coded polynomial functions -->
<var id="COEF, XRANGE, YRANGE">randFromArray([
[[ 1, 0, -16, 0, 49], [-5, 5], [-100, 100]],
[[-1, 0, 16, 0, -49], [-5, 5], [-250, 100]],
[[ 1, 3, -14, -35, 21], [-5, 5], [-100, 200]],
[[-1, -3, 14, 35, 0], [-5, 5], [-200, 100]],
[[ 1, 4, -1, -4], [-5, 5], [ -40, 120]],
[[ -1, -4, 1, 4], [-5, 5], [-150, 40]],
[[ 1, 0, -16, 0], [-5, 5], [ -50, 50]],
[[ -1, 0, 16, 0], [-5, 5], [ -70, 60]],
[[ 1, 0, -22, 27], [-5, 5], [ -30, 70]],
[[ -1, 0, 22, -27], [-5, 5], [ -70, 30]],
[[ 1, 1, -13, -14], [-5, 5], [ -40, 40]],
[[ -1, -1, 13, 14], [-5, 5], [ -40, 40]],
[[ 1, 0, -12], [-5, 5], [ -20, 20]],
[[ -1, 0, 12], [-5, 5], [ -20, 20]],
[[ 1, -1, -6], [-5, 5], [ -20, 20]],
[[ -1, 1, 6], [-5, 5], [ -30, 20]],
[[ 1, 0, -3], [-5, 5], [ -20, 30]],
[[ -1, 0, 3], [-5, 5], [ -30, 20]],
[[ 1, 2, 0], [-5, 5], [ -10, 35]],
[[ -1, -2, 0], [-5, 5], [ -40, 20]]
])</var>
<var id="POLYNOMIAL">new Polynomial(0, COEF.length - 1, COEF.reverse())</var>
<var id="FNX">function(x) {return POLYNOMIAL.evalOf(x);}</var>
<!-- Break XRANGE into intervals based on the roots of FNX -->
<var id="FNX_INTERVALS">_.reduce(findRootsNumerically(FNX, XRANGE), function(intervals, root) {
var last = _.last(intervals)
return _.initial(intervals).concat([[last[0], root], [root, last[1]]]);
}, [XRANGE])</var>
<!-- Find just the positive intervals -->
<var id="FNX_INTERVALS_POS">_.filter(FNX_INTERVALS, function(intv) {
return FNX(intv[0] + (intv[1] - intv[0]) / 2) &gt; 0;
})</var>
<!-- Sort to find the widest positive interval -->
<var id="SOLUTION_INTERVAL_POS">
_.sortBy(FNX_INTERVALS_POS, function(intv) {
return intv[0] - intv[1];
})[0]
</var>
<!-- Find just the negative intervals -->
<var id="FNX_INTERVALS_NEG">_.filter(FNX_INTERVALS, function(intv) {
return FNX(intv[0] + (intv[1] - intv[0]) / 2) &lt; 0;
})</var>
<!-- Sort to find the widest negative interval -->
<var id="SOLUTION_INTERVAL_NEG">
_.sortBy(FNX_INTERVALS_NEG, function(intv) {
return intv[0] - intv[1];
})[0]
</var>
</div>
<div class="solution" data-type="custom">
<div class="instruction">
Move the orange window to select part of the function.
</div>
<div class="guess">
graph.slidingWindow.getX()
</div>
<div class="validator-function">
var correct = _.reduce(_.range(guess, guess + 1, 0.02), function(correct, x) {
return correct &amp;&amp; PREDICATE(x);
}, true);
if (!graph.moved &amp;&amp; !correct) {
return ""
}
return correct;
</div>
<div class="show-guess">
graph.slidingWindow.moveTo(guess, 0);
</div>
</div>
<p class="question"></p>
<div class="render-answer-area-here"></div>
<div class="problem">
<div class="graphie" id="fnplot">
initAutoscaledGraph([XRANGE, YRANGE]);
addMouseLayer();
plot(FNX, XRANGE, {
stroke: BLUE,
strokeWidth: 3
});
graph.moved = false;
// start the selection at the first zero of f(x) which is
// guaranteed to be wrong but not give info about the right answer
var startX = FNX_INTERVALS[0][1] - 0.5;
graph.slidingWindow = addRectGraph({
x: startX,
y: YRANGE[0],
width: 1,
height: YRANGE[1] - YRANGE[0],
normalStyle: {
area: { "fill-opacity": 0.2 },
edges: { "stroke-width": 0 }
},
hoverStyle: {
area: { "fill-opacity": 0.3 }
},
fixed: {
points: [true, true, true, true],
edges: [true, true, true, true]
},
constraints: {
constrainX: false,
constrainY: true,
xmin: XRANGE[0],
xmax: XRANGE[1]
},
onMove: function() {
graph.moved = true;
}
});
</div>
<p class="graph-caption">
<code class="hint_blue">f(x) = <var>POLYNOMIAL.text()</var></code>
</p>
</div>
<div class="problems">
<div id="positive">
<div class="vars" data-apply="prependVars">
<var id="PREDICATE">function(x) { return FNX(x) &gt; 0; }</var>
</div>
<p class="question" data-apply="appendContents">
A function <code>f(x)</code> is plotted below.
Highlight an interval where <code>f(x) &gt; 0</code>.
</p>
<div class="hints">
<p>
The function <code>f(x)</code> is greater than <code>0</code>
wherever it's positive.
</p>
<div>
<p data-if="isSingular(FNX_INTERVALS_POS.length)">
The interval
where <code>f(x)</code> is positive
is
<span class="hint_orange">highlighted</span> above.
</p><p data-else="">
The intervals
where <code>f(x)</code> is positive
are
<span class="hint_orange">highlighted</span> above.
</p>
<div class="graphie" data-update="fnplot">
plot(FNX, [XRANGE[0] - 1, XRANGE[1] + 1], {
stroke: ORANGE,
strokeWidth: 16,
opacity: 0.7
}).attr("clip-rect",
scalePoint([range[0][0], range[1][1]])[0] + "," +
scalePoint([range[0][0], range[1][1]])[1] + "," +
scaleVector([range[0][1] - range[0][0], range[1][1]])[0] + "," +
scaleVector([range[0][1] - range[0][0], range[1][1]])[1]
);
</div>
</div>
<div>
<p>
Select any part of the function that's highlighted.
</p>
<div class="graphie" data-update="fnplot">
graph.slidingWindow.moveTo(
(SOLUTION_INTERVAL_POS[1] - SOLUTION_INTERVAL_POS[0]) / 2 +
SOLUTION_INTERVAL_POS[0] - 0.5, 0);
</div>
</div>
</div>
</div>
<div id="negative">
<div class="vars" data-apply="prependVars">
<var id="PREDICATE">function(x) { return FNX(x) &lt; 0; }</var>
</div>
<p class="question" data-apply="appendContents">
A function <code>f(x)</code> is plotted below.
Highlight an interval where <code>f(x) &lt; 0</code>.
</p>
<div class="hints">
<p>
The function <code>f(x)</code> is less than <code>0</code>
wherever it's negative.
</p>
<div>
<p data-if="isSingular(FNX_INTERVALS_NEG.length)">
The interval
where <code>f(x)</code> is negative
is
<span class="hint_orange">highlighted</span> above.
</p><p data-else="">
The intervals
where <code>f(x)</code> is negative
are
<span class="hint_orange">highlighted</span> above.
</p>
<div class="graphie" data-update="fnplot">
plot(FNX, [XRANGE[0] - 1, XRANGE[1] + 1], {
stroke: ORANGE,
strokeWidth: 16,
opacity: 0.7
}).attr("clip-rect",
scalePoint([range[0][0], 0])[0] + "," +
scalePoint([range[0][0], 0])[1] + "," +
scaleVector([range[0][1] - range[0][0], -range[1][0]])[0] + "," +
scaleVector([range[0][1] - range[0][0], -range[1][0]])[1]
);
</div>
</div>
<div>
<p>
Select any part of the function that's highlighted.
</p>
<div class="graphie" data-update="fnplot">
graph.slidingWindow.moveTo(
(SOLUTION_INTERVAL_NEG[1] - SOLUTION_INTERVAL_NEG[0]) / 2 +
SOLUTION_INTERVAL_NEG[0] - 0.5, 0);
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Jump to Line
Something went wrong with that request. Please try again.