# Related Rates # Ash Maruyama & Matthew Barry # # ################################## # # Header For All Maplets restart: with(Maplets[Elements]):with(Maplets[Tools]): StartEngine(); randomize(): lightorange:="#FFB300": lightcyan:="#DDFFFF": lightblue:="#CFCFFF": lightgreen:="#CCFFCC": darkgreen:="#00C000": ColorBkgd:=wheat: ColorDefaultMenu:=lightcyan: ColorHelpMenu:=lightorange: ColorFileMenu:=pink: ColorFooter:=lightcyan: ColorNewButton:=magenta: # or Make, Save, Enter Problem ColorReturnButton:=magenta: ColorCloseButton:=pink: # or Quit, Clear, Reset, Cancel ColorHintButton:=lightorange: # or Syntax ColorPrevButton:=turquoise: # or Update ColorEnterButton:=turquoise: ColorSimplifyButton:=lightorange: ColorCheckButton:=green: ColorShowButton:=lightorange: ColorPlotButton:=gold: ColorPlotButtonFrgd:=black: ColorPlotFrame:=gold: ColorTableBkgd:=lightgreen: ColorCalculatorBkgd:=gold: ColorBlackBox:=black: ColorBlackBoxFrgd:=yellow: ColorMessage:=white: ColorMessageFrgd:=black: ColorInput:=turquoise: ColorInputFrgd:=black: ColorCorrect:=green: ColorCorrectFrgd:=black: ColorIncorrect:=red: ColorIncorrectFrgd:=white: ColorWarning:=yellow: ColorWarningFrgd:=black: ColorShow:=lightorange: ColorShowFrgd:=black: ColorHint:=lightorange: ColorHintFrgd:=black: # or Info, Syntax ColorDisable:=wheat: ColorDisableFrgd:=black: FontFooter:=Font("helvetica",10): FontSymbol:=Font("symbol",12): FontBig:=Font("times",20): LIBLogo:=cat(libname,"/M4C/M4C.png"): Logo:="M4C.png": #LIBLogo:=cat(libname,"/M4C/WebALT_logo.png"): #Logo:="WebALT_logo.png": # ################################## # # Template Translation Table For All Maplets TEXTLprogrammers:= "Programmers: D.B. Meade & P.B. Yasskin": TEXTLcopyright:= "© Copyright: Maplets for Calculus 2004-10": #"© Copyright: WebALT 2006-07": TEXTLversion:= "M4C v1.3 July 2010": TEXTBQuit:= "Quit": TEXTBClose:= "Close": TEXTBCheck:= "Check": TEXTBShow:= "Show": TEXTBShowAll:= "Show All Steps": TEXTBCheckAns:= "Check Answer": TEXTBShowAns:= "Show Answer": TEXTBInstructions:= "Instructions": TEXTBHint:= "Hint": TEXTBHints:= "Hints": TEXTBSyntax:= "Syntax": TEXTBHintSyntax:= "Hints and Syntax": TEXTBPrev:= "Preview": TEXTBUpdate:= "Update": TEXTBDerivation:= "Derivation": TEXTBNewProblem:= "New Problem": TEXTBNewFunction:= "New Function": TEXTBNewGraph:= "New Graph": TEXTBNewEquation:= "New Equation": TEXTBNewLimit:= "New Limit": TEXTBNewDerivative:= "New Derivative": TEXTBNewIntegral:= "New Integral": TEXTBNewSequence:= "New Sequence": TEXTBNewSeries:= "New Series": TEXTBNewDiffEq:= "New Differential Equation": TEXTBNewCurve:= "New Curve": TEXTBEnterProblem:= "Enter Problem": TEXTBEnterFunction:= "Enter Function": TEXTBEnterGraph:= "Enter Graph": TEXTBEnterEquation:= "Enter Equation": TEXTBEnterLimit:= "Enter Limit": TEXTBEnterDerivative:= "Enter Derivative": TEXTBEnterIntegral:= "Enter Integral": TEXTBEnterSequence:= "Enter Sequence": TEXTBEnterSeries:= "Enter Series": TEXTBEnterDiffEq:= "Enter Differential Equation": TEXTBMake:= "Modify or Make Your Own Problem": TEXTBSaveClose:= "Save Problem and Close": TEXTBAskQuestion:= "Ask Question": TEXTBNextQuestion:= "Next Question": TEXTBHowtoAnswer:= "How to Answer": TEXTBEnter:= "Enter": TEXTBOK:= "OK": TEXTBAccept:= "Accept": TEXTBReturn:= "Return": TEXTBClear:= "Clear": TEXTBClearSelections:= "Clear Selections": TEXTBClearAll:= "Clear All Steps": TEXTBReset:= "Reset": TEXTBRestart:= "Restart": TEXTBCancel:= "Cancel": TEXTBPlot:= "Plot": TEXTBPlotIt:= "Plot It": TEXTBAnimate:= "Animate": TEXTBPlay:= "Play": TEXTBPause:= "Pause": TEXTBForward:= "Forward": TEXTBReverse:= "Reverse": TEXTBStep:= "Step": TEXTBUpdatePlot:= "Update Plot": TEXTBZoomIn:= "Zoom In": TEXTBZoomOut:= "Zoom Out": TEXTBPlotSetup:= "Plot Setup": TEXTBRefresh:= "Refresh": TEXTBCalculate:= "Calculate": TEXTBSimplify:= "Simplify": TEXTBFactor:= "Factor": TEXTBExpand:= "Expand": TEXTBNormalize:= "Normalize": TEXTBCombine:= "Combine": TEXTBRationalize:= "Rationalize": TEXTBSort:= "Sort": TEXTBDecimal:= "Decimal": TEXTBExact:= "Exact": TEXTCorrect:= " correct ": TEXTIncorrect:= "incorrect": TEXTAlmost:= " almost ": TEXTWarning:= " warning ": TEXTShown:= " shown ": TEXTSlower:= "Slower": TEXTFaster:= "Faster": TEXTEnterFormula:= " Enter Formula:": TEXTEvaluate:= " Evaluate:": TEXTApproximate:= " Approximate:": TEXTand:= " and ": TEXTor:= " or ": TEXTThus:= " Thus ": TEXTSo:= " So ": TEXTType:= " Type ": TEXTfor:= " for ": TEXTat:= " at ": TEXTorcheck:= " or check: ": TEXTvertical:= "vertical": TEXThorizontal:= "horizontal": TEXTleft:= "left": TEXTright:= "right": TEXTless:= "less": TEXTgreater:= "greater": TEXTCBDNE:= "does not exist": TEXTCBNone:= "None": TEXTCB11scaling:= "1-1 scaling": TEXTdefault:= " default ": TEXTCBDoNotShow:= "Do not show this window again.": TEXTRBNumeric:= "Numeric": TEXTRBSymbolic:= "Symbolic": TEXTRBTrue:= "True": TEXTRBFalse:= "False": TEXTRBT:= "T": TEXTRBF:= "F": TEXTRBOn:= "On": TEXTRBOff:= "Off": TEXTRed:= "Red": TEXTGreen:= "Green": TEXTBlue:= "Blue": TEXTCyan:= "Cyan": TEXTMagenta:= "Magenta": TEXTYellow:= "Yellow": TEXTRedR:= "R": TEXTGreenG:= "G": TEXTBlueB:= "B": TEXTRBPlot1:= "Plot # 1": TEXTRBPlot2:= "Plot # 2": TEXTRBPlot3:= "Plot # 3": TEXTRBPlot4:= "Plot # 4": TEXTRBPlot5:= "Plot # 5": TEXTRBPlot6:= "Plot # 6": TEXTRBconverge:= "converge": TEXTRBdiverge:= "diverge": TEXTRBconverges:= "converges": TEXTRBdiverges:= "diverges": TEXTRBdiverges2:= "diverges ": TEXTRBconvergent:= "Convergent": TEXTRBdivergent:= "Divergent": TEXTtitlePROBLEM:= "Modify or Make Your Own Problem": TEXTtitlePREVIEW:= "Preview": TEXTtitleHINT:= "Hint": TEXTtitleSYNTAX:= "Syntax": TEXTtitlePlotSetup:= "Plot Setup": TEXTCapGoal:= "Goal:": TEXTCapProbStat:= "Problem Statement:": TEXTCapSyntaxTutorial:= "Syntax Tutorial:": TEXTCapEnter:= "Enter:": TEXTCapSpecify:= "Specify:": TEXTCapTrueFalse:= "True or False?": TEXTCapCalculator:= "Calculator": TEXTCapPlot:= "Plot": TEXTCapLegend:= "Legend": TEXTCapEvaluate:= "Evaluate:": TEXTCapDataTable:= "Data Table": TEXTCapVis:= "Visualization": TEXTCapAnim:= "Animation": TEXTCapPreviewer:= "Previewer": TEXTCapHorRng:= "Horizontal Range:": TEXTxmin:= "xmin =": TEXTxmax:= "xmax =": TEXTCapVertRng:= "Vertical Range:": TEXTymin:= "ymin =": TEXTymax:= "ymax =": TEXTPlotWait:= #Use ColorHint " Please be patient while the plot is generated.": TEXTAnimWait:= " Please be patient while the animation is generated.": TEXTRotatePlot:= " You may rotate the plot with your mouse.": TEXTreplyNoCheck:= " You must enter an expression to be checked.": TEXTreplyNoCheckBoth:= " You must answer both questions before checking.": TEXTreplyNoChecks:= " You must answer all %a questions before checking.": TEXTreplyNoPrev:= " You must enter an expression to be previewed.": TEXTreplyNoSimplify:= " You must enter an expression to be simplified.": TEXTreplyNoFactor:= " You must enter an expression to be factored.": TEXTreplyNoExpand:= " You must enter an expression to be expanded.": TEXTreplyNoNormalize:= " You must enter an expression to be normalized.": TEXTreplyNoModify:= " You must enter an expression to be modified.": TEXTreplyNoPlot:= " Please select a plot.": TEXTreplyNoSelection:= " Please select an answer.": TEXTreplyNoSaveProblem:= " You must fill in all the boxes before saving the problem.": TEXTreplyNoSaveSettings:= " You must fill in all the boxes before saving the settings.": TEXTreplyNoSlider:= " Set the slider to a number between %a and %a": TEXTreplySideEqWrong:= " The %a side of your equation is wrong.": TEXTreplyBothSideEqWrong:= " Both sides of your equation are wrong.": TEXTreplySideIneqWrong:= " The %a side of your inequality is wrong.": TEXTreplyBothSideIneqWrong:= " Both sides of your inequality are wrong.": TEXTreplyNoConst:= " You forgot to add a constant of integration.": TEXTreplyManyConst:= " Your answer should have only one constant of integration.": TEXTreplyMinusErr:= " You have a minus sign error.": DNEset:= {"", undefined, Undefined, UNDEFINED, divergent, Divergent, DIVERGENT, diverges, Diverges, DIVERGES, dne, DNE, doesnotexist, DoesNotExist}: TEXTM_File:= "File": TEXTM_Fns:= "Functions": TEXTCBMI_polygen:= "Polynomials (Generalized)": TEXTCBMI_exp:= "Exponentials": TEXTCBMI_log:= "Logarithms": TEXTCBMI_trig:= "Trigonometric": TEXTCBMI_invtrig:= "Inverse Trigonometric": TEXTCBMI_hyper:= "Hyperbolic": TEXTCBMI_invhyper:= "Inverse Hyperbolic": TEXTCBMI_simpsubst:= "Allow Simple Substitutions": TEXTM_Rules:= "Rules": TEXTCBMI_prod:= "Product Rule": TEXTCBMI_quot:= "Quotient Rule": TEXTCBMI_power:= "Power Rule": TEXTCBMI_chain:= "Chain Rule": TEXTM_Methods:= "Methods": TEXTCBMI_subst:= "Substitution": TEXTCBMI_parts:= "Integration by Parts": TEXTCBMI_trigpow:= "Trigonometric Powers": TEXTCBMI_trigsubst:= "Trigonometric Substitution": TEXTCBMI_trigident:= "Trigonometric Identity": TEXTCBMI_parfrac:= "Partial Fractions": TEXTCBMI_impfrac:= "Improper Fraction": TEXTRBproper:= "only proper integrals": TEXTRBimproper:= "allow improper integrals": TEXTM_RulesProb:= "Rules per Problem": TEXTreply_manyrules:= " Problems which involve too many rules tend to become rather messy.": TEXTM_MaxTerms:= "Max # Terms": TEXTreply_manyterms:= " Problems with large numbers of terms tend to become rather messy.": TEXTM_TermsPoly:= "Terms in Polynomial": TEXTM_PowerProp:= "Power Properties": TEXTCBMI_neg:= "Allow Negatives": TEXTCBMI_frac:= "Allow Fractions": TEXTreply_largepower:= " Problems with large degree polynomials tend to become rather messy.": TEXTM_Help:= "Help": TEXTmenu_start:= "Getting Started": TEXTmenu_custom:= "Customized Problems": TEXTmenu_manip:= "Manipulating Functions": TEXTmenu_about:= "About this maplet": great:=[ " Bullseye.", " Right on the mark.", " Great.", " That's absolutely right.", " Awesome. You're unstoppable.", " Correct.", " WOW, nailed that one.", " You got it!", " YES! Right on.", " Way to go.", " Don't stop now.", " I knew you could do it!", " Perfect. You're unstoppable.", " Radical Dude.", " Power house.", " Sweet! Keep on Rockin'.", " You rock!", " You got those mad skills.", " Awesome!", " Wowzers! That was great!", " Awesome man!", " Good job! You really know what you are doing.", " You're awesome kid.", " Tearing it up.", " Right on the money.", " High Five!!!!!", " Cool Beans.", " What a nerd!", " You're so money.", " You're a genius.", " You hit the nail on the head.", " Excellent!", " If I had a cookie, I'd give it to you.", " You're a winner.", " That's a winner.", " Whoop! Way to go.", " That's the way, ah ha ah ha, I like it.", " Oh yeah!", " You're the bomb!", " That was fantastic!", " Oh Snap!", NULL ]: nextgeneric:=[ " Keep it up.", " Keep going.", NULL ]: nextprob:=[ " On to the next problem.", " Try another problem.", " You're ready for another problem.", NULL ]: nextquest:=[ " On to the next question.", " Try another question.", " You're ready for another question.", NULL ]: nextpart:=[ " On to the next part.", " Try another part.", " You're ready for another part.", NULL ]: nextstep:=[ " On to the next step.", " Try another step.", " You're ready for another step.", NULL ]: nexteq:=[ " On to the next equation.", " Try another equation.", " Solve another equation.", " You're ready for another equation.", NULL ]: nextfn:=[ " On to the next function.", " Try another function.", " You're ready for another function.", NULL ]: nextlim:=[ " On to the next limit.", " Try another limit.", " Compute another limit.", " You're ready for another limit.", " Find another limit.", NULL ]: nextderiv:=[ " On to the next derivative.", " Try another derivative.", " Compute another derivative.", " You're ready for another derivative.", " Differentiate another function.", NULL ]: nextinteg:=[ " On to the next integral.", " Try another integral.", " Compute another integral.", " You're ready for another integral.", " Integrate another function.", NULL ]: nextdiffeq:=[ " On to the next differential equation.", " Try another differential equation.", " You're ready for another differential equation.", " Analyze another differential equation.", NULL ]: nextseq:=[ " On to the next sequence.", " Try another sequence.", " Find the limit of another sequence.", " You're ready for another sequence.", NULL ]: nextser:=[ " On to the next series.", " Try another series.", " Sum another series.", " You're ready for another series.", NULL ]: almost:=[ " Close.", " Oh so close.", " Close call. ", " Near miss.", " Not quite good enough for government work.", " Ooooh...close.", " Yikes! Really close. You'll get it next time.", " Close, but no cigar.", " Slightly off.", " Off by a hair.", " Almost there.", " Almost got it.", NULL ]: sorry:=[ " Sorry, that's not right.", " Nope, but don't give up.", " Not quite, it's a little off.", " Bummer, thought you would get it this time.", " If you need help, please ask a human.", " I don't know where you went wrong.", " Sorry, killer problem.", " No, but don't blow it off.", " D'oh!", " That's whack.", " Thought you would get it this time.", " Nice try, but your answer is wrong.", " Ask your neighbor for help.", " Brutal kid.", " That won't fly.", " So close and yet so far.", " So, that was just practice.", " A swing and a miss.", " Better luck next time.", " Oops.", " Tilt. Play again.", " I know you can do better.", " Sorry Charlie.", " Tisk, tisk. It's a tough one.", " It takes a lot of wrongs to make a right.", " Even Einstein didn't get everything right.", " Today's not your lucky day.", " Don't quit your day job.", " You're colder than a polar bear's toenail.", op(almost), NULL ]: trygeneric:=[ " Fix your answer and check it again.", " Give it another try.", " Try again.", " Please try again.", NULL ]: tryhint:=[ " Try the hints and answer again.", " Read the hints and try again.", " Study the hints and answer again.", NULL ]: tryhelp:=[ " Try the Help menu and answer again.", " Look at the Help menu and try again.", NULL ]: showgeneric:=[ " OK That's just practice. But try doing it yourself.", " That's fine for practice. Try doing it yourself.", " Think about it and enter an answer yourself.", " Next time, compute an answer yourself.", " So that was practice. Try doing it yourself.", NULL ]: showhint:=[ " Next time, try the hints.", " Read the hints and enter an answer yourself.", NULL ]: showhelp:=[ " Next time, read the Help menu.", " Read the Help and enter an answer yourself.", NULL ]: # ################################## # Procs for all maplets. GetVersion:=proc() local S, S1, S3, S4; options `Copyright 2009-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; uses StringTools; S:=interface(version); S:=map( Trim, Split( S, "," ) ); S1:=Split(S[1], " " ); S3:=Split(S[3], " " ); S4:=Split(S[-1], " " ); sprintf("%s (%s)", S[2],S3[-1]); end proc: # ################################## # # Customize For Each Maplets #with(plots):with(plottools): #with(RandomTools): #alias(e=exp(1)): nextlocal:=[ NULL ]: trylocal:=[ NULL ]: showlocal:=[ NULL ]: nexts1:=[ #Keep what is appropriate. This is for all but the last check. op(nextgeneric), #op(nextprob), #op(nextquest), op(nextpart), op(nextstep), #op(nextlocal), NULL ]: nexts2:=[ #Keep what is appropriate. This is for the last check. op(nextgeneric), op(nextprob), op(nextquest), op(nexteq), #op(nextfn), #op(nextlim), op(nextderiv), #op(nextinteg), #op(nextdiffeq), #op(nextseq), #op(nextser), #op(nextlocal), NULL ]: trys:=[ #Keep what is appropriate. op(trygeneric), op(tryhint), #op(tryhelp), #op(trylocal), NULL ]: shows:=[ #Keep what is appropriate. op(showgeneric), op(showhint), #op(showhelp), #op(showlocal), NULL ]: randgreat:=rand(1..nops(great)): randnext1:=rand(1..nops(nexts1)): randnext2:=rand(1..nops(nexts2)): randalmost:=rand(1..nops(almost)): randsorry:=rand(1..nops(sorry)): randtry:=rand(1..nops(trys)): randshow:=rand(1..nops(shows)): # ################################## # # English Translation Table For RelatedRates TEXTLasstprogrammer:= "Assistant Programmers: Ash Maruyama & Matthew Barry": TEXTtitleMAIN:= "Related Rates": TEXTCap1:= "Step 1 - Differentiate the equation with respect to t.": TEXTCap2:= "Step 2 - Evaluate at the point.": TEXTCap3:= "Step 3 - Solve for the unknown derivative.": TEXTprob1:= "Assume x and y are related by": TEXTCurrently:= "Currently:": TEXTFind:= "Find:": TEXTprob2:= "That is, substitute the current values for x, y, and ": TEXTprob3:= "into the previous equation.": TEXTtooltipddt:= "Type dx/dt and dy/dt for the derivatives.": TEXTreplyHint1:=" When you differentiate the equation remember that x and y are functions of t and type dx/dt and dy/dt for their derivatives.\n Also remember to use the product, power and chain rules. For example,\nthe derivative of x^2*y^3 is 2*x*y^3*dx/dt + x^2*3*y^2*dy/dt.": TEXTreply1a:= " The right hand side of the original equation was the constant, %a. What is the derivative of a constant?": TEXTreply1c:= " You forgot to include a dx/dt or dy/dt in the derivative on the left of your equation. Read the hint and modify your answer.": TEXTreply1d:= " There is something wrong with the derivative on the left of your equation. Read the hint and modify your answer.": TEXTreply2c:= " You must have a %a on the left of your equation even after plugging in numbers. Try again.": TEXTreply2d:= " You made an error plugging numbers into the left side of your equation. Try again.": # ######################################## rand12:=rand(1..2): randm33:=rand(-3..3): randrt:=rand(1..6): vars:=[x,y]: varrts:=[dx/dt,dy/dt]: vardifs:=[dx,dy]: New_Problem:=proc() global rand12, randm33, randrt, vars, varrts, var, varrt, other, otherrt, eqrhs, dpolypr, dpolycompare, dpolyabpr, dpolyabcompare, der; local whichvar, othervar, rt, pta, ptb, poly, poly0y, polyx0, poly00, polyx, polyy, polyxab, polyyab, poly2, dpoly; options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; whichvar:=rand12():othervar:=3-whichvar: var,varrt:=vars[whichvar],varrts[whichvar]; other,otherrt:=vars[othervar],varrts[othervar]; rt:=[-3,-2,2,3,4,6][randrt()]; do pta,ptb:=randm33(),randm33(); poly:=randpoly([x,y], coeffs=rand(-3..3), terms=2, degree=3); poly0y, polyx0, poly00:=eval(poly,x=0), eval(poly,y=0), eval(poly,[x=0,y=0]); polyx, polyy:=diff(poly,x), diff(poly,y); polyxab, polyyab:=eval(polyx,[x=pta,y=ptb]), eval(polyy,[x=pta,y=ptb]); if nops(poly)<2 #too few terms or polyx=0 #independent of x or polyy=0 #independent of y or ( poly0y=0 and polyx0=0 ) #every term has xy as a factor or poly00<>0 #there is a constant term or poly-poly0y-polyx0=0 #there is no cross term or polyxab=0 #der is zero or polyyab=0 #der is undefined then next; end if; break; end do; eqrhs:=eval(poly,[x=pta,y=ptb]); poly2:=eval(poly, [x=x(t),y=y(t)]); dpoly:=diff(poly2,t); dpolycompare:=eval(dpoly, [diff(x(t),t)=dx/dt, x(t)=x, diff(y(t),t)=dy/dt, y(t)=y]); dpolyabcompare:=eval(dpolycompare, [x=pta, y=ptb, vardifs[othervar]=rt*dt]); der:=solve(dpolyabcompare=0,varrt); Set(eqMML=(poly=eqrhs)): Set(TBpta=sprintf(" %a", x=pta)): Set(TBptb=sprintf(" %a", y=ptb)): Set(TBotherrt=sprintf(" %a", otherrt)): Set(TBvarrt=sprintf(" %a", varrt)): Set(otherrtMML=(otherrt=rt)): Set(varrtMML=varrt): Set(TFdeq=""): Set(TFdeqab=""): Set(TFderiv=""): Set(deqck="", deqck(background)=ColorMessage, deqck(foreground)=ColorMessageFrgd): Set(deqabck="", deqabck(background)=ColorMessage, deqabck(foreground)=ColorMessageFrgd): Set(derivck="", derivck(background)=ColorMessage, derivck(foreground)=ColorMessageFrgd): Set(reply="", reply(background)=ColorMessage, reply(foreground)=ColorMessageFrgd): Set(Bdeqck(enabled)=true, Bdeqck(background)=ColorCheckButton); Set(Bdeqsh(enabled)=true, Bdeqsh(background)=ColorShowButton); Set(Bdeqabck(enabled)=false, Bdeqabck(background)=ColorDisable); Set(Bdeqabsh(enabled)=false, Bdeqabsh(background)=ColorDisable); Set(Bderivck(enabled)=false, Bderivck(background)=ColorDisable); Set(Bderivsh(enabled)=false, Bderivsh(background)=ColorDisable); end proc: Check_deq:=proc() global dpolycompare, eqrhs, dx, dy, dt; local user_deq, user_deq2, xp, yp; options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; if Get(TFdeq)="" then Set(reply=TEXTreplyNoCheck, reply(background)=ColorWarning, reply(foreground)=ColorWarningFrgd): return; end if; user_deq:=Get(TFdeq::equation, corrections=true, update=true): user_deq2:=eval(user_deq, [dy=yp*dt, dx=xp*dt]); if rhs(user_deq)<> 0 then Set(deqck=TEXTIncorrect, deqck(background)=ColorIncorrect, deqck(foreground)=ColorIncorrectFrgd): Set(reply=sprintf(TEXTreply1a, eqrhs), reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd): Set(TFdeqab=""): Set(TFderiv=""): Set(deqabck="", deqabck(background)=ColorMessage, deqabck(foreground)=ColorMessageFrgd): Set(derivck="", derivck(background)=ColorMessage, derivck(foreground)=ColorMessageFrgd): Set(Bdeqabck(enabled)=false, Bdeqabck(background)=ColorDisable); Set(Bdeqabsh(enabled)=false, Bdeqabsh(background)=ColorDisable); Set(Bderivck(enabled)=false, Bderivck(background)=ColorDisable); Set(Bderivsh(enabled)=false, Bderivsh(background)=ColorDisable); elif simplify(normal(dpolycompare - lhs(user_deq)))<> 0 then Set(deqck=TEXTIncorrect, deqck(background)=ColorIncorrect, deqck(foreground)=ColorIncorrectFrgd): if not has(user_deq2,xp) or not has(user_deq2,yp) or has(user_deq2,dt) then Set(reply=TEXTreply1c, reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd): else Set(reply=TEXTreply1d, reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd): end if; Set(TFdeqab=""): Set(TFderiv=""): Set(deqabck="", deqabck(background)=ColorMessage, deqabck(foreground)=ColorMessageFrgd): Set(derivck="", derivck(background)=ColorMessage, derivck(foreground)=ColorMessageFrgd): Set(Bdeqabck(enabled)=false, Bdeqabck(background)=ColorDisable); Set(Bdeqabsh(enabled)=false, Bdeqabsh(background)=ColorDisable); Set(Bderivck(enabled)=false, Bderivck(background)=ColorDisable); Set(Bderivsh(enabled)=false, Bderivsh(background)=ColorDisable); else Set(deqck=TEXTCorrect, deqck(background)=ColorCorrect, deqck(foreground)=ColorCorrectFrgd): Set(reply=cat(great[randgreat()], nexts1[randnext1()]), reply(background)=ColorCorrect, reply(foreground)=ColorCorrectFrgd): Set(Bdeqabck(enabled)=true, Bdeqabck(background)=ColorCheckButton); Set(Bdeqabsh(enabled)=true, Bdeqabsh(background)=ColorShow); end if; end proc: Show_deq:=proc() global dpolycompare; options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; Set(TFdeq=(dpolycompare=0)): Set(deqck=TEXTShown, deqck(background)=ColorShow, deqck(foreground)=ColorShowFrgd): Set(reply=shows[randshow()], reply(background)=ColorShow, reply(foreground)=ColorShowFrgd): Set(Bdeqabck(enabled)=true, Bdeqabck(background)=ColorCheckButton); Set(Bdeqabsh(enabled)=true, Bdeqabsh(background)=ColorShow); end proc: Check_deqab:=proc() global dpolyabcompare, eqrhs, dx, dy, dt, varrt; local user_deqab, user_deqab2, xp, yp; options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; if Get(TFdeqab)="" then Set(reply=TEXTreplyNoCheck, reply(background)=ColorWarning, reply(foreground)=ColorWarningFrgd): return; end if; user_deqab:=Get(TFdeqab::equation, corrections=true, update=true): user_deqab2:=eval(user_deqab, [dx=xp*dt, dy=yp*dt]); if rhs(user_deqab)<> 0 then Set(deqabck=TEXTIncorrect, deqabck(background)=ColorIncorrect, deqabck(foreground)=ColorIncorrectFrgd): Set(reply=sprintf(TEXTreply1a, eqrhs), reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd): Set(TFderiv=""): Set(derivck="", derivck(background)=ColorMessage, derivck(foreground)=ColorMessageFrgd): Set(Bderivck(enabled)=false, Bderivck(background)=ColorDisable); Set(Bderivsh(enabled)=false, Bderivsh(background)=ColorDisable); elif simplify(normal(dpolyabcompare - lhs(user_deqab)))<> 0 then Set(deqabck=TEXTIncorrect, deqabck(background)=ColorIncorrect, deqabck(foreground)=ColorIncorrectFrgd): if not has(user_deqab2,xp) or not has(user_deqab2,yp) or has(user_deqab2,dt) then Set(reply=sprintf(TEXTreply2c, varrt), reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd): else Set(reply=TEXTreply2d, reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd): end if; Set(TFderiv=""): Set(derivck="", derivck(background)=ColorMessage, derivck(foreground)=ColorMessageFrgd): Set(Bderivck(enabled)=false, Bderivck(background)=ColorDisable); Set(Bderivsh(enabled)=false, Bderivsh(background)=ColorDisable); else Set(deqabck=TEXTCorrect, deqabck(background)=ColorCorrect, deqabck(foreground)=ColorCorrectFrgd): Set(reply=cat(great[randgreat()], nexts1[randnext1()]), reply(background)=ColorCorrect, reply(foreground)=ColorCorrectFrgd): Set(Bderivck(enabled)=true, Bderivck(background)=ColorCheckButton); Set(Bderivsh(enabled)=true, Bderivsh(background)=ColorShow); end if; end proc: Show_deqab:=proc() global dpolyabcompare; options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; Set(TFdeqab=(dpolyabcompare=0)): Set(deqabck=TEXTShown, deqabck(background)=ColorShow, deqabck(foreground)=ColorShowFrgd): Set(reply=shows[randshow()], reply(background)=ColorShow, reply(foreground)=ColorShowFrgd): Set(Bderivck(enabled)=true, Bderivck(background)=ColorCheckButton); Set(Bderivsh(enabled)=true, Bderivsh(background)=ColorShow); end proc: Check_deriv:=proc() global der; local user_deriv; options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; if Get(TFderiv)="" then Set(reply=TEXTreplyNoCheck, reply(background)=ColorWarning, reply(foreground)=ColorWarningFrgd): return; end if; user_deriv:=Get(TFderiv::realcons, corrections=true, update=true): if simplify(normal(der - user_deriv))<> 0 then Set(derivck=TEXTIncorrect, derivck(background)=ColorIncorrect, derivck(foreground)=ColorIncorrectFrgd): Set(reply=cat(sorry[randsorry()], trys[randtry()]), reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd): else Set(derivck=TEXTCorrect, derivck(background)=ColorCorrect, derivck(foreground)=ColorCorrectFrgd): Set(reply=cat(great[randgreat()], nexts2[randnext2()]), reply(background)=ColorCorrect, reply(foreground)=ColorCorrectFrgd): end if; end proc: Show_deriv:=proc() global der; options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; Set(TFderiv=der): Set(derivck=TEXTShown, derivck(background)=ColorShow, derivck(foreground)=ColorShowFrgd): Set(reply=shows[randshow()], reply(background)=ColorShow, reply(foreground)=ColorShowFrgd): end proc: Hint:=proc() options `Copyright 2004-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; Set(reply=TEXTreplyHint1, reply(background)=ColorHint, reply(foreground)=ColorHintFrgd): end proc: Related_Rates:=Maplet(onstartup=RunWindow(MAIN), Window[MAIN]( title=TEXTtitleMAIN, defaultbutton=BHint, BoxColumn( halign=none, background=ColorBkgd, inset=0, spacing=0, BoxRow( background=ColorBkgd, Button[BNew](TEXTBNewProblem, Evaluate(function="New_Problem"), background=ColorNewButton), HorizontalGlue(), Button[BHint](TEXTBHintSyntax, Evaluate(function="Hint"), background=ColorHintButton), Button(TEXTBQuit, Shutdown(), background=ColorCloseButton) ), BoxColumn( halign=none, background=ColorBkgd, inset=0, border=true, caption=TEXTCapProbStat, [ background=ColorBkgd, TEXTprob1, MathMLViewer[eqMML](value=MathML[Export](""), width=250, height=50) ], [ background=ColorBkgd, TEXTCurrently, TextField[TBpta](width=6, editable=false, background=ColorMessage), ", ", TextField[TBptb](width=6, editable=false, background=ColorMessage), TEXTand, MathMLViewer[otherrtMML](value=MathML[Export](""), width=100, height=50), ".", HorizontalGlue(), TEXTFind, MathMLViewer[varrtMML](value=MathML[Export](""), width=57, height=50) ] ), BoxRow(background=ColorBkgd, border=true, caption=TEXTCap1, TextBox[TFdeq](width=40, height=1, background=ColorInput, tooltip=TEXTtooltipddt), HorizontalGlue(), Button[Bdeqck](TEXTBCheck, Evaluate(function="Check_deq"), enabled=false, background=ColorDisable), TextField[deqck](width=6, editable=false, background=ColorMessage), Button[Bdeqsh](TEXTBShow, Evaluate(function="Show_deq"), enabled=false, background=ColorDisable) ), BoxColumn( halign=none, background=ColorBkgd, border=true, caption=TEXTCap2, [ background=ColorBkgd, inset=0, TEXTprob2, TextField[TBotherrt](width=4, editable=false, background=ColorMessage), TEXTprob3, HorizontalGlue() ], [ background=ColorBkgd, inset=0, TextBox[TFdeqab](width=40, height=1, background=ColorInput, tooltip=TEXTtooltipddt), HorizontalGlue(), Button[Bdeqabck](TEXTBCheck, Evaluate(function="Check_deqab"), enabled=false, background=ColorDisable), TextField[deqabck](width=6, editable=false, background=white), Button[Bdeqabsh](TEXTBShow, Evaluate(function="Show_deqab"), enabled=false, background=ColorDisable) ] ), BoxRow(background=ColorBkgd, border=true, caption=TEXTCap3, TextField[TBvarrt](width=4, editable=false, background=ColorMessage), " = ", TextBox[TFderiv](width=31, height=1, background=ColorInput), HorizontalGlue(), Button[Bderivck](TEXTBCheck, Evaluate(function="Check_deriv"), enabled=false, background=ColorDisable), TextField[derivck](width=6, editable=false, background=ColorMessage), Button[Bderivsh](TEXTBShow, Evaluate(function="Show_deriv"), enabled=false, background=ColorDisable) ), BoxRow( background=ColorBkgd, TextBox[reply](width=72, height=4, editable=false, background=ColorMessage), Label(Image(Logo)), Label(Image(LIBLogo)) ), BoxColumn( halign=none, background=ColorFooter, inset=0, spacing=0, [ background=ColorFooter, inset=0, spacing=0, Label(TEXTLprogrammers, font=FontFooter), HorizontalGlue(), Label(TEXTLcopyright, font=FontFooter), HorizontalGlue(), Label(TEXTLversion, font=FontFooter) ], [ background=ColorFooter, inset=0, spacing=0, Label(TEXTLasstprogrammer, font=FontFooter), HorizontalGlue(), Label(GetVersion(), font=FontFooter) ] ) ))): Maplets[Display]( Related_Rates );