<section xml:id="section-dynamic-exercises">
<title>Dynamic Exercises</title>
<introduction>
<p>
This section demonstrates the use of dynamic randomized exercises built upon the framework of Runestone components. These demonstration problems incorporate a library supporting mathematical expressions both for varying the content of the statement of the exercises as well as the checking of submitted answers.
</p>
</introduction>
<exercises>
<title>Dynamic Fill-In</title>
<introduction>
<p>
The first problem illustrates revised markup for fill-in problems that don't involve randomization and use simple string and number comparison tests. Later exercises illustrate the use of dynamically generated mathematical expressions.
</p>
</introduction>
<exercise label="fillin-string-integer-new">
<title>Fill-In, String and Number Answers</title>
<statement>
<p>
Complete the following line of a Python program so that it will declare an integer variable <c>age</c> with an initial value of <c>5</c>.
</p>
<p>
<fillin mode="string" answer="int"/> <c>age = </c> <fillin mode="number" answer="5"/><c>;</c>
</p>
</statement>
<evaluation> <evaluate> <test> <strcmp use-answer="yes"/>
<feedback>
<p>
A variable of type <c>int</c> is appropriate for whole number ages.
</p>
</feedback>
</test> <test> <strcmp>.*</strcmp>
<feedback>
<p>
Remember that Java uses just the first three letters of the word <q>integer</q> to define an integral type.
</p>
</feedback>
</test> </evaluate> <evaluate> <test> <numcmp use-answer="yes"/>
<feedback>
<p>
An integer variable may be initialized to a value.
</p>
</feedback>
</test> <test> <strcmp>.*</strcmp>
<feedback>
<p>
Use <c>5</c> as the initial value of the variable.
</p>
</feedback>
</test> </evaluate> </evaluation>
</exercise>
<exercise label="fillin-multi-answer-jscmp">
<title>Fill-In, Multiple Strings, Custom Checker</title>
<statement>
<p>
In order to apply the Integral Test to a sequence <m>\{a_n\}</m>, the function <m>a(n) = a_n</m> must be <fillin mode="string" answer="continuous"/>, <fillin mode="string" answer="positive"/><nbsp/>and <fillin mode="string" answer="decreasing"/>.
</p>
</statement>
<evaluation> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) </jscmp> </test> </evaluate> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) && !ans_array.slice(0,1).includes(ans) </jscmp> </test> <test> <jscmp> ans_array.slice(0,1).includes(ans) </jscmp>
<feedback>
You already gave that answer.
</feedback>
</test> </evaluate> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) && !ans_array.slice(0,2).includes(ans) </jscmp> </test> <test> <jscmp> ans_array.slice(0,2).includes(ans) </jscmp>
<feedback>
You already gave that answer.
</feedback>
</test> </evaluate> </evaluation>
</exercise>
<exercise label="dynamic-fitb-simple-formula">
<title>Fill-In Formula (Dynamic)</title>
<statement>
<p>
Find a formula for a cubic function <m>f(x)</m> that has roots at <m>x=<eval obj="x1"/></m>, <m>x=<eval obj="x2"/></m>, and <m>x=<eval obj="x3"/></m> and so that <m>f(0)=<eval obj="y0"/></m>.
</p>
<p>
<m>f(x)=</m> <fillin name="st_cubic" mode="math" ansobj="cubic"/>
</p>
</statement>
<solution>
<p>
Knowing the roots of a polynomial allows us to write down the formula of <m>f(x)</m> in factored form,
<md>
f(x) = A <eval obj="base_cubic"/>
</md>
with an unknown scaling multiple <m>A</m>.
</p>
<p>
When we evaluate <m>f(x)</m> at <m>x=0</m> using this formula, we find
<md>
f(0) = <eval obj="base_yint"/>A
</md>.
Since we also know <m>f(0)=<eval obj="y0"/></m>, we can write down the equation
<md>
A <eval obj="base_cubic"/> = <eval obj="y0"/>
</md>
and find that <m>A=<eval obj="A"/></m>.
</p>
<p>
Consequently, we can write our function in the form
<md>
f(x)=<eval obj="cubic"/>
</md>.
</p>
</solution>
<setup seed="314159"> <de-object name="y0" context="number"> <de-random distribution="discrete" min="-8" max="8" by="1" nonzero="yes"/> </de-object> <de-object name="x1" context="number"> <de-random distribution="discrete" min="-8" max="-4" by="1"/> </de-object> <de-object name="d1" context="number"> <de-random distribution="discrete" min="1" max="4" by="1"/> </de-object> <de-object name="d2" context="number"> <de-random distribution="discrete" min="1" max="4" by="1"/> </de-object> <de-object name="x2" context="number"> <de-number>x1+d1</de-number> </de-object> <de-object name="x3" context="number"> <de-number>x2+d2</de-number> </de-object> <de-object name="base_cubic" context="formula"> <de-expression reduce="yes">(x-x1)*(x-x2)*(x-x3)</de-expression> </de-object> <de-object name="base_yint" context="number"> <de-evaluate> <formula><eval obj="base_cubic"/></formula> <variable name="x">0</variable> </de-evaluate> </de-object> <de-object name="A" context="number"> <de-number reduce="yes">y0/base_yint</de-number> </de-object> <de-object name="cubic" context="formula"> <de-expression reduce="yes">A*(x-x1)*(x-x2)*(x-x3)</de-expression> </de-object> </setup> <evaluation> <evaluate name="st_cubic"> <test correct="yes"> <mathcmp obj="cubic"/> </test> </evaluate> </evaluation>
</exercise>
<exercise label="function-decomposition">
<title>Decompose the Function</title>
<statement>
<p>
Consider the function
<md>
h(x)=<eval obj="composition"/>
</md>.
Find two nontrivial functions <m>f(x)</m> and <m>g(x)</m> so that <m>h(x) = f(g(x))</m>.
</p>
<p>
<m>f(x) = </m> <fillin width="15" mode="math" ansobj="outerFormula" name="fGiven"/> and <m>g(x)=</m> <fillin width="15" mode="math" ansobj="innerFormula" name="gGiven"/>
</p>
</statement>
<solution>
<p>
Noticing that the expression <m><eval obj="innerFormula"/></m> appears inside parentheses with a power, it makes sense to think of that as the inner function, defining <m>g(x) = <eval obj="innerFormula"/></m>. The outer function describes what happens to that. If we imagined replacing the formula <m><eval obj="innerFormula"/></m> with a box and then call that box our variable <m>x</m>, we find the outer function is given by <m>f(x) = <eval obj="outerFormula"/></m>.
</p>
<p>
This is not the only non-trivial composition. Can you find others?
</p>
</solution>
<setup seed="4321"> <de-object name="a" context="number"> <de-random distribution="discrete" min="-4" max="5" by="1" nonzero="yes"/> </de-object> <de-object name="n" context="number"> <de-random distribution="discrete" min="2" max="5"/> </de-object> <de-object name="b" context="number"> <de-random distribution="discrete" min="-10" max="10" by="1" nonzero="yes"/> </de-object> <de-object name="c" context="number"> <de-random distribution="discrete" min="-4" max="5" by="1" nonzero="yes"/> </de-object> <de-object name="d" context="number"> <de-random distribution="discrete" min="-10" max="10" by="1" nonzero="yes"/> </de-object> <de-object name="outerFormula" context="formula"> <de-expression>a*x^n+b</de-expression> </de-object> <de-object name="innerFormula" context="formula"> <de-expression>c*x+d</de-expression> </de-object> <de-object name="identityFunction" context="formula"> <de-expression>x</de-expression> </de-object> <de-object name="composition" context="formula"> <de-expression mode="substitution" reduce="yes"> <formula><eval obj="outerFormula"/></formula> <variable name="x"><eval obj="innerFormula"/></variable> </de-expression> </de-object> </setup> <evaluation answers-coupled="yes"> <evaluate name="fGiven"> <test> <mathcmp obj="identityFunction"/>
<feedback>
<p>
<m>f(x)=x</m> is not allowed for nontrivial compositions.
</p>
</feedback>
</test> <test> <logic op="and"> <logic op="not"> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="fGiven"/></formula> <variable name="x"><eval obj="gGiven"/></variable> </de-expression> </mathcmp> </logic> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="gGiven"/></formula> <variable name="x"><eval obj="fGiven"/></variable> </de-expression> </mathcmp> </logic>
<feedback>
<p>
You have composed in the wrong order.
</p>
</feedback>
</test> </evaluate> <evaluate name="gGiven"> <test> <mathcmp obj="identityFunction"/>
<feedback>
<p>
<m>g(x)=x</m> is not allowed for nontrivial compositions.
</p>
</feedback>
</test> </evaluate> <evaluate all="yes"> <test correct="yes"> <logic op="and"> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="fGiven"/></formula> <variable name="x"><eval obj="gGiven"/></variable> </de-expression> </mathcmp> <logic op="not"> <mathcmp> <eval obj="fGiven"/> <eval obj="identityFunction"/> </mathcmp> </logic> <logic op="not"> <mathcmp> <eval obj="gGiven"/> <eval obj="identityFunction"/> </mathcmp> </logic> </logic> </test> </evaluate> </evaluation>
</exercise>
</exercises>
</section>
Section 17 Dynamic Exercises
View Source for section
This section demonstrates the use of dynamic randomized exercises built upon the framework of Runestone components. These demonstration problems incorporate a library supporting mathematical expressions both for varying the content of the statement of the exercises as well as the checking of submitted answers.
Exercises Dynamic Fill-In
View Source for exercises
<exercises>
<title>Dynamic Fill-In</title>
<introduction>
<p>
The first problem illustrates revised markup for fill-in problems that don't involve randomization and use simple string and number comparison tests. Later exercises illustrate the use of dynamically generated mathematical expressions.
</p>
</introduction>
<exercise label="fillin-string-integer-new">
<title>Fill-In, String and Number Answers</title>
<statement>
<p>
Complete the following line of a Python program so that it will declare an integer variable <c>age</c> with an initial value of <c>5</c>.
</p>
<p>
<fillin mode="string" answer="int"/> <c>age = </c> <fillin mode="number" answer="5"/><c>;</c>
</p>
</statement>
<evaluation> <evaluate> <test> <strcmp use-answer="yes"/>
<feedback>
<p>
A variable of type <c>int</c> is appropriate for whole number ages.
</p>
</feedback>
</test> <test> <strcmp>.*</strcmp>
<feedback>
<p>
Remember that Java uses just the first three letters of the word <q>integer</q> to define an integral type.
</p>
</feedback>
</test> </evaluate> <evaluate> <test> <numcmp use-answer="yes"/>
<feedback>
<p>
An integer variable may be initialized to a value.
</p>
</feedback>
</test> <test> <strcmp>.*</strcmp>
<feedback>
<p>
Use <c>5</c> as the initial value of the variable.
</p>
</feedback>
</test> </evaluate> </evaluation>
</exercise>
<exercise label="fillin-multi-answer-jscmp">
<title>Fill-In, Multiple Strings, Custom Checker</title>
<statement>
<p>
In order to apply the Integral Test to a sequence <m>\{a_n\}</m>, the function <m>a(n) = a_n</m> must be <fillin mode="string" answer="continuous"/>, <fillin mode="string" answer="positive"/><nbsp/>and <fillin mode="string" answer="decreasing"/>.
</p>
</statement>
<evaluation> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) </jscmp> </test> </evaluate> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) && !ans_array.slice(0,1).includes(ans) </jscmp> </test> <test> <jscmp> ans_array.slice(0,1).includes(ans) </jscmp>
<feedback>
You already gave that answer.
</feedback>
</test> </evaluate> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) && !ans_array.slice(0,2).includes(ans) </jscmp> </test> <test> <jscmp> ans_array.slice(0,2).includes(ans) </jscmp>
<feedback>
You already gave that answer.
</feedback>
</test> </evaluate> </evaluation>
</exercise>
<exercise label="dynamic-fitb-simple-formula">
<title>Fill-In Formula (Dynamic)</title>
<statement>
<p>
Find a formula for a cubic function <m>f(x)</m> that has roots at <m>x=<eval obj="x1"/></m>, <m>x=<eval obj="x2"/></m>, and <m>x=<eval obj="x3"/></m> and so that <m>f(0)=<eval obj="y0"/></m>.
</p>
<p>
<m>f(x)=</m> <fillin name="st_cubic" mode="math" ansobj="cubic"/>
</p>
</statement>
<solution>
<p>
Knowing the roots of a polynomial allows us to write down the formula of <m>f(x)</m> in factored form,
<md>
f(x) = A <eval obj="base_cubic"/>
</md>
with an unknown scaling multiple <m>A</m>.
</p>
<p>
When we evaluate <m>f(x)</m> at <m>x=0</m> using this formula, we find
<md>
f(0) = <eval obj="base_yint"/>A
</md>.
Since we also know <m>f(0)=<eval obj="y0"/></m>, we can write down the equation
<md>
A <eval obj="base_cubic"/> = <eval obj="y0"/>
</md>
and find that <m>A=<eval obj="A"/></m>.
</p>
<p>
Consequently, we can write our function in the form
<md>
f(x)=<eval obj="cubic"/>
</md>.
</p>
</solution>
<setup seed="314159"> <de-object name="y0" context="number"> <de-random distribution="discrete" min="-8" max="8" by="1" nonzero="yes"/> </de-object> <de-object name="x1" context="number"> <de-random distribution="discrete" min="-8" max="-4" by="1"/> </de-object> <de-object name="d1" context="number"> <de-random distribution="discrete" min="1" max="4" by="1"/> </de-object> <de-object name="d2" context="number"> <de-random distribution="discrete" min="1" max="4" by="1"/> </de-object> <de-object name="x2" context="number"> <de-number>x1+d1</de-number> </de-object> <de-object name="x3" context="number"> <de-number>x2+d2</de-number> </de-object> <de-object name="base_cubic" context="formula"> <de-expression reduce="yes">(x-x1)*(x-x2)*(x-x3)</de-expression> </de-object> <de-object name="base_yint" context="number"> <de-evaluate> <formula><eval obj="base_cubic"/></formula> <variable name="x">0</variable> </de-evaluate> </de-object> <de-object name="A" context="number"> <de-number reduce="yes">y0/base_yint</de-number> </de-object> <de-object name="cubic" context="formula"> <de-expression reduce="yes">A*(x-x1)*(x-x2)*(x-x3)</de-expression> </de-object> </setup> <evaluation> <evaluate name="st_cubic"> <test correct="yes"> <mathcmp obj="cubic"/> </test> </evaluate> </evaluation>
</exercise>
<exercise label="function-decomposition">
<title>Decompose the Function</title>
<statement>
<p>
Consider the function
<md>
h(x)=<eval obj="composition"/>
</md>.
Find two nontrivial functions <m>f(x)</m> and <m>g(x)</m> so that <m>h(x) = f(g(x))</m>.
</p>
<p>
<m>f(x) = </m> <fillin width="15" mode="math" ansobj="outerFormula" name="fGiven"/> and <m>g(x)=</m> <fillin width="15" mode="math" ansobj="innerFormula" name="gGiven"/>
</p>
</statement>
<solution>
<p>
Noticing that the expression <m><eval obj="innerFormula"/></m> appears inside parentheses with a power, it makes sense to think of that as the inner function, defining <m>g(x) = <eval obj="innerFormula"/></m>. The outer function describes what happens to that. If we imagined replacing the formula <m><eval obj="innerFormula"/></m> with a box and then call that box our variable <m>x</m>, we find the outer function is given by <m>f(x) = <eval obj="outerFormula"/></m>.
</p>
<p>
This is not the only non-trivial composition. Can you find others?
</p>
</solution>
<setup seed="4321"> <de-object name="a" context="number"> <de-random distribution="discrete" min="-4" max="5" by="1" nonzero="yes"/> </de-object> <de-object name="n" context="number"> <de-random distribution="discrete" min="2" max="5"/> </de-object> <de-object name="b" context="number"> <de-random distribution="discrete" min="-10" max="10" by="1" nonzero="yes"/> </de-object> <de-object name="c" context="number"> <de-random distribution="discrete" min="-4" max="5" by="1" nonzero="yes"/> </de-object> <de-object name="d" context="number"> <de-random distribution="discrete" min="-10" max="10" by="1" nonzero="yes"/> </de-object> <de-object name="outerFormula" context="formula"> <de-expression>a*x^n+b</de-expression> </de-object> <de-object name="innerFormula" context="formula"> <de-expression>c*x+d</de-expression> </de-object> <de-object name="identityFunction" context="formula"> <de-expression>x</de-expression> </de-object> <de-object name="composition" context="formula"> <de-expression mode="substitution" reduce="yes"> <formula><eval obj="outerFormula"/></formula> <variable name="x"><eval obj="innerFormula"/></variable> </de-expression> </de-object> </setup> <evaluation answers-coupled="yes"> <evaluate name="fGiven"> <test> <mathcmp obj="identityFunction"/>
<feedback>
<p>
<m>f(x)=x</m> is not allowed for nontrivial compositions.
</p>
</feedback>
</test> <test> <logic op="and"> <logic op="not"> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="fGiven"/></formula> <variable name="x"><eval obj="gGiven"/></variable> </de-expression> </mathcmp> </logic> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="gGiven"/></formula> <variable name="x"><eval obj="fGiven"/></variable> </de-expression> </mathcmp> </logic>
<feedback>
<p>
You have composed in the wrong order.
</p>
</feedback>
</test> </evaluate> <evaluate name="gGiven"> <test> <mathcmp obj="identityFunction"/>
<feedback>
<p>
<m>g(x)=x</m> is not allowed for nontrivial compositions.
</p>
</feedback>
</test> </evaluate> <evaluate all="yes"> <test correct="yes"> <logic op="and"> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="fGiven"/></formula> <variable name="x"><eval obj="gGiven"/></variable> </de-expression> </mathcmp> <logic op="not"> <mathcmp> <eval obj="fGiven"/> <eval obj="identityFunction"/> </mathcmp> </logic> <logic op="not"> <mathcmp> <eval obj="gGiven"/> <eval obj="identityFunction"/> </mathcmp> </logic> </logic> </test> </evaluate> </evaluation>
</exercise>
</exercises>
The first problem illustrates revised markup for fill-in problems that donβt involve randomization and use simple string and number comparison tests. Later exercises illustrate the use of dynamically generated mathematical expressions.
1. Fill-In, String and Number Answers.
View Source for exercise
<exercise label="fillin-string-integer-new">
<title>Fill-In, String and Number Answers</title>
<statement>
<p>
Complete the following line of a Python program so that it will declare an integer variable <c>age</c> with an initial value of <c>5</c>.
</p>
<p>
<fillin mode="string" answer="int"/> <c>age = </c> <fillin mode="number" answer="5"/><c>;</c>
</p>
</statement>
<evaluation> <evaluate> <test> <strcmp use-answer="yes"/>
<feedback>
<p>
A variable of type <c>int</c> is appropriate for whole number ages.
</p>
</feedback>
</test> <test> <strcmp>.*</strcmp>
<feedback>
<p>
Remember that Java uses just the first three letters of the word <q>integer</q> to define an integral type.
</p>
</feedback>
</test> </evaluate> <evaluate> <test> <numcmp use-answer="yes"/>
<feedback>
<p>
An integer variable may be initialized to a value.
</p>
</feedback>
</test> <test> <strcmp>.*</strcmp>
<feedback>
<p>
Use <c>5</c> as the initial value of the variable.
</p>
</feedback>
</test> </evaluate> </evaluation>
</exercise>
2. Fill-In, Multiple Strings, Custom Checker.
View Source for exercise
<exercise label="fillin-multi-answer-jscmp">
<title>Fill-In, Multiple Strings, Custom Checker</title>
<statement>
<p>
In order to apply the Integral Test to a sequence <m>\{a_n\}</m>, the function <m>a(n) = a_n</m> must be <fillin mode="string" answer="continuous"/>, <fillin mode="string" answer="positive"/><nbsp/>and <fillin mode="string" answer="decreasing"/>.
</p>
</statement>
<evaluation> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) </jscmp> </test> </evaluate> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) && !ans_array.slice(0,1).includes(ans) </jscmp> </test> <test> <jscmp> ans_array.slice(0,1).includes(ans) </jscmp>
<feedback>
You already gave that answer.
</feedback>
</test> </evaluate> <evaluate> <test correct="yes"> <jscmp> ["continuous","positive","decreasing"].includes(ans) && !ans_array.slice(0,2).includes(ans) </jscmp> </test> <test> <jscmp> ans_array.slice(0,2).includes(ans) </jscmp>
<feedback>
You already gave that answer.
</feedback>
</test> </evaluate> </evaluation>
</exercise>
3. Fill-In Formula (Dynamic).
View Source for exercise
<exercise label="dynamic-fitb-simple-formula">
<title>Fill-In Formula (Dynamic)</title>
<statement>
<p>
Find a formula for a cubic function <m>f(x)</m> that has roots at <m>x=<eval obj="x1"/></m>, <m>x=<eval obj="x2"/></m>, and <m>x=<eval obj="x3"/></m> and so that <m>f(0)=<eval obj="y0"/></m>.
</p>
<p>
<m>f(x)=</m> <fillin name="st_cubic" mode="math" ansobj="cubic"/>
</p>
</statement>
<solution>
<p>
Knowing the roots of a polynomial allows us to write down the formula of <m>f(x)</m> in factored form,
<md>
f(x) = A <eval obj="base_cubic"/>
</md>
with an unknown scaling multiple <m>A</m>.
</p>
<p>
When we evaluate <m>f(x)</m> at <m>x=0</m> using this formula, we find
<md>
f(0) = <eval obj="base_yint"/>A
</md>.
Since we also know <m>f(0)=<eval obj="y0"/></m>, we can write down the equation
<md>
A <eval obj="base_cubic"/> = <eval obj="y0"/>
</md>
and find that <m>A=<eval obj="A"/></m>.
</p>
<p>
Consequently, we can write our function in the form
<md>
f(x)=<eval obj="cubic"/>
</md>.
</p>
</solution>
<setup seed="314159"> <de-object name="y0" context="number"> <de-random distribution="discrete" min="-8" max="8" by="1" nonzero="yes"/> </de-object> <de-object name="x1" context="number"> <de-random distribution="discrete" min="-8" max="-4" by="1"/> </de-object> <de-object name="d1" context="number"> <de-random distribution="discrete" min="1" max="4" by="1"/> </de-object> <de-object name="d2" context="number"> <de-random distribution="discrete" min="1" max="4" by="1"/> </de-object> <de-object name="x2" context="number"> <de-number>x1+d1</de-number> </de-object> <de-object name="x3" context="number"> <de-number>x2+d2</de-number> </de-object> <de-object name="base_cubic" context="formula"> <de-expression reduce="yes">(x-x1)*(x-x2)*(x-x3)</de-expression> </de-object> <de-object name="base_yint" context="number"> <de-evaluate> <formula><eval obj="base_cubic"/></formula> <variable name="x">0</variable> </de-evaluate> </de-object> <de-object name="A" context="number"> <de-number reduce="yes">y0/base_yint</de-number> </de-object> <de-object name="cubic" context="formula"> <de-expression reduce="yes">A*(x-x1)*(x-x2)*(x-x3)</de-expression> </de-object> </setup> <evaluation> <evaluate name="st_cubic"> <test correct="yes"> <mathcmp obj="cubic"/> </test> </evaluate> </evaluation>
</exercise>
4. Decompose the Function.
View Source for exercise
<exercise label="function-decomposition">
<title>Decompose the Function</title>
<statement>
<p>
Consider the function
<md>
h(x)=<eval obj="composition"/>
</md>.
Find two nontrivial functions <m>f(x)</m> and <m>g(x)</m> so that <m>h(x) = f(g(x))</m>.
</p>
<p>
<m>f(x) = </m> <fillin width="15" mode="math" ansobj="outerFormula" name="fGiven"/> and <m>g(x)=</m> <fillin width="15" mode="math" ansobj="innerFormula" name="gGiven"/>
</p>
</statement>
<solution>
<p>
Noticing that the expression <m><eval obj="innerFormula"/></m> appears inside parentheses with a power, it makes sense to think of that as the inner function, defining <m>g(x) = <eval obj="innerFormula"/></m>. The outer function describes what happens to that. If we imagined replacing the formula <m><eval obj="innerFormula"/></m> with a box and then call that box our variable <m>x</m>, we find the outer function is given by <m>f(x) = <eval obj="outerFormula"/></m>.
</p>
<p>
This is not the only non-trivial composition. Can you find others?
</p>
</solution>
<setup seed="4321"> <de-object name="a" context="number"> <de-random distribution="discrete" min="-4" max="5" by="1" nonzero="yes"/> </de-object> <de-object name="n" context="number"> <de-random distribution="discrete" min="2" max="5"/> </de-object> <de-object name="b" context="number"> <de-random distribution="discrete" min="-10" max="10" by="1" nonzero="yes"/> </de-object> <de-object name="c" context="number"> <de-random distribution="discrete" min="-4" max="5" by="1" nonzero="yes"/> </de-object> <de-object name="d" context="number"> <de-random distribution="discrete" min="-10" max="10" by="1" nonzero="yes"/> </de-object> <de-object name="outerFormula" context="formula"> <de-expression>a*x^n+b</de-expression> </de-object> <de-object name="innerFormula" context="formula"> <de-expression>c*x+d</de-expression> </de-object> <de-object name="identityFunction" context="formula"> <de-expression>x</de-expression> </de-object> <de-object name="composition" context="formula"> <de-expression mode="substitution" reduce="yes"> <formula><eval obj="outerFormula"/></formula> <variable name="x"><eval obj="innerFormula"/></variable> </de-expression> </de-object> </setup> <evaluation answers-coupled="yes"> <evaluate name="fGiven"> <test> <mathcmp obj="identityFunction"/>
<feedback>
<p>
<m>f(x)=x</m> is not allowed for nontrivial compositions.
</p>
</feedback>
</test> <test> <logic op="and"> <logic op="not"> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="fGiven"/></formula> <variable name="x"><eval obj="gGiven"/></variable> </de-expression> </mathcmp> </logic> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="gGiven"/></formula> <variable name="x"><eval obj="fGiven"/></variable> </de-expression> </mathcmp> </logic>
<feedback>
<p>
You have composed in the wrong order.
</p>
</feedback>
</test> </evaluate> <evaluate name="gGiven"> <test> <mathcmp obj="identityFunction"/>
<feedback>
<p>
<m>g(x)=x</m> is not allowed for nontrivial compositions.
</p>
</feedback>
</test> </evaluate> <evaluate all="yes"> <test correct="yes"> <logic op="and"> <mathcmp> <eval obj="composition"/> <de-expression context="formula" mode="substitution"> <formula><eval obj="fGiven"/></formula> <variable name="x"><eval obj="gGiven"/></variable> </de-expression> </mathcmp> <logic op="not"> <mathcmp> <eval obj="fGiven"/> <eval obj="identityFunction"/> </mathcmp> </logic> <logic op="not"> <mathcmp> <eval obj="gGiven"/> <eval obj="identityFunction"/> </mathcmp> </logic> </logic> </test> </evaluate> </evaluation>
</exercise>

