# Some time difficulty in a Manipulate program inside a DynamicModule

This work began at Set PlotLabel length.

slopeExplorer[fn_, {x_, xmin_, xmax_}, {y_, ymin_, ymax_}] :=
DynamicModule[{f, pta, ptb},
f[t_] = fn /. x -> t;
Manipulate[
pta = {a, f[a]};
ptb = {a, f'[a]};
Show[
Plot[{Tooltip[f[x]], Tooltip[f[a] + f'[a] (x - a)]}, {x, xmin,
xmax},
PlotStyle -> {Directive[Blue], Directive[Orange]},
PlotRange -> {ymin, ymax},
PlotLabel ->
Pane["Slope of tangent line = " <>
ToString[PaddedForm[N[f'[a]], {6, 2}]] <> "\n", 200]],
Plot[Tooltip[f'[x]], {x, xmin - 0.01, a},
PlotRange -> All,
PlotStyle -> Directive[Red, Dashed]],
Graphics[{
Gray, Line[{pta, ptb}],
Red, PointSize[Medium], Tooltip[Point[pta], pta],
Blue, Tooltip[Point[ptb], ptb]
}]
], {{a, xmin, "x"}, xmin, xmax, Appearance -> "Labeled"}
]
]


The following example seems to work perfectly.

slopeExplorer[2 x^3 - 3 x^2 - 36 x, {x, -5, 6}, {y, -150, 150}]


Moving the slider back and forth works smoothly. No hesitations.

Same thing with this example:

slopeExplorer[6/(1 + x^2), {x, -5, 5}, {y, -10, 10}]


No problems.

However, this example experiences difficulty:

slopeExplorer[(3 + x)/(1 - 3 x), {x, -5, 3}, {y, -10, 10}]


All is well and smooth and the slider moves to the right, but when I get near the vertical asymptote at $x=1/3$, problems start.

1. Slider seems to lock up.
2. A small spinning colored wheel starts up, then disappears.
3. The cell bracket goes black for a moment.

Then all stops and I can select slider, but it starts up again.

Might have something to do with something happening at the vertical asymptote, or it just might ben my limited understanding of avoiding this type of difficulty in Manipulate procedures.

Any thoughts?

• @Nasser This began with Continuation of a Problem with Manipulate. I am writing notebooks with not just one Manipulate program, but several, and I must protect them from the global variables and what happens in other Manipulate programs in the same notebook. You can see examples of what I experienced in the link. During that discussion I was mostly concerned about what would be the simplest way for students to handle this problem who are brand new to Mathematica. Jan 4, 2016 at 2:07
• Is there a particular reason why you want to use Manipulate and not just create a single DynamicModule (devoid of Manipulate)? Jan 4, 2016 at 2:26
• @MikeHoneychurch I do not understand dynamic very well. I've been working strictly with Manipulate. Maybe when summer vacation comes, I'll have time to learn more. Also, working with students who are just starting with Mathematica requires that I keep things pretty simple. Even my Manipulate program in this example has some difficult stuff in it. Jan 4, 2016 at 2:52
• I was mostly concerned about what would be the simplest way for students to handle this problem who are brand new to Mathematica. I think you should stick to Manipulate only. This is much simpler for students who are new to Mathematica, rather than start with DynamicModule. Manipulate simplifies many things and it is a simple framework to start with. I've had a course in physics, where many students never used M before, and many struggled just with basic plotting and such. I can't imagine having to start with DynamicModule and Manipulate inside it on top of that. Jan 4, 2016 at 4:44

The problem is mostly due to the PlotRange -> All in the second Plot. Also added use of Exclusions

slopeExplorer[fn_, {x_, xmin_, xmax_}, {y_, ymin_, ymax_}] :=
DynamicModule[{f, fp, pta, ptb, poles},
f[t_] = fn /. x -> t;
fp[t_] = f'[t] // Simplify;
poles = t /. Solve[Denominator[f[t]] == 0, t, Reals];
If[Length[poles] > 0, Print[StringForm["pole at ", Thread[x == poles]]]];
Manipulate[
pta = {a, f[a]};
ptb = {a, fp[a]};
Show[
Plot[{
Tooltip[f[x]],
Tooltip[f[a] + fp[a] (x - a)]},
{x, xmin, xmax},
PlotStyle -> {Blue, Orange},
PlotRange -> {ymin, ymax},
PlotLabel ->
Pane["Slope of tangent line = " <>
ToString[PaddedForm[N[fp[a]], {6, 2}]] <> "\n", 200],
Exclusions -> poles],
Plot[Tooltip[fp[x]], {x, xmin, a + 2 $MachineEpsilon}, PlotRange -> {ymin, ymax}, PlotStyle -> Directive[Red, Dashed], Exclusions -> poles], Graphics[{ Gray, Line[{pta, ptb}], Red, PointSize[Medium], Tooltip[Point[pta], pta], Blue, Tooltip[Point[ptb], ptb]}]], {{a, xmin, "x"}, xmin, xmax, Appearance -> "Labeled"}]] slopeExplorer[(3 + x)/((1 - 3 x) (x - 2)), {x, -5, 3}, {y, -10, 10}]  • Absolutely wonderful fix. I like this as well:  fp[t_] = f'[t] // Simplify; Great work. Jan 4, 2016 at 5:15 • I have a question regarding: StringForm["pole at ", Thread[x == poles]]. What do the double single apostrophes do? Is there someplace in the Documentation I can look at examples of this? Jan 4, 2016 at 5:32 • @David - just look at the documentation for StringForm Jan 4, 2016 at 5:36 • This one causes a bit of a problem: slopeExplorer[Sqrt[3 x - 1], {x, 1/3, 5}, {y, -1, 5}]. Jan 4, 2016 at 5:48 • Without the a+2$MachineEpsilon the plot domain {x, min, a} would be a zero interval when a equals xmin. The a+2\$MachineEpsilon avoids the associated issues. I believe that it it is fine to let the removable singularity (zero with corresponding pole that explicitly cancel) be handled by Simplify. Jan 4, 2016 at 20:40